[gimp] app: make GimpToolTransformGrid handle modifiers itself



commit 4208aceafe54cfafe81ce090ad9d1893b13b752e
Author: Michael Natterer <mitch gimp org>
Date:   Sat Jul 15 19:34:08 2017 +0200

    app: make GimpToolTransformGrid handle modifiers itself
    
    and update the grid as soon as a constraint is changed, not only on
    the next motion. Change GimpTransformTool to forward the events to the
    widget if it exists, but still handle them if it doesn't (yes this
    code duplication is ugly, but the widget can hardly handle events if
    it doesn't exist...).

 app/display/gimptooltransformgrid.c |   67 +++++++++++++++++++++++++++++++++++
 app/tools/gimptransformtool.c       |   54 +++++++++++++++++++++++++---
 2 files changed, 115 insertions(+), 6 deletions(-)
---
diff --git a/app/display/gimptooltransformgrid.c b/app/display/gimptooltransformgrid.c
index c1b457e..892a7e2 100644
--- a/app/display/gimptooltransformgrid.c
+++ b/app/display/gimptooltransformgrid.c
@@ -34,6 +34,8 @@
 #include "core/gimp-transform-utils.h"
 #include "core/gimp-utils.h"
 
+#include "widgets/gimpwidgets-utils.h"
+
 #include "gimpcanvashandle.h"
 #include "gimpcanvastransformguides.h"
 #include "gimpdisplayshell.h"
@@ -170,6 +172,14 @@ static void     gimp_tool_transform_grid_hover          (GimpToolWidget        *
                                                          const GimpCoords      *coords,
                                                          GdkModifierType        state,
                                                          gboolean               proximity);
