[gimp] app: implement undo in the warp tool, no redo yet
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: implement undo in the warp tool, no redo yet
- Date: Wed, 22 May 2013 21:03:10 +0000 (UTC)
commit 2a93677b0c3e57763d589b67950c6bbe5dca5f61
Author: Michael Natterer <mitch gimp org>
Date: Wed May 22 23:01:51 2013 +0200
app: implement undo in the warp tool, no redo yet
app/tools/gimpwarptool.c | 153 +++++++++++++++++++++++++++++++---------------
1 files changed, 104 insertions(+), 49 deletions(-)
---
diff --git a/app/tools/gimpwarptool.c b/app/tools/gimpwarptool.c
index 6878510..4a54e40 100644
--- a/app/tools/gimpwarptool.c
+++ b/app/tools/gimpwarptool.c
@@ -81,6 +81,14 @@ static void gimp_warp_tool_cursor_update (GimpTool *tool
const GimpCoords *coords,
GdkModifierType state,
GimpDisplay *display);
+const gchar * gimp_warp_tool_get_undo_desc (GimpTool *tool,
+ GimpDisplay *display);
+const gchar * gimp_warp_tool_get_redo_desc (GimpTool *tool,
+ GimpDisplay *display);
+gboolean gimp_warp_tool_undo (GimpTool *tool,
+ GimpDisplay *display);
+gboolean gimp_warp_tool_redo (GimpTool *tool,
+ GimpDisplay *display);
static void gimp_warp_tool_draw (GimpDrawTool *draw_tool);
@@ -99,7 +107,6 @@ static void gimp_warp_tool_stroke_changed (GeglPath *stro
static void gimp_warp_tool_image_map_flush (GimpImageMap *image_map,
GimpTool *tool);
static void gimp_warp_tool_add_op (GimpWarpTool *wt);
-static void gimp_warp_tool_undo (GimpWarpTool *wt);
G_DEFINE_TYPE (GimpWarpTool, gimp_warp_tool, GIMP_TYPE_DRAW_TOOL)
@@ -137,6 +144,10 @@ gimp_warp_tool_class_init (GimpWarpToolClass *klass)
tool_class->key_press = gimp_warp_tool_key_press;
tool_class->oper_update = gimp_warp_tool_oper_update;
tool_class->cursor_update = gimp_warp_tool_cursor_update;
+ tool_class->get_undo_desc = gimp_warp_tool_get_undo_desc;
+ tool_class->get_redo_desc = gimp_warp_tool_get_redo_desc;
+ tool_class->undo = gimp_warp_tool_undo;
+ tool_class->redo = gimp_warp_tool_redo;
draw_tool_class->draw = gimp_warp_tool_draw;
}
@@ -245,7 +256,7 @@ gimp_warp_tool_button_release (GimpTool *tool,
if (release_type == GIMP_BUTTON_RELEASE_CANCEL)
{
- gimp_warp_tool_undo (wt);
+ gimp_warp_tool_undo (tool, display);
}
gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
@@ -357,6 +368,95 @@ gimp_warp_tool_cursor_update (GimpTool *tool,
GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, display);
}
+const gchar *
+gimp_warp_tool_get_undo_desc (GimpTool *tool,
+ GimpDisplay *display)
+{
+ GimpWarpTool *wt = GIMP_WARP_TOOL (tool);
+ GeglNode *to_delete;
+ const gchar *type;
+
+ if (! wt->render_node)
+ return NULL;
+
+ to_delete = gegl_node_get_producer (wt->render_node, "aux", NULL);
+ type = gegl_node_get_operation (to_delete);
+
+ if (strcmp (type, "gegl:warp"))
+ return NULL;
+
+ return _("Warp Tool Stroke");
+}
+
+const gchar *
+gimp_warp_tool_get_redo_desc (GimpTool *tool,
+ GimpDisplay *display)
+{
+ return NULL;
+}
+
+gboolean
+gimp_warp_tool_undo (GimpTool *tool,
+ GimpDisplay *display)
+{
+ GimpWarpTool *wt = GIMP_WARP_TOOL (tool);
+ GeglNode *to_delete;
+ GeglNode *previous;
+ const gchar *type;
+ GeglPath *stroke;
+ gdouble min_x;
+ gdouble max_x;
+ gdouble min_y;
+ gdouble max_y;
+ gdouble size;
+ GeglRectangle bbox;
+
+ if (! wt->render_node)
+ return FALSE;
+
+ to_delete = gegl_node_get_producer (wt->render_node, "aux", NULL);
+ type = gegl_node_get_operation (to_delete);
+
+ if (strcmp (type, "gegl:warp"))
+ return FALSE;
+
+ previous = gegl_node_get_producer (to_delete, "input", NULL);
+
+ gegl_node_disconnect (to_delete, "input");
+ gegl_node_connect_to (previous, "output",
+ wt->render_node, "aux");
+
+ gegl_node_get (to_delete,
+ "stroke", &stroke,
+ "size", &size,
+ NULL);
+
+ if (stroke)
+ {
+ gegl_path_get_bounds (stroke, &min_x, &max_x, &min_y, &max_y);
+ g_object_unref (stroke);
+
+ bbox.x = min_x - size * 0.5;
+ bbox.y = min_y - size * 0.5;
+ bbox.width = max_x - min_x + size;
+ bbox.height = max_y - min_y + size;
+
+ gimp_image_map_abort (wt->image_map);
+ gimp_image_map_apply (wt->image_map, &bbox);
+ }
+
+ gegl_node_remove_child (wt->graph, to_delete);
+
+ return TRUE;
+}
+
+gboolean
+gimp_warp_tool_redo (GimpTool *tool,
+ GimpDisplay *display)
+{
+ return FALSE;
+}
+
static void
gimp_warp_tool_draw (GimpDrawTool *draw_tool)
{
@@ -575,52 +675,7 @@ gimp_warp_tool_add_op (GimpWarpTool *wt)
new_op, "input");
gegl_node_connect_to (new_op, "output",
wt->render_node, "aux");
-}
-
-static void
-gimp_warp_tool_undo (GimpWarpTool *wt)
-{
- GeglNode *to_delete;
- GeglNode *previous;
- const gchar *type;
- GeglPath *stroke;
- gdouble min_x;
- gdouble max_x;
- gdouble min_y;
- gdouble max_y;
- gdouble size;
- GeglRectangle bbox;
- to_delete = gegl_node_get_producer (wt->render_node, "aux", NULL);
- type = gegl_node_get_operation (to_delete);
-
- if (strcmp (type, "gegl:warp"))
- return;
-
- previous = gegl_node_get_producer (to_delete, "input", NULL);
-
- gegl_node_disconnect (to_delete, "input");
- gegl_node_connect_to (previous, "output",
- wt->render_node, "aux");
-
- gegl_node_get (to_delete,
- "stroke", &stroke,
- "size", &size,
- NULL);
-
- if (stroke)
- {
- gegl_path_get_bounds (stroke, &min_x, &max_x, &min_y, &max_y);
- g_object_unref (stroke);
-
- bbox.x = min_x - size * 0.5;
- bbox.y = min_y - size * 0.5;
- bbox.width = max_x - min_x + size;
- bbox.height = max_y - min_y + size;
-
- gimp_image_map_abort (wt->image_map);
- gimp_image_map_apply (wt->image_map, &bbox);
- }
-
- gegl_node_remove_child (wt->graph, to_delete);
+ /* update the undo actions / menu items */
+ gimp_image_flush (gimp_display_get_image (GIMP_TOOL (wt)->display));
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]