Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgaphor@gmail.com <gaphor@gmail.com@a8418922-720d-0410-834f-a69b97ada669>2009-02-04 12:16:49 (GMT)
committer gaphor@gmail.com <gaphor@gmail.com@a8418922-720d-0410-834f-a69b97ada669>2009-02-04 12:16:49 (GMT)
commit88b2ded360f6999b0d0132d3859ce79df847f20a (patch)
treece3903147a656f26e1e6b42c1f8c4588e87cd19d
parent3db1b9d4883c4e23c45d7840d1bd28887267958f (diff)
Fixed the ZoomTool. Also the way offsets were handled in the Views
on_adjustment_changed method was not right, so when zoomed in there were scrolling problems. git-svn-id: http://svn.devjavu.com/gaphor/gaphas/trunk@2694 a8418922-720d-0410-834f-a69b97ada669
-rw-r--r--gaphas/tool.py19
-rw-r--r--gaphas/view.py34
2 files changed, 31 insertions, 22 deletions
diff --git a/gaphas/tool.py b/gaphas/tool.py
index 1525937..e2beda6 100644
--- a/gaphas/tool.py
+++ b/gaphas/tool.py
@@ -676,7 +676,6 @@ class PanTool(Tool):
view._matrix.translate(dx/view._matrix[0], dy/view._matrix[3])
# Make sure everything's updated
view.request_update((), view._canvas.get_all_items())
- view.update_adjustments()
self.x0 = self.x1
self.y0 = self.y1
return True
@@ -697,7 +696,6 @@ class PanTool(Tool):
elif direction == gdk.SCROLL_DOWN:
view._matrix.translate(0, -self.speed/view._matrix[3])
view.request_update((), view._canvas.get_all_items())
- view.update_adjustments()
return True
@@ -716,6 +714,7 @@ class ZoomTool(Tool):
self.lastdiff = 0;
def on_button_press(self, context, event):
+ print 'ZOOM', event.state
if event.button == 2 \
and event.state & ZOOM_MASK == ZOOM_VALUE:
print "GRABBING"
@@ -747,14 +746,13 @@ class ZoomTool(Tool):
else:
factor = 0.9
- view._matrix.translate(-ox, -oy)
- view._matrix.scale(factor, factor)
- view._matrix.translate(+ox, +oy)
+ m = view.matrix
+ m.translate(-ox, -oy)
+ m.scale(factor, factor)
+ m.translate(+ox, +oy)
# Make sure everything's updated
- map(view.update_matrix, view._canvas.get_all_items())
- view.request_update(view._canvas.get_all_items())
- view.update_scrollbars_from_matrix(view.hadjustment,view.vadjustment)
+ view.request_update((), view._canvas.get_all_items())
self.lastdiff = dy;
return True
@@ -774,14 +772,11 @@ class ZoomTool(Tool):
view._matrix.scale(factor, factor)
view._matrix.translate(+ox, +oy)
# Make sure everything's updated
- map(view.update_matrix, view._canvas.get_all_items())
- view.request_update(view._canvas.get_all_items())
- view.update_scrollbars_from_matrix(view.hadjustment,view.vadjustment)
+ view.request_update((), view._canvas.get_all_items())
context.ungrab()
return True
-
class PlacementTool(Tool):
def __init__(self, factory, handle_tool, handle_index):
diff --git a/gaphas/view.py b/gaphas/view.py
index c949922..f704152 100644
--- a/gaphas/view.py
+++ b/gaphas/view.py
@@ -242,11 +242,12 @@ class View(object):
"""
Zoom in/out by factor @factor.
"""
+ # TODO: should the scale factor be clipped?
self._matrix.scale(factor, factor)
# Make sure everything's updated
- map(self.update_matrix, self._canvas.get_all_items())
- self.request_update(self._canvas.get_all_items())
+ #map(self.update_matrix, self._canvas.get_all_items())
+ self.request_update((), self._canvas.get_all_items())
def set_item_bounding_box(self, item, bounds):
@@ -497,10 +498,6 @@ class GtkView(gtk.DrawingArea, View):
# set upper limits
hadjustment.upper, vadjustment.upper = u.x1, u.y1
- # set position
- if v.x != hadjustment.value or v.y != vadjustment.value:
- hadjustment.value, vadjustment.value = v.x, v.y
-
# set page size
aw, ah = self.allocation.width, self.allocation.height
hadjustment.page_size = aw
@@ -512,6 +509,10 @@ class GtkView(gtk.DrawingArea, View):
vadjustment.page_increment = ah
vadjustment.step_increment = ah / 10
+ # set position
+ if v.x != hadjustment.value or v.y != vadjustment.value:
+ hadjustment.value, vadjustment.value = v.x, v.y
+
def queue_draw_item(self, *items):
"""
@@ -534,7 +535,12 @@ class GtkView(gtk.DrawingArea, View):
"""
Wrap draw_area to convert all values to ints.
"""
- super(GtkView, self).queue_draw_area(int(x), int(y), int(w+1), int(h+1))
+ try:
+ super(GtkView, self).queue_draw_area(int(x), int(y), int(w+1), int(h+1))
+ except OverflowError:
+ # Okay, now the zoom factr is very large or something
+ a = self.allocation
+ super(GtkView, self).queue_draw_area(0, 0, a.width, a.height)
def queue_draw_refresh(self):
@@ -725,10 +731,18 @@ class GtkView(gtk.DrawingArea, View):
Change the transformation matrix of the view to reflect the
value of the x/y adjustment (scrollbar).
"""
+ if adj.value == 0.0: return
+
+ # Can not use self._matrix.translate( - adj.value , 0) here, since
+ # the translate method effectively does a m * self._matrix, which
+ # will result in the translation being multiplied by the orig. matrix
+
+ m = Matrix()
if adj is self._hadjustment:
- self._matrix.translate( - adj.value , 0)
+ m.translate( - adj.value, 0)
elif adj is self._vadjustment:
- self._matrix.translate(0, - adj.value)
+ m.translate(0, - adj.value)
+ self._matrix *= m
# Force recalculation of the bounding boxes:
self.request_update((), self._canvas.get_all_items())
@@ -736,4 +750,4 @@ class GtkView(gtk.DrawingArea, View):
self.queue_draw_refresh()
-# vim: sw=4:et:
+# vim: sw=4:et:ai