+static void     gimp_tool_transform_grid_motion_modifier(GimpToolWidget        *widget,
+                                                         GdkModifierType        key,
+                                                         gboolean               press,
+                                                         GdkModifierType        state);
+static void     gimp_tool_transform_grid_hover_modifier (GimpToolWidget        *widget,
+                                                         GdkModifierType        key,
+                                                         gboolean               press,
+                                                         GdkModifierType        state);
 static gboolean gimp_tool_transform_grid_get_cursor     (GimpToolWidget        *widget,
                                                          const GimpCoords      *coords,
                                                          GdkModifierType        state,
@@ -206,6 +216,8 @@ gimp_tool_transform_grid_class_init (GimpToolTransformGridClass *klass)
   widget_class->button_release  = gimp_tool_transform_grid_button_release;
   widget_class->motion          = gimp_tool_transform_grid_motion;
   widget_class->hover           = gimp_tool_transform_grid_hover;
+  widget_class->motion_modifier = gimp_tool_transform_grid_motion_modifier;
+  widget_class->hover_modifier  = gimp_tool_transform_grid_hover_modifier;
   widget_class->get_cursor      = gimp_tool_transform_grid_get_cursor;
 
   g_object_class_install_property (object_class, PROP_TRANSFORM,
@@ -1904,6 +1916,61 @@ gimp_tool_transform_grid_hover (GimpToolWidget   *widget,
   gimp_tool_transform_grid_update_hilight (grid);
 }
 
+static void
+gimp_tool_transform_grid_modifier (GimpToolWidget  *widget,
+                                   GdkModifierType  key)
+{
+  GimpToolTransformGrid        *grid    = GIMP_TOOL_TRANSFORM_GRID (widget);
+  GimpToolTransformGridPrivate *private = grid->private;
+
+  if (key == gimp_get_constrain_behavior_mask ())
+    {
+      g_object_set (widget,
+                    "frompivot-scale",       ! private->frompivot_scale,
+                    "frompivot-shear",       ! private->frompivot_shear,
+                    "frompivot-perspective", ! private->frompivot_perspective,
+                    NULL);
+    }
+  else if (key == gimp_get_extend_selection_mask ())
+    {
+      g_object_set (widget,
+                    "cornersnap",            ! private->cornersnap,
+                    "constrain-move",        ! private->constrain_move,
+                    "constrain-scale",       ! private->constrain_scale,
+                    "constrain-rotate",      ! private->constrain_rotate,
+                    "constrain-shear",       ! private->constrain_shear,
+                    "constrain-perspective", ! private->constrain_perspective,
+                    NULL);
+    }
+}
+
+static void
+gimp_tool_transform_grid_motion_modifier (GimpToolWidget  *widget,
+                                          GdkModifierType  key,
+                                          gboolean         press,
+                                          GdkModifierType  state)
+{
+  GimpToolTransformGrid        *grid    = GIMP_TOOL_TRANSFORM_GRID (widget);
+  GimpToolTransformGridPrivate *private = grid->private;
+  GimpCoords                    coords  = { 0.0, };
+
+  gimp_tool_transform_grid_modifier (widget, key);
+
+  /*  send a non-motion to update the grid with the new constraints  */
+  coords.x = private->curx;
+  coords.y = private->cury;
+  gimp_tool_transform_grid_motion (widget, &coords, 0, state);
+}
+
+static void
+gimp_tool_transform_grid_hover_modifier (GimpToolWidget  *widget,
+                                         GdkModifierType  key,
+                                         gboolean         press,
+                                         GdkModifierType  state)
+{
+  gimp_tool_transform_grid_modifier (widget, key);
+}
+
 static gboolean
 gimp_tool_transform_grid_get_cursor (GimpToolWidget     *widget,
                                      const GimpCoords   *coords,
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index f3971f5..8bda515 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -91,6 +91,11 @@ static void      gimp_transform_tool_modifier_key        (GimpTool
                                                           gboolean               press,
                                                           GdkModifierType        state,
                                                           GimpDisplay           *display);
+static void      gimp_transform_tool_active_modifier_key (GimpTool              *tool,
+                                                          GdkModifierType        key,
+                                                          gboolean               press,
+                                                          GdkModifierType        state,
+                                                          GimpDisplay           *display);
 static void      gimp_transform_tool_cursor_update       (GimpTool              *tool,
                                                           const GimpCoords      *coords,
                                                           GdkModifierType        state,
@@ -176,7 +181,7 @@ gimp_transform_tool_class_init (GimpTransformToolClass *klass)
   tool_class->button_release      = gimp_transform_tool_button_release;
   tool_class->motion              = gimp_transform_tool_motion;
   tool_class->modifier_key        = gimp_transform_tool_modifier_key;
-  tool_class->active_modifier_key = gimp_transform_tool_modifier_key;
+  tool_class->active_modifier_key = gimp_transform_tool_active_modifier_key;
   tool_class->cursor_update       = gimp_transform_tool_cursor_update;
   tool_class->can_undo            = gimp_transform_tool_can_undo;
   tool_class->can_redo            = gimp_transform_tool_can_redo;
@@ -440,11 +445,8 @@ gimp_transform_tool_motion (GimpTool         *tool,
 }
 
 static void
-gimp_transform_tool_modifier_key (GimpTool        *tool,
-                                  GdkModifierType  key,
-                                  gboolean         press,
-                                  GdkModifierType  state,
-                                  GimpDisplay     *display)
+gimp_transform_tool_modifier (GimpTool        *tool,
+                              GdkModifierType  key)
 {
   GimpTransformOptions *options = GIMP_TRANSFORM_TOOL_GET_OPTIONS (tool);
 
@@ -470,6 +472,46 @@ gimp_transform_tool_modifier_key (GimpTool        *tool,
 }
 
 static void
+gimp_transform_tool_modifier_key (GimpTool        *tool,
+                                  GdkModifierType  key,
+                                  gboolean         press,
+                                  GdkModifierType  state,
+                                  GimpDisplay     *display)
+{
+  GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool);
+
+  if (tr_tool->widget)
+    {
+      GIMP_TOOL_CLASS (parent_class)->modifier_key (tool, key, press,
+                                                    state, display);
+    }
+  else
+    {
+      gimp_transform_tool_modifier (tool, key);
+    }
+}
+
+static void
+gimp_transform_tool_active_modifier_key (GimpTool        *tool,
+                                         GdkModifierType  key,
+                                         gboolean         press,
+                                         GdkModifierType  state,
+                                         GimpDisplay     *display)
+{
+  GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool);
+
+  if (tr_tool->widget)
+    {
+      GIMP_TOOL_CLASS (parent_class)->active_modifier_key (tool, key, press,
+                                                           state, display);
+    }
+  else
+    {
+      gimp_transform_tool_modifier (tool, key);
+    }
+}
+
+static void
 gimp_transform_tool_cursor_update (GimpTool         *tool,
                                    const GimpCoords *coords,
                                    GdkModifierType   state,


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