[gimp/gimp-2-10] app: update tool widgets on display-shell changes more granularly



commit 0c4e6f1ef3b2d8881427ee0f58f5b9dfe63450f9
Author: Ell <ell_se yahoo com>
Date:   Tue May 26 10:36:58 2020 +0300

    app: update tool widgets on display-shell changes more granularly
    
    Partially revert commit c73710e410b663edee14bbfb1a0b96b7fbeb9047,
    avoiding updating tool widgets unconditionally on tool resume in
    GimpDrawTool -- it's too expensive in general.
    
    Instead, handle display-shell changes in GimpToolWidget, by adding
    GimpToolWidget::update_on_{scale,scroll,rotate} flags, which
    subclasses can use to request an update on any of these events.
    
    Set the flags as necessary for the affected widgets.
    
    (cherry picked from commit afda774f44654f8f0c9fd385eb1eb8c9b16bde49)

 app/display/gimptoolcompass.c       | 28 +++++++++++++++-------------
 app/display/gimptoolfocus.c         |  1 +
 app/display/gimptoolrectangle.c     |  1 +
 app/display/gimptooltransformgrid.c |  1 +
 app/display/gimptoolwidget.c        | 28 ++++++++++++++++++++++++++++
 app/display/gimptoolwidget.h        |  4 ++++
 app/tools/gimpdrawtool.c            |  4 ----
 7 files changed, 50 insertions(+), 17 deletions(-)
---
diff --git a/app/display/gimptoolcompass.c b/app/display/gimptoolcompass.c
index 9d47d8bd5d..3d9045b9ee 100644
--- a/app/display/gimptoolcompass.c
+++ b/app/display/gimptoolcompass.c
@@ -185,19 +185,21 @@ gimp_tool_compass_class_init (GimpToolCompassClass *klass)
   GObjectClass        *object_class = G_OBJECT_CLASS (klass);
   GimpToolWidgetClass *widget_class = GIMP_TOOL_WIDGET_CLASS (klass);
 
