Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar/tutorius/gtkutils.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/sugar/tutorius/gtkutils.py')
-rw-r--r--src/sugar/tutorius/gtkutils.py90
1 files changed, 52 insertions, 38 deletions
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 []