From f14b5e3e41af68866edd706c9d48db61f3e0da4f Mon Sep 17 00:00:00 2001 From: Vincent Vinet Date: Wed, 25 Mar 2009 18:26:30 +0000 Subject: Add the filters and treeview in the editor, and get_children in gtkutils --- (limited to 'src/sugar/tutorius/gtkutils.py') diff --git a/src/sugar/tutorius/gtkutils.py b/src/sugar/tutorius/gtkutils.py index 1870dc4..bbd8863 100644 --- a/src/sugar/tutorius/gtkutils.py +++ b/src/sugar/tutorius/gtkutils.py @@ -47,13 +47,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 +61,9 @@ EVENTS = [ "key-press-event", "text-selected", "clicked", -] +) -IGNORED_WIDGETS = [ +IGNORED_WIDGETS = ( "GtkVBox", "GtkHBox", "GtkAlignment", @@ -71,9 +71,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 +96,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 +123,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 +147,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 +177,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 [] -- cgit v0.9.1