Browse code

Make mouse wheel zoom around the mouse cursor rather than center of window.

This feels much more natural and is how, e.g. Eye of GNOME implements
mouse wheel zoom.

From: Marius Gedminas <marius@gedmin.as>

Jose.R.Fonseca authored on 02/09/2008 00:18:45
Showing 1 changed files

  • xdot.py index 68b1f4f..c17b319 100755
... ...
@@ -990,10 +990,17 @@ class DotWidget(gtk.DrawingArea):
990 990
             self.highlight = items
991 991
             self.queue_draw()
992 992
 
993
-    def zoom_image(self, zoom_ratio, center=False):
993
+    def zoom_image(self, zoom_ratio, center=False, pos=None):
994 994
         if center:
995 995
             self.x = self.graph.width/2
996 996
             self.y = self.graph.height/2
997
+        elif pos is not None:
998
+            rect = self.get_allocation()
999
+            x, y = pos
1000
+            x -= 0.5*rect.width
1001
+            y -= 0.5*rect.height
1002
+            self.x += x / self.zoom_ratio - x / zoom_ratio
1003
+            self.y += y / self.zoom_ratio - y / zoom_ratio
997 1004
         self.zoom_ratio = zoom_ratio
998 1005
         self.zoom_to_fit_on_resize = False
999 1006
         self.queue_draw()
... ...
@@ -1126,10 +1133,12 @@ class DotWidget(gtk.DrawingArea):
1126 1133
 
1127 1134
     def on_area_scroll_event(self, area, event):
1128 1135
         if event.direction == gtk.gdk.SCROLL_UP:
1129
-            self.zoom_image(self.zoom_ratio * self.ZOOM_INCREMENT)
1136
+            self.zoom_image(self.zoom_ratio * self.ZOOM_INCREMENT,
1137
+                            pos=(event.x, event.y))
1130 1138
             return True
1131 1139
         if event.direction == gtk.gdk.SCROLL_DOWN:
1132
-            self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT)
1140
+            self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT,
1141
+                            pos=(event.x, event.y))
1133 1142
             return True
1134 1143
         return False
1135 1144