[dia] Bug 540210 - Improved zoom behavior for ctrl+mouse wheel



commit dc4fccba65a30dec1c81b4506a0f44fb880ceaa4
Author: Hans Breuer <hans breuer org>
Date:   Wed Aug 4 16:25:29 2010 +0200

    Bug 540210 -  Improved zoom behavior for ctrl+mouse wheel
    
    Basically the patch from Ithai Levi, but implemented in a new function (ddisplay_zoom_centered) to not interfere with other
    zoom use cases.

 app/disp_callbacks.c |    8 +++++---
 app/display.c        |   40 ++++++++++++++++++++++++++++++++++++++++
 app/display.h        |    1 +
 3 files changed, 46 insertions(+), 3 deletions(-)
---
diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c
index a9c863e..19e5127 100644
--- a/app/disp_callbacks.c
+++ b/app/disp_callbacks.c
@@ -570,7 +570,8 @@ ddisplay_canvas_events (GtkWidget *canvas,
                   ddisplay_scroll_left(ddisp);
               else if (sevent->state & GDK_CONTROL_MASK) {
                   ddisplay_untransform_coords(ddisp, (int)sevent->x, (int)sevent->y, &middle.x, &middle.y);
-                  ddisplay_zoom(ddisp, &middle, 2);
+		  /* zooming with the wheel in small steps 1^(1/8) */
+                  ddisplay_zoom_centered(ddisp, &middle, 1.090508);
               }
               else 
                   ddisplay_scroll_up(ddisp);
@@ -579,8 +580,9 @@ ddisplay_canvas_events (GtkWidget *canvas,
               if (sevent->state & GDK_SHIFT_MASK)
                   ddisplay_scroll_right(ddisp);
               else if (sevent->state & GDK_CONTROL_MASK) { 
-                    ddisplay_untransform_coords(ddisp, (int)sevent->x, (int)sevent->y, &middle.x, &middle.y);
-                    ddisplay_zoom(ddisp, &middle, 0.5);
+                  ddisplay_untransform_coords(ddisp, (int)sevent->x, (int)sevent->y, &middle.x, &middle.y);
+		  /* zooming with the wheel in small steps 1/(1^(1/8)) */
+                  ddisplay_zoom_centered(ddisp, &middle, 0.917004);
               }
               else
                   ddisplay_scroll_down(ddisp);
diff --git a/app/display.c b/app/display.c
index baac6a8..2300202 100644
--- a/app/display.c
+++ b/app/display.c
@@ -794,6 +794,46 @@ ddisplay_zoom(DDisplay *ddisp, Point *point, real magnify)
   update_zoom_status (ddisp);
 }
 
+/*
+   When using the mouse wheel button to zoom in and out, it is more 
+   intuitive to maintain the drawing zoom center-point based on the 
+   cursor position. This can help orientation and prevent the drawing 
+   from "jumping" around while zooming in and out.
+ */
+void
+ddisplay_zoom_centered(DDisplay *ddisp, Point *point, real magnify)
+{
+  Rectangle *visible;
+  real width, height;
+  /* cursor position ratios */
+  real rx,ry; 
+
+  if ((ddisp->zoom_factor <= DDISPLAY_MIN_ZOOM) && (magnify<=1.0))
+    return;
+  if ((ddisp->zoom_factor >= DDISPLAY_MAX_ZOOM) && (magnify>=1.0))
+    return;
+
+  visible = &ddisp->visible;
+
+  /* calculate cursor position ratios */
+  rx = (point->x-visible->left)/(visible->right - visible->left);
+  ry = (point->y-visible->top)/(visible->bottom - visible->top);
+
+  width = (visible->right - visible->left)/magnify;
+  height = (visible->bottom - visible->top)/magnify;
+
+  ddisp->zoom_factor *= magnify;
+
+  /* set new origin based on the calculated ratios before zooming */
+  ddisplay_set_origo(ddisp, point->x-(width*rx),point->y-(height*ry));
+
+  ddisplay_update_scrollbars(ddisp);
+  ddisplay_add_update_all(ddisp);
+  ddisplay_flush(ddisp);
+
+  update_zoom_status (ddisp);
+}
+
 /** Set the display's snap-to-grid setting, updating menu and button
  * in the process */
 void
diff --git a/app/display.h b/app/display.h
index 46427b4..19b38bf 100644
--- a/app/display.h
+++ b/app/display.h
@@ -141,6 +141,7 @@ void ddisplay_set_origo(DDisplay *ddisp,
 			coord x, coord y);
 void ddisplay_zoom(DDisplay *ddisp, Point *point,
 		   real zoom_factor);
+void ddisplay_zoom_centered(DDisplay *ddisp, Point *point, real magnify);
 void ddisplay_set_snap_to_grid(DDisplay *ddisp, gboolean snap);
 void ddisplay_set_snap_to_objects(DDisplay *ddisp, gboolean magnetic);
 void ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer);



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