diff --git a/gaphas/tests/test_view.py b/gaphas/tests/test_view.py index 7cee4c8..d9a3ae8 100644 --- a/gaphas/tests/test_view.py +++ b/gaphas/tests/test_view.py @@ -186,7 +186,28 @@ class ViewTestCase(unittest.TestCase): assert not box._matrix_v2i.has_key(view) - + def test_scroll_adjustments_signal(self): + def handler(self, hadj, vadj): + self.handled = True + + sc = gtk.ScrolledWindow() + view = GtkView(Canvas()) + view.connect('set-scroll-adjustments', handler) + sc.add(view) + + assert view.handled + + + def test_scroll_adjustments(self): + sc = gtk.ScrolledWindow() + view = GtkView(Canvas()) + sc.add(view) + + print sc.get_hadjustment(), view.hadjustment + assert sc.get_hadjustment() is view.hadjustment + assert sc.get_vadjustment() is view.vadjustment + + if __name__ == '__main__': unittest.main() diff --git a/gaphas/view.py b/gaphas/view.py index 876e563..f93acf9 100644 --- a/gaphas/view.py +++ b/gaphas/view.py @@ -375,6 +375,8 @@ class GtkView(gtk.DrawingArea, View): # Signals: emited after the change takes effect. __gsignals__ = { + 'set-scroll-adjustments': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, + (gtk.Adjustment, gtk.Adjustment)), 'dropzone-changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), 'hover-changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, @@ -406,10 +408,12 @@ class GtkView(gtk.DrawingArea, View): | gtk.gdk.KEY_RELEASE_MASK | gtk.gdk.SCROLL_MASK) - self._hadjustment = hadjustment or gtk.Adjustment() - self._vadjustment = vadjustment or gtk.Adjustment() - self._hadjustment.connect('value-changed', self.on_adjustment_changed) - self._vadjustment.connect('value-changed', self.on_adjustment_changed) + self._hadjustment = None + self._vadjustment = None + self._hadjustment_handler_id = None + self._vadjustment_handler_id = None + + self.emit('set-scroll-adjustments', hadjustment, vadjustment) self._tool = DefaultTool() @@ -467,6 +471,27 @@ class GtkView(gtk.DrawingArea, View): vadjustment = property(lambda s: s._vadjustment) + + def do_set_scroll_adjustments(self, hadjustment, vadjustment): + print 'do_set_scroll_adjustments', hadjustment, vadjustment + if self._hadjustment_handler_id: + self._hadjustment.disconnect(self._hadjustment_handler_id) + self._hadjustment_handler_id = None + if self._vadjustment_handler_id: + self._vadjustment.disconnect(self._vadjustment_handler_id) + self._vadjustment_handler_id = None + + self._hadjustment = hadjustment or gtk.Adjustment() + self._vadjustment = vadjustment or gtk.Adjustment() + + self._hadjustment_handler_id = \ + self._hadjustment.connect('value-changed', + self.on_adjustment_changed) + self._vadjustment_handler_id = \ + self._vadjustment.connect('value-changed', + self.on_adjustment_changed) + self.update_adjustments() + def zoom(self, factor): """ @@ -542,7 +567,7 @@ class GtkView(gtk.DrawingArea, View): 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 + # Okay, now the zoom factor is very large or something a = self.allocation super(GtkView, self).queue_draw_area(0, 0, a.width, a.height) @@ -753,4 +778,13 @@ class GtkView(gtk.DrawingArea, View): self.queue_draw_refresh() +# Set a signal to set adjustments. This way a ScrolledWindow can set its own +# Adjustment objects on the View. Otherwise a warning is shown: +# +# GtkWarning: gtk_scrolled_window_add(): cannot add non scrollable widget use +# gtk_scrolled_window_add_with_viewport() instead + +GtkView.set_set_scroll_adjustments_signal("set-scroll-adjustments") + + # vim: sw=4:et:ai