diff options
author | Simon Feltman <sfeltman@src.gnome.org> | 2014-05-27 19:24:20 -0700 |
---|---|---|
committer | Simon Feltman <sfeltman@src.gnome.org> | 2014-05-27 21:23:52 -0700 |
commit | ba8380d093d6f84eabcf18c02b248aae8ffc3cf5 (patch) | |
tree | 9369be9068d34bd0af1aa4fc4af9edd999f235cf /gi/overrides/Gtk.py | |
parent | f127fabe9664b243774b76a68e6fce5986aa23a0 (diff) | |
download | pygobject-ba8380d093d6f84eabcf18c02b248aae8ffc3cf5.tar.gz |
refactor: Move builder connection utilities outside of Builder class
Move _extract_handler_and_args and _builder_connect_callback into module
scope for re-use by GTK+ Composite Templates.
https://bugzilla.gnome.org/show_bug.cgi?id=701843
Diffstat (limited to 'gi/overrides/Gtk.py')
-rw-r--r-- | gi/overrides/Gtk.py | 83 |
1 files changed, 44 insertions, 39 deletions
diff --git a/gi/overrides/Gtk.py b/gi/overrides/Gtk.py index 561bdf04..05ef4039 100644 --- a/gi/overrides/Gtk.py +++ b/gi/overrides/Gtk.py @@ -72,6 +72,49 @@ def _construct_target_list(targets): __all__.append('_construct_target_list') +def _extract_handler_and_args(obj_or_map, handler_name): + handler = None + if isinstance(obj_or_map, collections.Mapping): + handler = obj_or_map.get(handler_name, None) + else: + handler = getattr(obj_or_map, handler_name, None) + + if handler is None: + raise AttributeError('Handler %s not found' % handler_name) + + args = () + if isinstance(handler, collections.Sequence): + if len(handler) == 0: + raise TypeError("Handler %s tuple can not be empty" % handler) + args = handler[1:] + handler = handler[0] + + elif not _callable(handler): + raise TypeError('Handler %s is not a method, function or tuple' % handler) + + return handler, args + + +# Exposed for unit-testing. +__all__.append('_extract_handler_and_args') + + +def _builder_connect_callback(builder, gobj, signal_name, handler_name, connect_obj, flags, obj_or_map): + handler, args = _extract_handler_and_args(obj_or_map, handler_name) + + after = flags & GObject.ConnectFlags.AFTER + if connect_obj is not None: + if after: + gobj.connect_object_after(signal_name, handler, connect_obj, *args) + else: + gobj.connect_object(signal_name, handler, connect_obj, *args) + else: + if after: + gobj.connect_after(signal_name, handler, *args) + else: + gobj.connect(signal_name, handler, *args) + + class Widget(Gtk.Widget): translate_coordinates = strip_boolean_result(Gtk.Widget.translate_coordinates) @@ -396,29 +439,6 @@ __all__.append('MenuItem') class Builder(Gtk.Builder): - @staticmethod - def _extract_handler_and_args(obj_or_map, handler_name): - handler = None - if isinstance(obj_or_map, collections.Mapping): - handler = obj_or_map.get(handler_name, None) - else: - handler = getattr(obj_or_map, handler_name, None) - - if handler is None: - raise AttributeError('Handler %s not found' % handler_name) - - args = () - if isinstance(handler, collections.Sequence): - if len(handler) == 0: - raise TypeError("Handler %s tuple can not be empty" % handler) - args = handler[1:] - handler = handler[0] - - elif not _callable(handler): - raise TypeError('Handler %s is not a method, function or tuple' % handler) - - return handler, args - def connect_signals(self, obj_or_map): """Connect signals specified by this builder to a name, handler mapping. @@ -431,22 +451,7 @@ class Builder(Gtk.Builder): builder.connect_signals({'on_clicked': (on_clicked, arg1, arg2)}) """ - def _full_callback(builder, gobj, signal_name, handler_name, connect_obj, flags, obj_or_map): - handler, args = self._extract_handler_and_args(obj_or_map, handler_name) - - after = flags & GObject.ConnectFlags.AFTER - if connect_obj is not None: - if after: - gobj.connect_object_after(signal_name, handler, connect_obj, *args) - else: - gobj.connect_object(signal_name, handler, connect_obj, *args) - else: - if after: - gobj.connect_after(signal_name, handler, *args) - else: - gobj.connect(signal_name, handler, *args) - - self.connect_signals_full(_full_callback, obj_or_map) + self.connect_signals_full(_builder_connect_callback, obj_or_map) def add_from_string(self, buffer): if not isinstance(buffer, _basestring): |