make GtkView accept adjustments for use in scrolled window.
This commit is contained in:
parent
40d102c003
commit
d8b8566df9
@ -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()
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user