Taddeus Kroes vor 13 Jahren
Ursprung
Commit
9fe3fe3631
1 geänderte Dateien mit 26 neuen und 16 gelöschten Zeilen
  1. 26 16
      src/widget.py

+ 26 - 16
src/widget.py

@@ -17,8 +17,8 @@ class Widget(Positionable, Logger):
     def __init__(self, x=None, y=None):
         Positionable.__init__(self, x, y)
 
-        # Map of gesture types to gesture trackers
-        self.trackers = {}
+        # List of all active trackers
+        self.trackers = []
 
         # Map of gesture types to a list of handlers for that type
         self.handlers = {}
@@ -109,17 +109,27 @@ class Widget(Positionable, Logger):
             # Remove handler list
             del self.handlers[gesture_type][:]
 
+        tracker = self.find_tracker(gesture_type)
+
         # Check if any other handlers need the tracker
-        for gtype in self.trackers[gesture_type].gesture_types:
+        for gtype in tracker.gesture_types:
             if gtype in self.handlers:
                 return
 
         # No more handlers are bound, remove unused tracker and handlers
-        del self.trackers[gesture_type]
+        self.trackers.remove(gesture_type)
 
-        for gtype in self.trackers[gesture_type].gesture_types:
+        for gtype in tracker.gesture_types:
             del self.handlers[gtype]
 
+    def find_tracker(self, gesture_type):
+        """
+        Find a tracker that is tracking some gesture type.
+        """
+        for tracker in self.trackers:
+            if gesture_type in tracker.gesture_types:
+                return tracker
+
     def bind(self, gesture_type, handler, remove_existing=False, **kwargs):
         """
         Bind a handler to the specified type of gesture. Create a tracker for
@@ -130,7 +140,7 @@ class Widget(Positionable, Logger):
         if gesture_type not in self.handlers:
             tracker = create_tracker(gesture_type, self)
             tracker.configure(**kwargs)
-            self.trackers[gesture_type] = tracker
+            self.trackers.append(tracker)
             self.handlers[gesture_type] = []
 
             # Create empty tracker lists for all supported gestures
@@ -163,14 +173,14 @@ class Widget(Positionable, Logger):
 
     def delegate_event(self, event):
         """
-        Delegate a triggered event to child widgets. If a child stops
-        propagation
+        Delegate a triggered event to all child widgets. If a child stops
+        propagation, return so that its siblings and the parent widget will not
+        delegate the event to their trackers.
         """
-        if not self.children:
-            self.propagate_event(event)
-        else:
+        child_found = False
+
+        if self.children:
             event.set_offset(self.get_offset())
-            child_found = False
 
             # Delegate to children in reverse order because widgets that are
             # added later, should be placed over previously added siblings
@@ -180,13 +190,13 @@ class Widget(Positionable, Logger):
                     child.delegate_event(event)
 
                     if event.is_propagation_stopped():
-                        break
+                        return
 
-            if not child_found:
-                self.propagate_event(event)
+        if not child_found:
+            self.propagate_event(event)
 
     def propagate_event(self, event):
-        for tracker in set(self.trackers.itervalues()):
+        for tracker in self.trackers:
             tracker.handle_event(event)
 
             if event.is_immediate_propagation_stopped():