From 88b2ded360f6999b0d0132d3859ce79df847f20a Mon Sep 17 00:00:00 2001 From: gaphor@gmail.com Date: Wed, 04 Feb 2009 12:16:49 +0000 Subject: 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 --- 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 -- cgit v0.9.1