[gimp] app: add gimp_draw_tool_set_widget() and use it in all ported tools



commit 0d3f7193817375d963643d84699f3efe927f0a79
Author: Michael Natterer <mitch gimp org>
Date:   Mon Jun 26 19:50:31 2017 +0200

    app: add gimp_draw_tool_set_widget() and use it in all ported tools
    
    which so far manages drawing of the widget's GimpCanvasItem. Remove
    GimpDrawTool::draw() implementations from most of the affected tools.

 app/tools/gimpblendtool.c      |   24 +++-----------------
 app/tools/gimpcroptool.c       |   24 +++-----------------
 app/tools/gimpdrawtool.c       |   46 +++++++++++++++++++++++++++++++++++++++-
 app/tools/gimpdrawtool.h       |    4 +++
 app/tools/gimpfreeselecttool.c |   25 +++------------------
 app/tools/gimpmeasuretool.c    |   22 ++----------------
 app/tools/gimptransformtool.c  |    6 ++--
 app/tools/gimpvectortool.c     |   24 +++-----------------
 8 files changed, 71 insertions(+), 104 deletions(-)
---
diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c
index 72a5aa0..259f209 100644
--- a/app/tools/gimpblendtool.c
+++ b/app/tools/gimpblendtool.c
@@ -119,8 +119,6 @@ static void   gimp_blend_tool_options_notify      (GimpTool              *tool,
                                                    GimpToolOptions       *options,
                                                    const GParamSpec      *pspec);
 
-static void   gimp_blend_tool_draw                (GimpDrawTool          *draw_tool);
-
 static void   gimp_blend_tool_start               (GimpBlendTool         *blend_tool,
                                                    GimpDisplay           *display);
 static void   gimp_blend_tool_halt                (GimpBlendTool         *blend_tool);
