[gimp] app: cancel the align tool on Escape, and some more cleanup



commit 2468f9fd557af1a74d1d303ce07b6b772312de1f
Author: Michael Natterer <mitch gimp org>
Date:   Tue Mar 29 15:16:17 2011 +0200

    app: cancel the align tool on Escape, and some more cleanup

 app/tools/gimpaligntool.c |  159 ++++++++++++++++++++++++++-------------------
 app/tools/gimpaligntool.h |    4 +-
 2 files changed, 92 insertions(+), 71 deletions(-)
---
diff --git a/app/tools/gimpaligntool.c b/app/tools/gimpaligntool.c
index a7378ef..5c30bfb 100644
--- a/app/tools/gimpaligntool.c
+++ b/app/tools/gimpaligntool.c
@@ -19,6 +19,7 @@
 
 #include <gegl.h>
 #include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
 
 #include "libgimpmath/gimpmath.h"
 #include "libgimpwidgets/gimpwidgets.h"
@@ -57,52 +58,55 @@
 
 /*  local function prototypes  */
 
-static void   gimp_align_tool_constructed    (GObject               *object);
-static void   gimp_align_tool_dispose        (GObject               *object);
-
-static void   gimp_align_tool_control        (GimpTool              *tool,
-                                              GimpToolAction         action,
-                                              GimpDisplay           *display);
-static void   gimp_align_tool_button_press   (GimpTool              *tool,
-                                              const GimpCoords      *coords,
-                                              guint32                time,
-                                              GdkModifierType        state,
-                                              GimpButtonPressType    press_type,
-                                              GimpDisplay           *display);
-static void   gimp_align_tool_button_release (GimpTool              *tool,
-                                              const GimpCoords      *coords,
-                                              guint32                time,
-                                              GdkModifierType        state,
-                                              GimpButtonReleaseType  release_type,
-                                              GimpDisplay           *display);
-static void   gimp_align_tool_motion         (GimpTool              *tool,
-                                              const GimpCoords      *coords,
-                                              guint32                time,
-                                              GdkModifierType        state,
-                                              GimpDisplay           *display);
-static void   gimp_align_tool_oper_update    (GimpTool              *tool,
-                                              const GimpCoords      *coords,
-                                              GdkModifierType        state,
-                                              gboolean               proximity,
-                                              GimpDisplay           *display);
-static void   gimp_align_tool_status_update  (GimpTool              *tool,
-                                              GimpDisplay           *display,
-                                              GdkModifierType        state,
-                                              gboolean               proximity);
-static void   gimp_align_tool_cursor_update  (GimpTool              *tool,
-                                              const GimpCoords      *coords,
-                                              GdkModifierType        state,
-                                              GimpDisplay           *display);
-
-static void   gimp_align_tool_draw           (GimpDrawTool          *draw_tool);
-
-static void   gimp_align_tool_halt           (GimpAlignTool         *align_tool);
-static void   gimp_align_tool_align          (GimpAlignTool         *align_tool,
-                                              GimpAlignmentType      align_type);
-
-static void   gimp_align_tool_object_removed (GObject               *object,
-                                              GimpAlignTool         *align_tool);
-static void   gimp_align_tool_clear_selected (GimpAlignTool         *align_tool);
+static void     gimp_align_tool_constructed    (GObject               *object);
+static void     gimp_align_tool_dispose        (GObject               *object);
+
+static void     gimp_align_tool_control        (GimpTool              *tool,
+                                                GimpToolAction         action,
+                                                GimpDisplay           *display);
+static void     gimp_align_tool_button_press   (GimpTool              *tool,
+                                                const GimpCoords      *coords,
+                                                guint32                time,
+                                                GdkModifierType        state,
+                                                GimpButtonPressType    press_type,
+                                                GimpDisplay           *display);
+static void     gimp_align_tool_button_release (GimpTool              *tool,
+                                                const GimpCoords      *coords,
+                                                guint32                time,
+                                                GdkModifierType        state,
+                                                GimpButtonReleaseType  release_type,
+                                                GimpDisplay           *display);
+static void     gimp_align_tool_motion         (GimpTool              *tool,
+                                                const GimpCoords      *coords,
+                                                guint32                time,
+                                                GdkModifierType        state,
+                                                GimpDisplay           *display);
+static gboolean gimp_align_tool_key_press      (GimpTool              *tool,
+                                                GdkEventKey           *kevent,
+                                                GimpDisplay           *display);
+static void     gimp_align_tool_oper_update    (GimpTool              *tool,
+                                                const GimpCoords      *coords,
+                                                GdkModifierType        state,
+                                                gboolean               proximity,
+                                                GimpDisplay           *display);
+static void     gimp_align_tool_status_update  (GimpTool              *tool,
+                                                GimpDisplay           *display,
+                                                GdkModifierType        state,
+                                                gboolean               proximity);
+static void     gimp_align_tool_cursor_update  (GimpTool              *tool,
+                                                const GimpCoords      *coords,
+                                                GdkModifierType        state,
+                                                GimpDisplay           *display);
+
+static void     gimp_align_tool_draw           (GimpDrawTool          *draw_tool);
+
+static void     gimp_align_tool_halt           (GimpAlignTool         *align_tool);
+static void     gimp_align_tool_align          (GimpAlignTool         *align_tool,
+                                                GimpAlignmentType      align_type);
+
+static void     gimp_align_tool_object_removed (GObject               *object,
+                                                GimpAlignTool         *align_tool);
+static void     gimp_align_tool_clear_selected (GimpAlignTool         *align_tool);
 
 
 G_DEFINE_TYPE (GimpAlignTool, gimp_align_tool, GIMP_TYPE_DRAW_TOOL)
