[gimp] app: allow to zoom with middle mouse button + control + drag up/down



commit b1ca8a161c81c398d5fb602064524ec3daeb437e
Author: Michael Natterer <mitch gimp org>
Date:   Wed Nov 16 14:41:30 2016 +0100

    app: allow to zoom with middle mouse button + control + drag up/down

 app/display/gimpdisplayshell-scale.c       |   27 +++++++++++++++++++++++++++
 app/display/gimpdisplayshell-scale.h       |    4 ++++
 app/display/gimpdisplayshell-tool-events.c |   13 ++++++++++++-
 app/display/gimpdisplayshell.h             |    1 +
 4 files changed, 44 insertions(+), 1 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-scale.c b/app/display/gimpdisplayshell-scale.c
index d193a15..883805b 100644
--- a/app/display/gimpdisplayshell-scale.c
+++ b/app/display/gimpdisplayshell-scale.c
@@ -628,6 +628,33 @@ gimp_display_shell_scale_by_values (GimpDisplayShell *shell,
   gimp_display_shell_resume (shell);
 }
 
+void
+gimp_display_shell_scale_drag (GimpDisplayShell *shell,
+                               gdouble           delta_x,
+                               gdouble           delta_y)
+{
+  gdouble scale;
+
+  g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+  scale = gimp_zoom_model_get_factor (shell->zoom);
+
+  if (delta_y > 0)
+    {
+      gimp_display_shell_scale (shell,
+                                GIMP_ZOOM_TO,
+                                scale * 1.1,
+                                GIMP_ZOOM_FOCUS_RETAIN_CENTERING_ELSE_BEST_GUESS);
+    }
+  else if (delta_y < 0)
+    {
+      gimp_display_shell_scale (shell,
+                                GIMP_ZOOM_TO,
+                                scale * 0.9,
+                                GIMP_ZOOM_FOCUS_RETAIN_CENTERING_ELSE_BEST_GUESS);
+    }
+}
+
 /**
  * gimp_display_shell_scale_shrink_wrap:
  * @shell: the #GimpDisplayShell
diff --git a/app/display/gimpdisplayshell-scale.h b/app/display/gimpdisplayshell-scale.h
index 836fbac..bb1f0ac 100644
--- a/app/display/gimpdisplayshell-scale.h
+++ b/app/display/gimpdisplayshell-scale.h
@@ -60,6 +60,10 @@ void     gimp_display_shell_scale_by_values          (GimpDisplayShell *shell,
                                                       gint              offset_y,
                                                       gboolean          resize_window);
 
+void     gimp_display_shell_scale_drag               (GimpDisplayShell *shell,
+                                                      gdouble           delta_x,
+                                                      gdouble           delta_y);
+
 void     gimp_display_shell_scale_shrink_wrap        (GimpDisplayShell *shell,
                                                       gboolean          grow_only);
 void     gimp_display_shell_scale_resize             (GimpDisplayShell *shell,
diff --git a/app/display/gimpdisplayshell-tool-events.c b/app/display/gimpdisplayshell-tool-events.c
index de794af..45ec470 100644
--- a/app/display/gimpdisplayshell-tool-events.c
+++ b/app/display/gimpdisplayshell-tool-events.c
@@ -888,6 +888,12 @@ gimp_display_shell_canvas_tool_events (GtkWidget        *canvas,
                                                 y,
                                                 constrain);
               }
+            else if (shell->scaling)
+              {
+                gimp_display_shell_scale_drag (shell,
+                                               shell->scroll_last_x - x,
+                                               shell->scroll_last_y - y);
+              }
             else
               {
                 gimp_display_shell_scroll (shell,
@@ -1502,12 +1508,16 @@ gimp_display_shell_start_scrolling (GimpDisplayShell *shell,
   shell->scrolling         = TRUE;
   shell->scroll_last_x     = x;
   shell->scroll_last_y     = y;
-  shell->rotating          = (state & GDK_SHIFT_MASK) ? TRUE : FALSE;
+  shell->rotating          = (state & gimp_get_extend_selection_mask ()) ? TRUE : FALSE;
   shell->rotate_drag_angle = shell->rotate_angle;
+  shell->scaling           = (state & gimp_get_toggle_behavior_mask ()) ? TRUE : FALSE;
 
   if (shell->rotating)
     gimp_display_shell_set_override_cursor (shell,
                                             (GimpCursorType) GDK_EXCHANGE);
+  if (shell->scaling)
+    gimp_display_shell_set_override_cursor (shell,
+                                            (GimpCursorType) GIMP_CURSOR_ZOOM);
   else
     gimp_display_shell_set_override_cursor (shell,
                                             (GimpCursorType) GDK_FLEUR);
@@ -1526,6 +1536,7 @@ gimp_display_shell_stop_scrolling (GimpDisplayShell *shell,
   shell->scroll_last_y     = 0;
   shell->rotating          = FALSE;
   shell->rotate_drag_angle = 0.0;
+  shell->scaling           = FALSE;
 
   gimp_display_shell_pointer_ungrab (shell, event);
 }
diff --git a/app/display/gimpdisplayshell.h b/app/display/gimpdisplayshell.h
index be467e1..147796e 100644
--- a/app/display/gimpdisplayshell.h
+++ b/app/display/gimpdisplayshell.h
@@ -197,6 +197,7 @@ struct _GimpDisplayShell
   gint               scroll_last_y;
   gboolean           rotating;
   gdouble            rotate_drag_angle;
+  gboolean           scaling;
   gpointer           scroll_info;
 
   GeglBuffer        *mask;


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