@@ -189,9 +187,8 @@ gimp_blend_tool_register (GimpToolRegisterCallback  callback,
 static void
 gimp_blend_tool_class_init (GimpBlendToolClass *klass)
 {
-  GObjectClass      *object_class    = G_OBJECT_CLASS (klass);
-  GimpToolClass     *tool_class      = GIMP_TOOL_CLASS (klass);
-  GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+  GObjectClass  *object_class = G_OBJECT_CLASS (klass);
+  GimpToolClass *tool_class   = GIMP_TOOL_CLASS (klass);
 
   object_class->dispose           = gimp_blend_tool_dispose;
 
@@ -209,8 +206,6 @@ gimp_blend_tool_class_init (GimpBlendToolClass *klass)
   tool_class->undo                = gimp_blend_tool_undo;
   tool_class->redo                = gimp_blend_tool_redo;
   tool_class->options_notify      = gimp_blend_tool_options_notify;
-
-  draw_tool_class->draw           = gimp_blend_tool_draw;
 }
 
 static void
@@ -368,6 +363,8 @@ gimp_blend_tool_button_press (GimpTool            *tool,
                                              blend_tool->end_x,
                                              blend_tool->end_y);
 
+      gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), blend_tool->line);
+
       gimp_tool_widget_hover (blend_tool->line, coords, state, TRUE);
 
       g_signal_connect (blend_tool->line, "changed",
@@ -683,19 +680,6 @@ gimp_blend_tool_options_notify (GimpTool         *tool,
 }
 
 static void
-gimp_blend_tool_draw (GimpDrawTool *draw_tool)
-{
-  GimpBlendTool *blend_tool = GIMP_BLEND_TOOL (draw_tool);
-
-  if (blend_tool->line)
-    {
-      GimpCanvasItem *item = gimp_tool_widget_get_item (blend_tool->line);
-
-      gimp_draw_tool_add_item (draw_tool, item);
-    }
-}
-
-static void
 gimp_blend_tool_start (GimpBlendTool *blend_tool,
                        GimpDisplay   *display)
 {
diff --git a/app/tools/gimpcroptool.c b/app/tools/gimpcroptool.c
index ace1c6b..9bb9d04 100644
--- a/app/tools/gimpcroptool.c
+++ b/app/tools/gimpcroptool.c
@@ -87,8 +87,6 @@ static void      gimp_crop_tool_options_notify            (GimpTool
                                                            GimpToolOptions      *options,
                                                            const GParamSpec     *pspec);
 
-static void      gimp_crop_tool_draw                      (GimpDrawTool         *draw_tool);
-
 static void      gimp_crop_tool_rectangle_changed         (GimpToolWidget       *rectangle,
                                                            GimpCropTool         *crop_tool);
 static void      gimp_crop_tool_rectangle_response        (GimpToolWidget       *rectangle,
@@ -156,9 +154,8 @@ gimp_crop_tool_register (GimpToolRegisterCallback  callback,
 static void
 gimp_crop_tool_class_init (GimpCropToolClass *klass)
 {
-  GObjectClass      *object_class    = G_OBJECT_CLASS (klass);
-  GimpToolClass     *tool_class      = GIMP_TOOL_CLASS (klass);
-  GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+  GObjectClass  *object_class = G_OBJECT_CLASS (klass);
+  GimpToolClass *tool_class   = GIMP_TOOL_CLASS (klass);
 
   object_class->constructed       = gimp_crop_tool_constructed;
 
@@ -171,8 +168,6 @@ gimp_crop_tool_class_init (GimpCropToolClass *klass)
   tool_class->oper_update         = gimp_crop_tool_oper_update;
   tool_class->cursor_update       = gimp_crop_tool_cursor_update;
   tool_class->options_notify      = gimp_crop_tool_options_notify;
-
-  draw_tool_class->draw           = gimp_crop_tool_draw;
 }
 
 static void
@@ -280,6 +275,8 @@ gimp_crop_tool_button_press (GimpTool            *tool,
 
       crop_tool->rectangle = widget = gimp_tool_rectangle_new (shell);
 
+      gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), widget);
+
       for (i = 0; i < G_N_ELEMENTS (properties); i++)
         g_object_bind_property (G_OBJECT (options), properties[i],
                                 G_OBJECT (widget),  properties[i],
@@ -460,19 +457,6 @@ gimp_crop_tool_options_notify (GimpTool         *tool,
 }
 
 static void
-gimp_crop_tool_draw (GimpDrawTool *draw_tool)
-{
-  GimpCropTool *crop_tool = GIMP_CROP_TOOL (draw_tool);
-
-  if (crop_tool->rectangle)
-    {
-      GimpCanvasItem *item = gimp_tool_widget_get_item (crop_tool->rectangle);
-
-      gimp_draw_tool_add_item (draw_tool, item);
-    }
-}
-
-static void
 gimp_crop_tool_rectangle_changed (GimpToolWidget *rectangle,
                                   GimpCropTool   *crop_tool)
 {
diff --git a/app/tools/gimpdrawtool.c b/app/tools/gimpdrawtool.c
index db321a7..fc55082 100644
--- a/app/tools/gimpdrawtool.c
+++ b/app/tools/gimpdrawtool.c
@@ -49,6 +49,7 @@
 #include "display/gimpdisplayshell.h"
 #include "display/gimpdisplayshell-items.h"
 #include "display/gimpdisplayshell-transform.h"
+#include "display/gimptoolwidget.h"
 
 #include "gimpdrawtool.h"
 
@@ -164,6 +165,7 @@ gimp_draw_tool_control (GimpTool       *tool,
     case GIMP_TOOL_ACTION_HALT:
       if (gimp_draw_tool_is_active (draw_tool))
         gimp_draw_tool_stop (draw_tool);
+      gimp_draw_tool_set_widget (draw_tool, NULL);
       break;
 
     case GIMP_TOOL_ACTION_COMMIT:
@@ -269,7 +271,12 @@ gimp_draw_tool_undraw (GimpDrawTool *draw_tool)
 static void
 gimp_draw_tool_real_draw (GimpDrawTool *draw_tool)
 {
-  /* the default implementation does nothing */
+  if (draw_tool->widget)
+    {
+      GimpCanvasItem *item = gimp_tool_widget_get_item (draw_tool->widget);
+
+      gimp_draw_tool_add_item (draw_tool, item);
+    }
 }
 
 void
@@ -425,6 +432,43 @@ gimp_draw_tool_calc_distance_square (GimpDrawTool *draw_tool,
 }
 
 void
+gimp_draw_tool_set_widget (GimpDrawTool   *draw_tool,
+                           GimpToolWidget *widget)
+{
+  g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool));
+  g_return_if_fail (widget == NULL || GIMP_IS_TOOL_WIDGET (widget));
+
+  if (widget == draw_tool->widget)
+    return;
+
+  if (draw_tool->widget)
+    {
+      if (gimp_draw_tool_is_active (draw_tool))
+        {
+          GimpCanvasItem *item = gimp_tool_widget_get_item (draw_tool->widget);
+
+          gimp_draw_tool_remove_item (draw_tool, item);
+        }
+
+      g_object_unref (draw_tool->widget);
+    }
+
+  draw_tool->widget = widget;
+
+  if (draw_tool->widget)
+    {
+      g_object_ref (draw_tool->widget);
+
+      if (gimp_draw_tool_is_active (draw_tool))
+        {
+          GimpCanvasItem *item = gimp_tool_widget_get_item (draw_tool->widget);
+
+          gimp_draw_tool_add_item (draw_tool, item);
+        }
+    }
+}
+
+void
 gimp_draw_tool_add_preview (GimpDrawTool   *draw_tool,
                             GimpCanvasItem *item)
 {
diff --git a/app/tools/gimpdrawtool.h b/app/tools/gimpdrawtool.h
index a5eee94..aa8fa01 100644
--- a/app/tools/gimpdrawtool.h
+++ b/app/tools/gimpdrawtool.h
@@ -51,6 +51,7 @@ struct _GimpDrawTool
   guint           draw_timeout;   /*  draw delay timeout ID                   */
   guint64         last_draw_time; /*  time of last draw(), monotonically      */
 
+  GimpToolWidget *widget;
   GimpCanvasItem *preview;
   GimpCanvasItem *item;
   GList          *group_stack;
@@ -90,6 +91,9 @@ gdouble          gimp_draw_tool_calc_distance_square (GimpDrawTool     *draw_too
                                                       gdouble           x2,
                                                       gdouble           y2);
 
+void             gimp_draw_tool_set_widget           (GimpDrawTool     *draw_tool,
+                                                      GimpToolWidget   *widget);
+
 void             gimp_draw_tool_add_preview          (GimpDrawTool     *draw_tool,
                                                       GimpCanvasItem   *item);
 void             gimp_draw_tool_remove_preview       (GimpDrawTool     *draw_tool,
diff --git a/app/tools/gimpfreeselecttool.c b/app/tools/gimpfreeselecttool.c
index 0bb076e..6f0f14f 100644
--- a/app/tools/gimpfreeselecttool.c
+++ b/app/tools/gimpfreeselecttool.c
@@ -98,8 +98,6 @@ static void     gimp_free_select_tool_active_modifier_key (GimpTool
                                                            GdkModifierType        state,
                                                            GimpDisplay           *display);
 
-static void     gimp_free_select_tool_draw                (GimpDrawTool          *draw_tool);
-
 static void     gimp_free_select_tool_real_select         (GimpFreeSelectTool    *fst,
                                                            GimpDisplay           *display,
                                                            const GimpVector2     *points,
@@ -142,9 +140,8 @@ gimp_free_select_tool_register (GimpToolRegisterCallback  callback,
 static void
 gimp_free_select_tool_class_init (GimpFreeSelectToolClass *klass)
 {
-  GObjectClass      *object_class    = G_OBJECT_CLASS (klass);
-  GimpToolClass     *tool_class      = GIMP_TOOL_CLASS (klass);
-  GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+  GObjectClass  *object_class = G_OBJECT_CLASS (klass);
+  GimpToolClass *tool_class   = GIMP_TOOL_CLASS (klass);
 
   object_class->finalize          = gimp_free_select_tool_finalize;
 
@@ -158,8 +155,6 @@ gimp_free_select_tool_class_init (GimpFreeSelectToolClass *klass)
   tool_class->modifier_key        = gimp_free_select_tool_modifier_key;
   tool_class->active_modifier_key = gimp_free_select_tool_active_modifier_key;
 
-  draw_tool_class->draw           = gimp_free_select_tool_draw;
-
   klass->select                   = gimp_free_select_tool_real_select;
 
   g_type_class_add_private (klass, sizeof (GimpFreeSelectToolPrivate));
@@ -340,6 +335,8 @@ gimp_free_select_tool_button_press (GimpTool            *tool,
 
       private->polygon = gimp_tool_polygon_new (shell);
 
+      gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), private->polygon);
+
       g_signal_connect (private->polygon, "changed",
                         G_CALLBACK (gimp_free_select_tool_polygon_changed),
                         fst);
@@ -476,20 +473,6 @@ gimp_free_select_tool_active_modifier_key (GimpTool        *tool,
 }
 
 static void
-gimp_free_select_tool_draw (GimpDrawTool *draw_tool)
-{
-  GimpFreeSelectTool        *fst  = GIMP_FREE_SELECT_TOOL (draw_tool);
-  GimpFreeSelectToolPrivate *priv = fst->private;
-
-  if (priv->polygon)
-    {
-      GimpCanvasItem *item = gimp_tool_widget_get_item (priv->polygon);
-
-      gimp_draw_tool_add_item (draw_tool, item);
-    }
-}
-
-static void
 gimp_free_select_tool_real_select (GimpFreeSelectTool *fst,
                                    GimpDisplay        *display,
                                    const GimpVector2  *points,
diff --git a/app/tools/gimpmeasuretool.c b/app/tools/gimpmeasuretool.c
index 19f956a..f311e59 100644
--- a/app/tools/gimpmeasuretool.c
+++ b/app/tools/gimpmeasuretool.c
@@ -90,8 +90,6 @@ static void     gimp_measure_tool_cursor_update   (GimpTool              *tool,
                                                    GdkModifierType        state,
                                                    GimpDisplay           *display);
 
-static void     gimp_measure_tool_draw            (GimpDrawTool          *draw_tool);
-
 static void     gimp_measure_tool_compass_changed (GimpToolWidget        *widget,
                                                    GimpMeasureTool       *measure);
 static void     gimp_measure_tool_compass_status  (GimpToolWidget        *widget,
@@ -140,8 +138,7 @@ gimp_measure_tool_register (GimpToolRegisterCallback  callback,
 static void
 gimp_measure_tool_class_init (GimpMeasureToolClass *klass)
 {
-  GimpToolClass     *tool_class      = GIMP_TOOL_CLASS (klass);
-  GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+  GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass);
 
   tool_class->control             = gimp_measure_tool_control;
   tool_class->button_press        = gimp_measure_tool_button_press;
@@ -151,8 +148,6 @@ gimp_measure_tool_class_init (GimpMeasureToolClass *klass)
   tool_class->active_modifier_key = gimp_measure_tool_active_modifier_key;
   tool_class->oper_update         = gimp_measure_tool_oper_update;
   tool_class->cursor_update       = gimp_measure_tool_cursor_update;
-
-  draw_tool_class->draw           = gimp_measure_tool_draw;
 }
 
 static void
@@ -238,6 +233,8 @@ gimp_measure_tool_button_press (GimpTool            *tool,
                                                 measure->x[2],
                                                 measure->y[2]);
 
+      gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), measure->compass);
+
       gimp_tool_widget_hover (measure->compass, coords, state, TRUE);
 
       g_signal_connect (measure->compass, "changed",
@@ -403,19 +400,6 @@ gimp_measure_tool_cursor_update (GimpTool         *tool,
 }
 
 static void
-gimp_measure_tool_draw (GimpDrawTool *draw_tool)
-{
-  GimpMeasureTool *measure = GIMP_MEASURE_TOOL (draw_tool);
-
-  if (measure->compass)
-    {
-      GimpCanvasItem *item = gimp_tool_widget_get_item (measure->compass);
-
-      gimp_draw_tool_add_item (draw_tool, item);
-    }
-}
-
-static void
 gimp_measure_tool_compass_changed (GimpToolWidget  *widget,
                                    GimpMeasureTool *measure)
 {
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index 273341b..e6a0bcd 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -765,9 +765,7 @@ gimp_transform_tool_draw (GimpDrawTool *draw_tool)
                               G_BINDING_SYNC_CREATE |
                               G_BINDING_BIDIRECTIONAL);
 
-      item = gimp_tool_widget_get_item (tr_tool->widget);
-
-      gimp_draw_tool_add_item (draw_tool, item);
+      GIMP_DRAW_TOOL_CLASS (parent_class)->draw (draw_tool);
     }
 
   if (options->type == GIMP_TRANSFORM_TYPE_SELECTION)
@@ -1369,6 +1367,8 @@ gimp_transform_tool_get_widget (GimpTransformTool *tr_tool)
 
       widget = GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->get_widget (tr_tool);
 
+      gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tr_tool), widget);
+
       g_object_bind_property (G_OBJECT (options), "grid-type",
                               G_OBJECT (widget),  "guide-type",
                               G_BINDING_SYNC_CREATE |
diff --git a/app/tools/gimpvectortool.c b/app/tools/gimpvectortool.c
index 865c13d..322d40e 100644
--- a/app/tools/gimpvectortool.c
+++ b/app/tools/gimpvectortool.c
@@ -106,8 +106,6 @@ static void     gimp_vector_tool_cursor_update   (GimpTool              *tool,
                                                   GdkModifierType        state,
                                                   GimpDisplay           *display);
 
-static void     gimp_vector_tool_draw            (GimpDrawTool          *draw_tool);
-
 static void     gimp_vector_tool_start           (GimpVectorTool        *vector_tool,
                                                   GimpDisplay           *display);
 static void     gimp_vector_tool_halt            (GimpVectorTool        *vector_tool);
@@ -184,9 +182,8 @@ gimp_vector_tool_register (GimpToolRegisterCallback callback,
 static void
 gimp_vector_tool_class_init (GimpVectorToolClass *klass)
 {
-  GObjectClass      *object_class    = G_OBJECT_CLASS (klass);
-  GimpToolClass     *tool_class      = GIMP_TOOL_CLASS (klass);
-  GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+  GObjectClass  *object_class = G_OBJECT_CLASS (klass);
+  GimpToolClass *tool_class   = GIMP_TOOL_CLASS (klass);
 
   object_class->dispose      = gimp_vector_tool_dispose;
 
@@ -198,8 +195,6 @@ gimp_vector_tool_class_init (GimpVectorToolClass *klass)
   tool_class->modifier_key   = gimp_vector_tool_modifier_key;
   tool_class->oper_update    = gimp_vector_tool_oper_update;
   tool_class->cursor_update  = gimp_vector_tool_cursor_update;
-
-  draw_tool_class->draw      = gimp_vector_tool_draw;
 }
 
 static void
@@ -431,19 +426,6 @@ gimp_vector_tool_cursor_update (GimpTool         *tool,
 }
 
 static void
-gimp_vector_tool_draw (GimpDrawTool *draw_tool)
-{
-  GimpVectorTool *vector_tool = GIMP_VECTOR_TOOL (draw_tool);
-
-  if (vector_tool->path)
-    {
-      GimpCanvasItem *item = gimp_tool_widget_get_item (vector_tool->path);
-
-      gimp_draw_tool_add_item (draw_tool, item);
-    }
-}
-
-static void
 gimp_vector_tool_start (GimpVectorTool *vector_tool,
                         GimpDisplay    *display)
 {
@@ -456,6 +438,8 @@ gimp_vector_tool_start (GimpVectorTool *vector_tool,
 
   vector_tool->path = widget = gimp_tool_path_new (shell);
 
+  gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), widget);
+
   g_object_bind_property (G_OBJECT (options), "vectors-edit-mode",
                           G_OBJECT (widget),  "edit-mode",
                           G_BINDING_SYNC_CREATE |


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]