SelectorWidget
[naja.git] / naja / widgets / base.py
index 133cc532c2ae8fb0886117255decbba65f1e374c..c82026179c9856b4812f6937d433881a8321fddc 100644 (file)
@@ -1,5 +1,9 @@
+from collections import defaultdict
+
 import pygame
-from naja.events import InvalidateTheWorld
+from pygame import locals as pgl
+
+from naja.events import InvalidateTheWorld, SelectEvent
 
 
 class Widget(object):
@@ -7,6 +11,7 @@ class Widget(object):
         self.pos = pos
         self.size = size or (0, 0)
         self._prepared = False
+        self.callbacks = defaultdict(list)
 
     @property
     def rect(self):
@@ -33,8 +38,17 @@ class Widget(object):
             # True for for this event
             self._prepared = False
             return False
+        if SelectEvent.matches(ev) or ev.type == pgl.MOUSEBUTTONDOWN:
+            self.callback('click')
         return False
 
+    def add_callback(self, event, callback):
+        self.callbacks[event].append(callback)
+
+    def callback(self, event):
+        for callback in self.callbacks[event]:
+            callback(event)
+
 
 class Container(object):
     def __init__(self, *widgets):
@@ -50,7 +64,16 @@ class Container(object):
             widget.render(surface)
 
     def handle_event(self, ev):
-        for widget in self.widgets:
-            if widget.handle_event(ev):
-                return True
+        if hasattr(ev, 'pos'):
+            for widget in self.widgets:
+                if isinstance(widget, Container):
+                    if widget.handle_event(ev):
+                        return True
+                elif widget.rect.collidepoint(ev.pos):
+                    if widget.handle_event(ev):
+                        return True
+        else:
+            for widget in self.widgets:
+                if widget.handle_event(ev):
+                    return True
         return False