[dia] Bug 540210 - Improved zoom behavior for ctrl+mouse wheel
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] Bug 540210 - Improved zoom behavior for ctrl+mouse wheel
- Date: Wed, 4 Aug 2010 14:54:51 +0000 (UTC)
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]