[gimp/gimp-2-10] app: add "Readjust" function to transform-grid tools



commit a8292fedf262bf1815eea81b9d5ec08936cf1052
Author: Ell <ell_se yahoo com>
Date:   Thu Mar 7 16:05:18 2019 -0500

    app: add "Readjust" function to transform-grid tools
    
    Add an optional GimpTransformGridTool::radjust() virtual function,
    which subclasses can implement to radjust the transformation based
    on the current state of the display, such that it's easy to
    control.  This is especially useful when the image is zoomed-in,
    and the transform handles, which are initially across the layer
    bounds, are out of view.
    
    When a transform tool implements radjust(), show a "Readjust"
    button in the tool GUI.  While readjusting the transformation, we
    modify the opposite transformation such that the overall transform
    remains unchanged, as if both transform-directions were linked, so
    that only the transform grid is readjusted.
    
    (cherry picked from commit 5055dd10d5107fde376a9f79d29fc12b697bca4c)

 app/tools/gimptransformgridtool.c | 43 +++++++++++++++++++++++++++++++--------
 app/tools/gimptransformgridtool.h |  1 +
 2 files changed, 35 insertions(+), 9 deletions(-)
---
diff --git a/app/tools/gimptransformgridtool.c b/app/tools/gimptransformgridtool.c
index 397911b8e9..3646c03f8b 100644
--- a/app/tools/gimptransformgridtool.c
+++ b/app/tools/gimptransformgridtool.c
@@ -56,7 +56,8 @@
 #include "gimp-intl.h"
 
 
-#define RESPONSE_RESET 1
+#define RESPONSE_RESET    1
+#define RESPONSE_READJUST 2
 
 
 typedef struct
@@ -210,6 +211,7 @@ gimp_transform_grid_tool_class_init (GimpTransformGridToolClass *klass)
   klass->dialog              = NULL;
   klass->dialog_update       = NULL;
   klass->prepare             = NULL;
+  klass->readjust            = NULL;
   klass->get_widget          = NULL;
   klass->update_widget       = gimp_transform_grid_tool_real_update_widget;
   klass->widget_changed      = gimp_transform_grid_tool_real_widget_changed;
@@ -1090,18 +1092,20 @@ gimp_transform_grid_tool_dialog (GimpTransformGridTool *tg_tool)
                                     gtk_widget_get_screen (GTK_WIDGET (shell)),
                                     gimp_widget_get_monitor (GTK_WIDGET (shell)),
                                     TRUE,
-
-                                    _("_Reset"),     RESPONSE_RESET,
-                                    _("_Cancel"),    GTK_RESPONSE_CANCEL,
-                                    ok_button_label, GTK_RESPONSE_OK,
-
                                     NULL);
 
+  gimp_tool_gui_add_button   (tg_tool->gui, _("_Reset"),     RESPONSE_RESET);
+  if (GIMP_TRANSFORM_GRID_TOOL_GET_CLASS (tg_tool)->readjust)
+    gimp_tool_gui_add_button (tg_tool->gui, _("_Readjust"),  RESPONSE_READJUST);
+  gimp_tool_gui_add_button   (tg_tool->gui, _("_Cancel"),    GTK_RESPONSE_CANCEL);
+  gimp_tool_gui_add_button   (tg_tool->gui, ok_button_label, GTK_RESPONSE_OK);
+
   gimp_tool_gui_set_auto_overlay (tg_tool->gui, TRUE);
   gimp_tool_gui_set_default_response (tg_tool->gui, GTK_RESPONSE_OK);
 
   gimp_tool_gui_set_alternative_button_order (tg_tool->gui,
                                               RESPONSE_RESET,
+                                              RESPONSE_READJUST,
                                               GTK_RESPONSE_OK,
                                               GTK_RESPONSE_CANCEL,
                                               -1);
@@ -1231,9 +1235,10 @@ gimp_transform_grid_tool_response (GimpToolGui           *gui,
                                    gint                   response_id,
                                    GimpTransformGridTool *tg_tool)
 {
-  GimpTool          *tool    = GIMP_TOOL (tg_tool);
-  GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tg_tool);
-  GimpDisplay       *display = tool->display;
+  GimpTool                 *tool       = GIMP_TOOL (tg_tool);
+  GimpTransformTool        *tr_tool    = GIMP_TRANSFORM_TOOL (tg_tool);
+  GimpTransformGridOptions *tg_options = GIMP_TRANSFORM_GRID_TOOL_GET_OPTIONS (tg_tool);
+  GimpDisplay              *display    = tool->display;
 
   switch (response_id)
     {
@@ -1249,6 +1254,26 @@ gimp_transform_grid_tool_response (GimpToolGui           *gui,
       gimp_transform_grid_tool_push_internal_undo (tg_tool);
       break;
 
+    case RESPONSE_READJUST:
+      {
+        gboolean direction_linked;
+
+        /*  readjust the transformation info  */
+        GIMP_TRANSFORM_GRID_TOOL_GET_CLASS (tg_tool)->readjust (tg_tool);
+
+        /*  recalculate the tool's transformtion matrix, preserving the overall
+         *  transformation
+         */
+        direction_linked             = tg_options->direction_linked;
+        tg_options->direction_linked = TRUE;
+        gimp_transform_tool_recalc_matrix (tr_tool, display);
+        tg_options->direction_linked = direction_linked;
+
+        /*  push the new info to the undo stack  */
+        gimp_transform_grid_tool_push_internal_undo (tg_tool);
+      }
+      break;
+
     case GTK_RESPONSE_OK:
       g_return_if_fail (display != NULL);
       gimp_tool_control (tool, GIMP_TOOL_ACTION_COMMIT, display);
diff --git a/app/tools/gimptransformgridtool.h b/app/tools/gimptransformgridtool.h
index ab31111ec8..1d5e9537c5 100644
--- a/app/tools/gimptransformgridtool.h
+++ b/app/tools/gimptransformgridtool.h
@@ -82,6 +82,7 @@ struct _GimpTransformGridToolClass
   void             (* dialog)         (GimpTransformGridTool  *tg_tool);
   void             (* dialog_update)  (GimpTransformGridTool  *tg_tool);
   void             (* prepare)        (GimpTransformGridTool  *tg_tool);
+  void             (* readjust)       (GimpTransformGridTool  *tg_tool);
   GimpToolWidget * (* get_widget)     (GimpTransformGridTool  *tg_tool);
   void             (* update_widget)  (GimpTransformGridTool  *tg_tool);
   void             (* widget_changed) (GimpTransformGridTool  *tg_tool);


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