-  object_class->constructed     = gimp_tool_compass_constructed;
-  object_class->set_property    = gimp_tool_compass_set_property;
-  object_class->get_property    = gimp_tool_compass_get_property;
-
-  widget_class->changed         = gimp_tool_compass_changed;
-  widget_class->button_press    = gimp_tool_compass_button_press;
-  widget_class->button_release  = gimp_tool_compass_button_release;
-  widget_class->motion          = gimp_tool_compass_motion;
-  widget_class->hit             = gimp_tool_compass_hit;
-  widget_class->hover           = gimp_tool_compass_hover;
-  widget_class->leave_notify    = gimp_tool_compass_leave_notify;
-  widget_class->motion_modifier = gimp_tool_compass_motion_modifier;
-  widget_class->get_cursor      = gimp_tool_compass_get_cursor;
+  object_class->constructed      = gimp_tool_compass_constructed;
+  object_class->set_property     = gimp_tool_compass_set_property;
+  object_class->get_property     = gimp_tool_compass_get_property;
+
+  widget_class->changed          = gimp_tool_compass_changed;
+  widget_class->button_press     = gimp_tool_compass_button_press;
+  widget_class->button_release   = gimp_tool_compass_button_release;
+  widget_class->motion           = gimp_tool_compass_motion;
+  widget_class->hit              = gimp_tool_compass_hit;
+  widget_class->hover            = gimp_tool_compass_hover;
+  widget_class->leave_notify     = gimp_tool_compass_leave_notify;
+  widget_class->motion_modifier  = gimp_tool_compass_motion_modifier;
+  widget_class->get_cursor       = gimp_tool_compass_get_cursor;
+  widget_class->update_on_scale  = TRUE;
+  widget_class->update_on_rotate = TRUE;
 
   compass_signals[CREATE_GUIDES] =
     g_signal_new ("create-guides",
diff --git a/app/display/gimptoolfocus.c b/app/display/gimptoolfocus.c
index 4f98b7c686..a607f0691f 100644
--- a/app/display/gimptoolfocus.c
+++ b/app/display/gimptoolfocus.c
@@ -224,6 +224,7 @@ gimp_tool_focus_class_init (GimpToolFocusClass *klass)
   widget_class->motion_modifier = gimp_tool_focus_motion_modifier;
   widget_class->hover_modifier  = gimp_tool_focus_hover_modifier;
   widget_class->get_cursor      = gimp_tool_focus_get_cursor;
+  widget_class->update_on_scale = TRUE;
 
   g_object_class_install_property (object_class, PROP_TYPE,
                                    g_param_spec_enum ("type", NULL, NULL,
diff --git a/app/display/gimptoolrectangle.c b/app/display/gimptoolrectangle.c
index f39d1a5d3a..c1192db11a 100644
--- a/app/display/gimptoolrectangle.c
+++ b/app/display/gimptoolrectangle.c
@@ -463,6 +463,7 @@ gimp_tool_rectangle_class_init (GimpToolRectangleClass *klass)
   widget_class->key_press       = gimp_tool_rectangle_key_press;
   widget_class->motion_modifier = gimp_tool_rectangle_motion_modifier;
   widget_class->get_cursor      = gimp_tool_rectangle_get_cursor;
+  widget_class->update_on_scale = TRUE;
 
   rectangle_signals[CHANGE_COMPLETE] =
     g_signal_new ("change-complete",
diff --git a/app/display/gimptooltransformgrid.c b/app/display/gimptooltransformgrid.c
index ffbd66b84d..b186b91c33 100644
--- a/app/display/gimptooltransformgrid.c
+++ b/app/display/gimptooltransformgrid.c
@@ -232,6 +232,7 @@ gimp_tool_transform_grid_class_init (GimpToolTransformGridClass *klass)
   widget_class->leave_notify    = gimp_tool_transform_grid_leave_notify;
   widget_class->hover_modifier  = gimp_tool_transform_grid_hover_modifier;
   widget_class->get_cursor      = gimp_tool_transform_grid_get_cursor;
+  widget_class->update_on_scale = TRUE;
 
   g_object_class_install_property (object_class, PROP_TRANSFORM,
                                    gimp_param_spec_matrix3 ("transform",
diff --git a/app/display/gimptoolwidget.c b/app/display/gimptoolwidget.c
index 2f9c321c86..516f36655a 100644
--- a/app/display/gimptoolwidget.c
+++ b/app/display/gimptoolwidget.c
@@ -224,6 +224,7 @@ gimp_tool_widget_constructed (GObject *object)
 {
   GimpToolWidget        *widget  = GIMP_TOOL_WIDGET (object);
   GimpToolWidgetPrivate *private = widget->private;
+  GimpToolWidgetClass   *klass   = GIMP_TOOL_WIDGET_GET_CLASS (widget);
 
   G_OBJECT_CLASS (parent_class)->constructed (object);
 
@@ -232,6 +233,33 @@ gimp_tool_widget_constructed (GObject *object)
   private->item = gimp_canvas_group_new (private->shell);
 
   gimp_canvas_item_set_visible (private->item, private->visible);
+
+  if (klass->changed)
+    {
+      if (klass->update_on_scale)
+        {
+          g_signal_connect_object (private->shell, "scaled",
+                                   G_CALLBACK (klass->changed),
+                                   widget,
+                                   G_CONNECT_SWAPPED);
+        }
+
+      if (klass->update_on_scroll)
+        {
+          g_signal_connect_object (private->shell, "scrolled",
+                                   G_CALLBACK (klass->changed),
+                                   widget,
+                                   G_CONNECT_SWAPPED);
+        }
+
+      if (klass->update_on_rotate)
+        {
+          g_signal_connect_object (private->shell, "rotated",
+                                   G_CALLBACK (klass->changed),
+                                   widget,
+                                   G_CONNECT_SWAPPED);
+        }
+    }
 }
 
 static void
diff --git a/app/display/gimptoolwidget.h b/app/display/gimptoolwidget.h
index f1010ea9b8..742aa2aa2d 100644
--- a/app/display/gimptoolwidget.h
+++ b/app/display/gimptoolwidget.h
@@ -119,6 +119,10 @@ struct _GimpToolWidgetClass
                                 GimpCursorType        *cursor,
                                 GimpToolCursorType    *tool_cursor,
                                 GimpCursorModifier    *modifier);
+
+  gboolean update_on_scale;
+  gboolean update_on_scroll;
+  gboolean update_on_rotate;
 };
 
 
diff --git a/app/tools/gimpdrawtool.c b/app/tools/gimpdrawtool.c
index de6f7d7799..b97e30a052 100644
--- a/app/tools/gimpdrawtool.c
+++ b/app/tools/gimpdrawtool.c
@@ -217,11 +217,7 @@ gimp_draw_tool_control (GimpTool       *tool,
   switch (action)
     {
     case GIMP_TOOL_ACTION_PAUSE:
-      break;
-
     case GIMP_TOOL_ACTION_RESUME:
-      if (draw_tool->widget)
-        gimp_tool_widget_changed (draw_tool->widget);
       break;
 
     case GIMP_TOOL_ACTION_HALT:


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