|
@@ -22,6 +22,24 @@ class Widget(Positionable, Logger):
|
|
|
self.parent = None
|
|
self.parent = None
|
|
|
self.children = []
|
|
self.children = []
|
|
|
|
|
|
|
|
|
|
+ def get_offset(self, offset_parent=None):
|
|
|
|
|
+ """
|
|
|
|
|
+ Get the offset position relative to an offset parent. If no offset
|
|
|
|
|
+ parent is specified, the parent widget is used. If no parent widget is
|
|
|
|
|
+ assigned, return absolute coordinates.
|
|
|
|
|
+ """
|
|
|
|
|
+ x, y = self.get_position()
|
|
|
|
|
+
|
|
|
|
|
+ if not offset_parent:
|
|
|
|
|
+ if not self.parent:
|
|
|
|
|
+ return x, y
|
|
|
|
|
+
|
|
|
|
|
+ offset_parent = self.parent
|
|
|
|
|
+
|
|
|
|
|
+ ox, oy = offset_parent.get_position()
|
|
|
|
|
+
|
|
|
|
|
+ return x - ox, y - oy
|
|
|
|
|
+
|
|
|
def add_widget(self, widget):
|
|
def add_widget(self, widget):
|
|
|
"""
|
|
"""
|
|
|
Add a new child widget.
|
|
Add a new child widget.
|
|
@@ -114,19 +132,30 @@ class Widget(Positionable, Logger):
|
|
|
"""
|
|
"""
|
|
|
raise NotImplementedError
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
- def handle_event(self, event):
|
|
|
|
|
|
|
+ def delegate_event(self, event):
|
|
|
"""
|
|
"""
|
|
|
- Delegate a triggered event to gesture trackers and child widgets. A
|
|
|
|
|
- handler can stop the delegation of the event, preventing it from being
|
|
|
|
|
- delegated to child widgets.
|
|
|
|
|
|
|
+ Delegate a triggered event to child widgets. If a child stops
|
|
|
|
|
+ propagation
|
|
|
"""
|
|
"""
|
|
|
|
|
+ if not self.children:
|
|
|
|
|
+ self.propagate_event(event)
|
|
|
|
|
+ else:
|
|
|
|
|
+ for child in self.children:
|
|
|
|
|
+ if child.contains_event(event):
|
|
|
|
|
+ child.delegate_event(event)
|
|
|
|
|
+
|
|
|
|
|
+ if event.is_propagation_stopped():
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ def propagate_event(self, event):
|
|
|
for tracker in set(self.trackers.itervalues()):
|
|
for tracker in set(self.trackers.itervalues()):
|
|
|
tracker.handle_event(event)
|
|
tracker.handle_event(event)
|
|
|
|
|
|
|
|
- if not event.is_delegation_stopped():
|
|
|
|
|
- for child in self.children:
|
|
|
|
|
- if child.contains_event(event):
|
|
|
|
|
- child.handle_event(event)
|
|
|
|
|
|
|
+ if event.is_immediate_propagation_stopped():
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ if self.parent and not event.is_propagation_stopped():
|
|
|
|
|
+ self.parent.propagate_event(event)
|
|
|
|
|
|
|
|
def handle_gesture(self, gesture):
|
|
def handle_gesture(self, gesture):
|
|
|
"""
|
|
"""
|
|
@@ -138,5 +167,5 @@ class Widget(Positionable, Logger):
|
|
|
for handler in self.handlers.get(gesture.get_type(), ()):
|
|
for handler in self.handlers.get(gesture.get_type(), ()):
|
|
|
handler(gesture)
|
|
handler(gesture)
|
|
|
|
|
|
|
|
- if self.parent and not gesture.is_propagation_stopped():
|
|
|
|
|
- self.parent.handle_gesture(gesture)
|
|
|
|
|
|
|
+ #if self.parent and not gesture.is_propagation_stopped():
|
|
|
|
|
+ # self.parent.handle_gesture(gesture)
|