@@ -141,6 +145,7 @@ gimp_align_tool_class_init (GimpAlignToolClass *klass)
   tool_class->button_press   = gimp_align_tool_button_press;
   tool_class->button_release = gimp_align_tool_button_release;
   tool_class->motion         = gimp_align_tool_motion;
+  tool_class->key_press      = gimp_align_tool_key_press;
   tool_class->oper_update    = gimp_align_tool_oper_update;
   tool_class->cursor_update  = gimp_align_tool_cursor_update;
 
@@ -152,10 +157,7 @@ gimp_align_tool_init (GimpAlignTool *align_tool)
 {
   GimpTool *tool = GIMP_TOOL (align_tool);
 
-  align_tool->function         = ALIGN_TOOL_IDLE;
-  align_tool->selected_objects = NULL;
-
-  align_tool->align_type  = GIMP_ALIGN_LEFT;
+  align_tool->function = ALIGN_TOOL_IDLE;
 
   gimp_tool_control_set_snap_to     (tool->control, FALSE);
   gimp_tool_control_set_precision   (tool->control,
@@ -228,8 +230,8 @@ gimp_align_tool_button_press (GimpTool            *tool,
 
   gimp_tool_control_activate (tool->control);
 
-  align_tool->x1 = align_tool->x0 = coords->x;
-  align_tool->y1 = align_tool->y0 = coords->y;
+  align_tool->x2 = align_tool->x1 = coords->x;
+  align_tool->y2 = align_tool->y1 = coords->y;
 
   if (! gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tool)))
     gimp_draw_tool_start (GIMP_DRAW_TOOL (tool), display);
@@ -264,8 +266,8 @@ gimp_align_tool_button_release (GimpTool              *tool,
 
   if (release_type == GIMP_BUTTON_RELEASE_CANCEL)
     {
-      align_tool->x1 = align_tool->x0;
-      align_tool->y1 = align_tool->y0;
+      align_tool->x2 = align_tool->x1;
+      align_tool->y2 = align_tool->y1;
 
       gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
       return;
@@ -280,8 +282,8 @@ gimp_align_tool_button_release (GimpTool              *tool,
   /* if mouse has moved less than EPSILON pixels since button press,
    * select the nearest thing, otherwise make a rubber-band rectangle
    */
-  if (hypot (coords->x - align_tool->x0,
-             coords->y - align_tool->y0) < EPSILON)
+  if (hypot (coords->x - align_tool->x1,
+             coords->y - align_tool->y1) < EPSILON)
     {
       GimpVectors *vectors;
       GimpGuide   *guide;
@@ -333,10 +335,10 @@ gimp_align_tool_button_release (GimpTool              *tool,
     }
   else  /* FIXME: look for vectors too */
     {
-      gint   X0 = MIN (coords->x, align_tool->x0);
-      gint   X1 = MAX (coords->x, align_tool->x0);
-      gint   Y0 = MIN (coords->y, align_tool->y0);
-      gint   Y1 = MAX (coords->y, align_tool->y0);
+      gint   X0 = MIN (coords->x, align_tool->x1);
+      gint   X1 = MAX (coords->x, align_tool->x1);
+      gint   Y0 = MIN (coords->y, align_tool->y1);
+      gint   Y1 = MAX (coords->y, align_tool->y1);
       GList *all_layers;
       GList *list;
 
@@ -378,8 +380,8 @@ gimp_align_tool_button_release (GimpTool              *tool,
                                   align_tool->selected_objects != NULL);
     }
 
-  align_tool->x1 = align_tool->x0;
-  align_tool->y1 = align_tool->y0;
+  align_tool->x2 = align_tool->x1;
+  align_tool->y2 = align_tool->y1;
 
   gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
 }
@@ -395,12 +397,33 @@ gimp_align_tool_motion (GimpTool         *tool,
 
   gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
 
-  align_tool->x1 = coords->x;
-  align_tool->y1 = coords->y;
+  align_tool->x2 = coords->x;
+  align_tool->y2 = coords->y;
 
   gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
 }
 
+static gboolean
+gimp_align_tool_key_press (GimpTool    *tool,
+                           GdkEventKey *kevent,
+                           GimpDisplay *display)
+{
+  if (display == tool->display)
+    {
+      switch (kevent->keyval)
+        {
+        case GDK_KEY_Escape:
+          gimp_align_tool_halt (GIMP_ALIGN_TOOL (tool));
+          return TRUE;
+
+        default:
+          break;
+        }
+    }
+
+  return FALSE;
+}
+
 static void
 gimp_align_tool_oper_update (GimpTool         *tool,
                              const GimpCoords *coords,
@@ -587,10 +610,10 @@ gimp_align_tool_draw (GimpDrawTool *draw_tool)
   gint           x, y, w, h;
 
   /* draw rubber-band rectangle */
-  x = MIN (align_tool->x1, align_tool->x0);
-  y = MIN (align_tool->y1, align_tool->y0);
-  w = MAX (align_tool->x1, align_tool->x0) - x;
-  h = MAX (align_tool->y1, align_tool->y0) - y;
+  x = MIN (align_tool->x2, align_tool->x1);
+  y = MIN (align_tool->y2, align_tool->y1);
+  w = MAX (align_tool->x2, align_tool->x1) - x;
+  h = MAX (align_tool->y2, align_tool->y1) - y;
 
   gimp_draw_tool_add_rectangle (draw_tool, FALSE, x, y, w, h);
 
diff --git a/app/tools/gimpaligntool.h b/app/tools/gimpaligntool.h
index cc9035b..42090bc 100644
--- a/app/tools/gimpaligntool.h
+++ b/app/tools/gimpaligntool.h
@@ -56,9 +56,7 @@ struct _GimpAlignTool
   GimpAlignToolFunction  function;
   GList                 *selected_objects;
 
-  GimpAlignmentType      align_type;
-
-  gint                   x0, y0, x1, y1;   /* rubber-band rectangle */
+  gint                   x1, y1, x2, y2;   /* rubber-band rectangle */
 
   gboolean               set_reference;
 };



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