Commit f13f80f0 authored by Michael Natterer's avatar Michael Natterer 😴 Committed by Michael Natterer

added "position" and "push_undo" parameters to gimp_image_add_[vh]guide().

2003-03-28  Michael Natterer  <mitch@gimp.org>

	* app/core/gimpimage-guides.[ch]: added "position" and "push_undo"
	parameters to gimp_image_add_[vh]guide(). Start with a refcount
	of 1, not 0 (EEK). Added gimp_image_guide_[un]ref(). Added
	"position" parameter to gimp_image_add_guide(). Added new
	function gimp_image_move_guide(). All functions push guide
	undos correctly and call gimp_image_update_guide() so this
	doesn't need to be done by callers.

	* app/core/gimpimage-crop.c
	* app/core/gimpimage-duplicate.c
	* app/core/gimpimage-resize.c
	* app/core/gimpimage-undo-push.c
	* app/core/gimpimage.c
	* app/tools/gimpmeasuretool.c
	* app/xcf/xcf-load.c
	* tools/pdbgen/pdb/guides.pdb: greatly simplyfied all places which
	modify guides: don't fiddle with undo and guide properties
	manually but simply use the API provided.

	* app/tools/gimpmovetool.[ch]: ditto. Changed everything to
	create/move the guide on button_release, not button_press. Enable
	canceling the operation by clicking button3 before releasing
	button1. Keep the guide drawn at its old position until the move
	is finished (fixes bug #75349 and bug #109267).

	* app/pdb/guides_cmds.c: regenerated.
parent 392bbd69
2003-03-28 Michael Natterer <mitch@gimp.org>
* app/core/gimpimage-guides.[ch]: added "position" and "push_undo"
parameters to gimp_image_add_[vh]guide(). Start with a refcount
of 1, not 0 (EEK). Added gimp_image_guide_[un]ref(). Added
"position" parameter to gimp_image_add_guide(). Added new
function gimp_image_move_guide(). All functions push guide
undos correctly and call gimp_image_update_guide() so this
doesn't need to be done by callers.
* app/core/gimpimage-crop.c
* app/core/gimpimage-duplicate.c
* app/core/gimpimage-resize.c
* app/core/gimpimage-undo-push.c
* app/core/gimpimage.c
* app/tools/gimpmeasuretool.c
* app/xcf/xcf-load.c
* tools/pdbgen/pdb/guides.pdb: greatly simplyfied all places which
modify guides: don't fiddle with undo and guide properties
manually but simply use the API provided.
* app/tools/gimpmovetool.[ch]: ditto. Changed everything to
create/move the guide on button_release, not button_press. Enable
canceling the operation by clicking button3 before releasing
button1. Keep the guide drawn at its old position until the move
is finished (fixes bug #75349 and bug #109267).
* app/pdb/guides_cmds.c: regenerated.
2003-03-28 Michael Natterer <mitch@gimp.org>
* app/core/gimpimagefile.c (gimp_imagefile_save_thumbnail):
......@@ -31,6 +31,7 @@
#include "gimpdrawable.h"
#include "gimpimage.h"
#include "gimpimage-crop.h"
#include "gimpimage-guides.h"
#include "gimpimage-mask.h"
#include "gimpimage-projection.h"
#include "gimpimage-undo.h"
......@@ -215,20 +216,11 @@ gimp_image_crop (GimpImage *gimage,
if (floating_layer)
floating_sel_rigor (floating_layer, TRUE);
for (list = gimage->guides; list; list = g_list_next (list))
{
GimpGuide *guide;
guide = (GimpGuide *) list->data;
gimp_image_undo_push_image_guide (gimage, NULL, guide);
}
gimp_image_undo_group_end (gimage);
/* Adjust any guides we might have laying about */
gimp_image_crop_adjust_guides (gimage, x1, y1, x2, y2);
}
gimp_image_undo_group_end (gimage);
}
gimp_image_update (gimage,
0, 0,
......@@ -431,15 +423,15 @@ gimp_image_crop_adjust_guides (GimpImage *gimage,
if (remove_guide)
{
guide->position = -1;
gimp_image_remove_guide (gimage, guide, TRUE);
guide = NULL;
}
else
{
if (guide->orientation == GIMP_ORIENTATION_HORIZONTAL)
guide->position -= y1;
gimp_image_move_guide (gimage, guide, guide->position - y1, TRUE);
else
guide->position -= x1;
gimp_image_move_guide (gimage, guide, guide->position - x1, TRUE);
}
}
}
......
......@@ -57,7 +57,6 @@ gimp_image_duplicate (GimpImage *gimage)
GimpLayer *floating_layer;
GimpChannel *channel, *new_channel;
GList *list;
GimpGuide *guide = NULL;
GimpLayer *active_layer = NULL;
GimpChannel *active_channel = NULL;
GimpDrawable *new_floating_sel_drawable = NULL;
......@@ -195,20 +194,16 @@ gimp_image_duplicate (GimpImage *gimage)
/* Copy any Guides */
for (list = gimage->guides; list; list = g_list_next (list))
{
GimpGuide *new_guide;
guide = (GimpGuide *) list->data;
GimpGuide *guide = list->data;
switch (guide->orientation)
{
case GIMP_ORIENTATION_HORIZONTAL:
new_guide = gimp_image_add_hguide (new_gimage);
new_guide->position = guide->position;
gimp_image_add_hguide (new_gimage, guide->position, FALSE);
break;
case GIMP_ORIENTATION_VERTICAL:
new_guide = gimp_image_add_vguide (new_gimage);
new_guide->position = guide->position;
gimp_image_add_vguide (new_gimage, guide->position, FALSE);
break;
default:
......
......@@ -25,6 +25,9 @@
#include "gimp.h"
#include "gimpimage.h"
#include "gimpimage-guides.h"
#include "gimpimage-undo-push.h"
#include "gimp-intl.h"
#define GUIDE_EPSILON 5
......@@ -33,74 +36,142 @@
/* public functions */
GimpGuide *
gimp_image_add_hguide (GimpImage *gimage)
gimp_image_add_hguide (GimpImage *gimage,
gint position,
gboolean push_undo)
{
GimpGuide *guide;
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
g_return_val_if_fail (position >= 0 && position < gimage->height, NULL);
guide = g_new (GimpGuide, 1);
guide = g_new0 (GimpGuide, 1);
guide->ref_count = 0;
guide->ref_count = 1;
guide->position = -1;
guide->guide_ID = gimage->gimp->next_guide_ID++;
guide->orientation = GIMP_ORIENTATION_HORIZONTAL;
guide->guide_ID = gimage->gimp->next_guide_ID++;
gimage->guides = g_list_prepend (gimage->guides, guide);
if (push_undo)
gimp_image_undo_push_image_guide (gimage, _("Add Horizontal Guide"),
guide);
gimp_image_add_guide (gimage, guide, position);
gimp_image_guide_unref (guide);
return guide;
}
GimpGuide *
gimp_image_add_vguide (GimpImage *gimage)
gimp_image_add_vguide (GimpImage *gimage,
gint position,
gboolean push_undo)
{
GimpGuide *guide;
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
g_return_val_if_fail (position >= 0 && position < gimage->width, NULL);
guide = g_new (GimpGuide, 1);
guide = g_new0 (GimpGuide, 1);
guide->ref_count = 0;
guide->ref_count = 1;
guide->position = -1;
guide->guide_ID = gimage->gimp->next_guide_ID++;
guide->orientation = GIMP_ORIENTATION_VERTICAL;
guide->guide_ID = gimage->gimp->next_guide_ID++;
gimage->guides = g_list_prepend (gimage->guides, guide);
if (push_undo)
gimp_image_undo_push_image_guide (gimage, _("Add Vertical Guide"),
guide);
gimp_image_add_guide (gimage, guide, position);
gimp_image_guide_unref (guide);
return guide;
}
GimpGuide *
gimp_image_guide_ref (GimpGuide *guide)
{
g_return_val_if_fail (guide != NULL, NULL);
guide->ref_count++;
return guide;
}
void
gimp_image_guide_unref (GimpGuide *guide)
{
g_return_if_fail (guide != NULL);
guide->ref_count--;
if (guide->ref_count < 1)
g_free (guide);
}
void
gimp_image_add_guide (GimpImage *gimage,
GimpGuide *guide)
GimpGuide *guide,
gint position)
{
g_return_if_fail (GIMP_IS_IMAGE (gimage));
g_return_if_fail (guide != NULL);
g_return_if_fail (position >= 0);
if (guide->orientation == GIMP_ORIENTATION_HORIZONTAL)
g_return_if_fail (position < gimage->height);
else
g_return_if_fail (position < gimage->width);
gimage->guides = g_list_prepend (gimage->guides, guide);
guide->position = position;
gimp_image_guide_ref (guide);
gimp_image_update_guide (gimage, guide);
}
void
gimp_image_remove_guide (GimpImage *gimage,
GimpGuide *guide)
GimpGuide *guide,
gboolean push_undo)
{
g_return_if_fail (GIMP_IS_IMAGE (gimage));
g_return_if_fail (guide != NULL);
gimp_image_update_guide (gimage, guide);
if (push_undo)
gimp_image_undo_push_image_guide (gimage, _("Remove Guide"), guide);
gimage->guides = g_list_remove (gimage->guides, guide);
guide->position = -1;
gimp_image_guide_unref (guide);
}
void
gimp_image_delete_guide (GimpImage *gimage,
GimpGuide *guide)
gimp_image_move_guide (GimpImage *gimage,
GimpGuide *guide,
gint position,
gboolean push_undo)
{
guide->position = -1;
g_return_if_fail (GIMP_IS_IMAGE (gimage));
g_return_if_fail (guide != NULL);
g_return_if_fail (position >= 0);
if (guide->ref_count <= 0)
{
gimage->guides = g_list_remove (gimage->guides, guide);
g_free (guide);
}
if (guide->orientation == GIMP_ORIENTATION_HORIZONTAL)
g_return_if_fail (position < gimage->height);
else
g_return_if_fail (position < gimage->width);
if (push_undo)
gimp_image_undo_push_image_guide (gimage, _("Move Guide"), guide);
gimp_image_update_guide (gimage, guide);
guide->position = position;
gimp_image_update_guide (gimage, guide);
}
GimpGuide *
......@@ -179,6 +250,9 @@ gimp_image_snap_point (GimpImage *gimage,
{
guide = (GimpGuide *) list->data;
if (guide->position < 0)
continue;
switch (guide->orientation)
{
case GIMP_ORIENTATION_HORIZONTAL:
......@@ -233,7 +307,7 @@ gimp_image_snap_rectangle (GimpImage *gimage,
snap1 = gimp_image_snap_point (gimage, x1, y1, &nx1, &ny1);
snap2 = gimp_image_snap_point (gimage, x2, y2, &nx2, &ny2);
if (snap1 || snap2)
{
if (x1 != nx1)
......
......@@ -20,16 +20,26 @@
#define __GIMP_IMAGE_GUIDES_H__
GimpGuide * gimp_image_add_hguide (GimpImage *gimage);
GimpGuide * gimp_image_add_vguide (GimpImage *gimage);
GimpGuide * gimp_image_add_hguide (GimpImage *gimage,
gint position,
gboolean push_undo);
GimpGuide * gimp_image_add_vguide (GimpImage *gimage,
gint position,
gboolean push_undo);
GimpGuide * gimp_image_guide_ref (GimpGuide *guide);
void gimp_image_guide_unref (GimpGuide *guide);
void gimp_image_add_guide (GimpImage *gimage,
GimpGuide *guide);
GimpGuide *guide,
gint position);
void gimp_image_remove_guide (GimpImage *gimage,
GimpGuide *guide);
void gimp_image_delete_guide (GimpImage *gimage,
GimpGuide *guide);
GimpGuide *guide,
gboolean push_undo);
void gimp_image_move_guide (GimpImage *gimage,
GimpGuide *guide,
gint position,
gboolean push_undo);
GimpGuide * gimp_image_find_guide (GimpImage *gimage,
gdouble x,
......
......@@ -88,6 +88,7 @@ gimp_image_resize (GimpImage *gimage,
while (guide_list)
{
GimpGuide *guide;
gint new_position;
guide = (GimpGuide *) guide_list->data;
guide_list = g_list_next (guide_list);
......@@ -95,17 +96,21 @@ gimp_image_resize (GimpImage *gimage,
switch (guide->orientation)
{
case GIMP_ORIENTATION_HORIZONTAL:
gimp_image_undo_push_image_guide (gimage, NULL, guide);
guide->position += offset_y;
new_position = guide->position + offset_y;
if (guide->position < 0 || guide->position > new_height)
gimp_image_delete_guide (gimage, guide);
gimp_image_remove_guide (gimage, guide, TRUE);
else
gimp_image_move_guide (gimage, guide, new_position, TRUE);
break;
case GIMP_ORIENTATION_VERTICAL:
gimp_image_undo_push_image_guide (gimage, NULL, guide);
guide->position += offset_x;
new_position = guide->position + offset_x;
if (guide->position < 0 || guide->position > new_width)
gimp_image_delete_guide (gimage, guide);
gimp_image_remove_guide (gimage, guide, TRUE);
else
gimp_image_move_guide (gimage, guide, new_position, TRUE);
break;
default:
......
......@@ -630,7 +630,7 @@ typedef struct _GuideUndo GuideUndo;
struct _GuideUndo
{
GimpGuide *guide;
GimpGuide orig;
gint position;
};
static gboolean undo_pop_image_guide (GimpUndo *undo,
......@@ -661,10 +661,8 @@ gimp_image_undo_push_image_guide (GimpImage *gimage,
gu = new->data;
guide->ref_count++;
gu->guide = guide;
gu->orig = *guide;
gu->guide = gimp_image_guide_ref (guide);
gu->position = guide->position;
return TRUE;
}
......@@ -678,22 +676,20 @@ undo_pop_image_guide (GimpUndo *undo,
GimpUndoAccumulator *accum)
{
GuideUndo *gu;
GimpGuide tmp_guide;
gint tmp_ref;
gint old_position;
gu = (GuideUndo *) undo->data;
gimp_image_update_guide (undo->gimage, gu->guide);
tmp_ref = gu->guide->ref_count;
tmp_guide = *(gu->guide);
*(gu->guide) = gu->orig;
old_position = gu->guide->position;
gu->guide->ref_count = tmp_ref;
gu->orig = tmp_guide;
if (gu->guide->position == -1)
gimp_image_add_guide (undo->gimage, gu->guide, gu->position);
else if (gu->position == -1)
gimp_image_remove_guide (undo->gimage, gu->guide, FALSE);
else
gimp_image_move_guide (undo->gimage, gu->guide, gu->position, FALSE);
gimp_image_update_guide (undo->gimage, gu->guide);
gu->position = old_position;
return TRUE;
}
......@@ -706,12 +702,7 @@ undo_free_image_guide (GimpUndo *undo,
gu = (GuideUndo *) undo->data;
gu->guide->ref_count--;
if (gu->guide->position < 0 && gu->guide->ref_count <= 0)
{
gimp_image_remove_guide (undo->gimage, gu->guide);
g_free (gu->guide);
}
gimp_image_guide_unref (gu->guide);
g_free (gu);
}
......
......@@ -42,6 +42,7 @@
#include "gimpimage.h"
#include "gimpimage-colorhash.h"
#include "gimpimage-colormap.h"
#include "gimpimage-guides.h"
#include "gimpimage-mask.h"
#include "gimpimage-preview.h"
#include "gimpimage-projection.h"
......@@ -568,7 +569,7 @@ gimp_image_finalize (GObject *object)
if (gimage->guides)
{
g_list_foreach (gimage->guides, (GFunc) g_free, NULL);
g_list_foreach (gimage->guides, (GFunc) gimp_image_guide_unref, NULL);
g_list_free (gimage->guides);
gimage->guides = NULL;
}
......
......@@ -75,9 +75,7 @@ image_add_hguide_invoker (Gimp *gimp,
{
if (offset < gimage->height)
{
guide = gimp_image_add_hguide (gimage);
gimp_image_undo_push_image_guide (gimage, _("Add Horizontal Guide"), guide);
guide->position = offset;
guide = gimp_image_add_hguide (gimage, offset, TRUE);
guide_ID = guide->guide_ID;
}
else
......@@ -154,9 +152,7 @@ image_add_vguide_invoker (Gimp *gimp,
{
if (offset < gimage->width)
{
guide = gimp_image_add_vguide (gimage);
gimp_image_undo_push_image_guide (gimage, _("Add Vertical Guide"), guide);
guide->position = offset;
guide = gimp_image_add_vguide (gimage, offset, TRUE);
guide_ID = guide->guide_ID;
}
else
......@@ -235,9 +231,7 @@ image_delete_guide_invoker (Gimp *gimp,
if ((g->guide_ID == guide) && (g->position >= 0))
{
gimp_image_undo_push_image_guide (gimage, _("Remove Guide"), g);
gimp_image_delete_guide (gimage, g);
gimp_image_remove_guide (gimage, g, TRUE);
success = TRUE;
break;
}
......
......@@ -263,9 +263,9 @@ gimp_measure_tool_button_press (GimpTool *tool,
{
if (state & (GDK_CONTROL_MASK | GDK_MOD1_MASK))
{
GimpGuide *guide;
gboolean create_hguide;
gboolean create_vguide;
GimpGuide *guide;
create_hguide = ((state & GDK_CONTROL_MASK) &&
(measure_tool->y[i] ==
......@@ -286,23 +286,17 @@ gimp_measure_tool_button_press (GimpTool *tool,
if (create_hguide)
{
guide = gimp_image_add_hguide (gdisp->gimage);
gimp_image_undo_push_image_guide (gdisp->gimage,
_("Add Horizontal Guide"),
guide);
guide->position = measure_tool->y[i];
guide = gimp_image_add_hguide (gdisp->gimage,
measure_tool->y[i],
TRUE);
gimp_image_update_guide (gdisp->gimage, guide);
}
if (create_vguide)
{
guide = gimp_image_add_vguide (gdisp->gimage);
gimp_image_undo_push_image_guide (gdisp->gimage,
_("Add Vertical Guide"),
guide);
guide->position = measure_tool->x[i];
guide = gimp_image_add_vguide (gdisp->gimage,
measure_tool->x[i],
TRUE);
gimp_image_update_guide (gdisp->gimage, guide);
}
......
......@@ -166,9 +166,13 @@ gimp_move_tool_init (GimpMoveTool *move_tool)
tool = GIMP_TOOL (move_tool);
move_tool->layer = NULL;
move_tool->guide = NULL;
move_tool->disp = NULL;
move_tool->layer = NULL;
move_tool->guide = NULL;
move_tool->guide_disp = NULL;
move_tool->moving_guide = FALSE;
move_tool->guide_position = -1;
move_tool->guide_orientation = GIMP_ORIENTATION_UNKNOWN;
gimp_tool_control_set_snap_to (tool->control, FALSE);
gimp_tool_control_set_handles_empty_image (tool->control, TRUE);
......@@ -228,9 +232,10 @@ gimp_move_tool_button_press (GimpTool *tool,
tool->gdisp = gdisp;
move->layer = NULL;
move->guide = NULL;
move->disp = NULL;
move->layer = NULL;
move->guide = NULL;
move->guide_disp = NULL;
move->moving_guide = FALSE;
if (options->move_mask && ! gimp_image_mask_is_empty (gdisp->gimage))
{
......@@ -247,17 +252,12 @@ gimp_move_tool_button_press (GimpTool *tool,
if (gimp_display_shell_get_show_guides (shell) &&
(guide = gimp_image_find_guide (gdisp->gimage, coords->x, coords->y)))
{
gimp_image_undo_push_image_guide (gdisp->gimage,
_("Guide"),
guide);
gimp_image_update_guide (gdisp->gimage, guide);
gimp_image_remove_guide (gdisp->gimage, guide);
gimp_display_flush (gdisp);
gimp_image_add_guide (gdisp->gimage, guide);
move->guide = guide;
move->guide_disp = gdisp;
move->guide = guide;
move->disp = gdisp;
move->moving_guide = TRUE;
move->guide_position = guide->position;
move->guide_orientation = guide->orientation;
gimp_tool_control_set_scroll_lock (tool->control, TRUE);
gimp_tool_control_activate (tool->control);
......@@ -306,25 +306,29 @@ gimp_move_tool_button_release (GimpTool *tool,
{
GimpMoveTool *move;
GimpDisplayShell *shell;
gboolean delete_guide;
gint x1, y1;
gint x2, y2;
move = GIMP_MOVE_TOOL (tool);
move = GIMP_MOVE_TOOL (tool);
shell = GIMP_DISPLAY_SHELL (gdisp->shell);
gimp_tool_control_halt (tool->control);
if (move->guide)
if (move->moving_guide)
{
GimpDisplayShell *shell;
shell = GIMP_DISPLAY_SHELL (tool->gdisp->shell);
gboolean delete_guide = FALSE;
gint x1, y1;
gint x2, y2;
gimp_tool_control_set_scroll_lock (tool->control, FALSE);
gimp_draw_tool_stop (GIMP_DRAW_TOOL (tool));
if (state & GDK_BUTTON3_MASK)
{
move->moving_guide = FALSE;
move->guide_position = -1;
move->guide_orientation = GIMP_ORIENTATION_UNKNOWN;
delete_guide = FALSE;
return;
}
gimp_display_shell_untransform_xy (shell,
0, 0,
......@@ -340,15 +344,15 @@ gimp_move_tool_button_release (GimpTool *tool,
if (x2 > gdisp->gimage->width) x2 = gdisp->gimage->width;
if (y2 > gdisp->gimage->height) y2 = gdisp->gimage->height;
switch (move->guide->orientation)
switch (move->guide_orientation)
{
case GIMP_ORIENTATION_HORIZONTAL:
if ((move->guide->position < y1) || (move->guide->position > y2))
if ((move->guide_position < y1) || (move->guide_position > y2))
delete_guide = TRUE;
break;
case GIMP_ORIENTATION_VERTICAL:
if ((move->guide->position < x1) || (move->guide->position > x2))
if ((move->guide_position < x1) || (move->guide_position > x2))
delete_guide = TRUE;
break;
......@@ -356,22 +360,55 @@ gimp_move_tool_button_release (GimpTool *tool,
break;
}
gimp_image_update_guide (gdisp->gimage, move->guide);
gimp_draw_tool_stop (GIMP_DRAW_TOOL (tool));
if (delete_guide)
{
gimp_image_delete_guide (gdisp->gimage, move->guide);
move->guide = NULL;
move->disp = NULL;
if (move->guide)
{
gimp_image_remove_guide (gdisp->gimage, move->guide, TRUE);
move->guide = NULL;
move->guide_disp = NULL;
}
}
else
{
if (move->guide)
{
gimp_image_move_guide (gdisp->gimage, move->guide,
move->guide_position, TRUE);
}
else
{
switch (move->guide_orientation)
{
case GIMP_ORIENTATION_HORIZONTAL:
move->guide = gimp_image_add_hguide (gdisp->gimage,
move->guide_position,
TRUE);
break;
case GIMP_ORIENTATION_VERTICAL:
move->guide = gimp_image_add_vguide (gdisp->gimage,
move->guide_position,
TRUE);
break;
default:
g_assert_not_reached ();
}
move->guide_disp = gdisp;
}
}
gimp_display_shell_selection_visibility (shell, GIMP_SELECTION_RESUME);
gimp_image_flush (gdisp->gimage);
if (move->guide)
gimp_display_shell_draw_guide (shell, move->guide, TRUE);
move->moving_guide = FALSE;
move->guide_position = -1;
move->guide_orientation = GIMP_ORIENTATION_UNKNOWN;
}
else
{
......@@ -395,16 +432,15 @@ gimp_move_tool_motion (GimpTool *tool,
GimpDisplay *gdisp)
{
GimpMoveTool *move;
GimpMoveTool *move;
GimpDisplayShell *shell;
move = GIMP_MOVE_TOOL (tool);
move = GIMP_MOVE_TOOL (tool);
shell = GIMP_DISPLAY_SHELL (gdisp->shell);
if (move->guide)
if (move->moving_guide)
{
GimpDisplayShell *shell;
gint tx, ty;
shell = GIMP_DISPLAY_SHELL (gdisp->shell);
gint tx, ty;
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
......@@ -413,19 +449,17 @@ gimp_move_tool_motion (GimpTool *tool,
&tx, &ty,
FALSE);