diff options
Diffstat (limited to 'src/sugar/tutorius/gtkutils.py')
-rw-r--r-- | src/sugar/tutorius/gtkutils.py | 95 |
1 files changed, 52 insertions, 43 deletions
diff --git a/src/sugar/tutorius/gtkutils.py b/src/sugar/tutorius/gtkutils.py index 1870dc4..a745b9d 100644 --- a/src/sugar/tutorius/gtkutils.py +++ b/src/sugar/tutorius/gtkutils.py @@ -19,11 +19,6 @@ Utility classes and functions that are gtk related """ import gtk -def activity(activity=None, singleton=[]): - if activity: - singleton.append(activity) - return singleton[0] - def find_widget(base, target_fqdn): """Find a widget by digging into a parent widget's children tree @@ -47,13 +42,13 @@ def find_widget(base, target_fqdn): while len(path) > 0: try: - obj = obj.get_children()[int(path.pop(0))] + obj = get_children(obj)[int(path.pop(0))] except: break return obj -EVENTS = [ +EVENTS = ( "focus", "button-press-event", "enter-notify-event", @@ -61,9 +56,9 @@ EVENTS = [ "key-press-event", "text-selected", "clicked", -] +) -IGNORED_WIDGETS = [ +IGNORED_WIDGETS = ( "GtkVBox", "GtkHBox", "GtkAlignment", @@ -71,9 +66,9 @@ IGNORED_WIDGETS = [ "GtkButton", "GtkToolItem", "GtkToolbar", -] +) -def register_signals_numbered(target, handler, prefix="0", max_depth=None): +def register_signals_numbered(target, handler, prefix="0", max_depth=None, events=None): """ Recursive function to register event handlers on an target and it's children. The event handler is called with an extra @@ -96,25 +91,24 @@ def register_signals_numbered(target, handler, prefix="0", max_depth=None): @returns list of (object, handler_id) """ ret = [] + evts = events or EVENTS #Gtk Containers have a get_children() function - if hasattr(target, "get_children") and \ - hasattr(target.get_children, "__call__"): - children = target.get_children() - for i in range(len(children)): - child = children[i] - if max_depth is None or max_depth > 0: - #Recurse with a prefix on all children - pre = ".".join( \ - [p for p in (prefix, str(i)) if not p is None] - ) - if max_depth is None: - dep = None - else: - dep = max_depth - 1 - ret+=register_signals_numbered(child, handler, pre, dep) + children = get_children(target) + for i in range(len(children)): + child = children[i] + if max_depth is None or max_depth > 0: + #Recurse with a prefix on all children + pre = ".".join( \ + [p for p in (prefix, str(i)) if not p is None] + ) + if max_depth is None: + dep = None + else: + dep = max_depth - 1 + ret+=register_signals_numbered(child, handler, pre, dep, evts) #register events on the target if a widget XXX necessary to check this? if isinstance(target, gtk.Widget): - for sig in EVENTS: + for sig in evts: try: ret.append( \ (target, target.connect(sig, handler, (sig, prefix) ))\ @@ -124,7 +118,7 @@ def register_signals_numbered(target, handler, prefix="0", max_depth=None): return ret -def register_signals(target, handler, prefix=None, max_depth=None): +def register_signals(target, handler, prefix=None, max_depth=None, events=None): """ Recursive function to register event handlers on an target and it's children. The event handler is called with an extra @@ -148,28 +142,27 @@ def register_signals(target, handler, prefix=None, max_depth=None): @returns list of (object, handler_id) """ ret = [] + evts = events or EVENTS #Gtk Containers have a get_children() function - if hasattr(target, "get_children") and \ - hasattr(target.get_children, "__call__"): - for child in target.get_children(): - if max_depth is None or max_depth > 0: - #Recurse with a prefix on all children - pre = ".".join( \ - [p for p in (prefix, target.get_name()) \ - if not (p is None or p in IGNORED_WIDGETS)] \ - ) - if max_depth is None: - dep = None - else: - dep = max_depth - 1 - ret += register_signals(child, handler, pre, dep) + for child in get_children(target): + if max_depth is None or max_depth > 0: + #Recurse with a prefix on all children + pre = ".".join( \ + [p for p in (prefix, target.get_name()) \ + if not (p is None or p in IGNORED_WIDGETS)] \ + ) + if max_depth is None: + dep = None + else: + dep = max_depth - 1 + ret += register_signals(child, handler, pre, dep, evts) name = ".".join( \ [p for p in (prefix, target.get_name()) \ if not (p is None or p in IGNORED_WIDGETS)] \ ) #register events on the target if a widget XXX necessary to check this? if isinstance(target, gtk.Widget): - for sig in EVENTS: + for sig in evts: try: ret.append( \ (target, target.connect(sig, handler, (sig, name) )) \ @@ -179,3 +172,19 @@ def register_signals(target, handler, prefix=None, max_depth=None): return ret +def get_children(widget): + """Lists widget's children""" + #widgets with multiple children + try: + return widget.get_children() + except (AttributeError,TypeError): + pass + + #widgets with a single child + try: + return [widget.get_child(),] + except (AttributeError,TypeError): + pass + + #otherwise return empty list + return [] |