changeset 55:671d027f1b71

Callbacks for events in widgets
author Stefano Rivera <stefano@rivera.za.net>
date Sun, 11 Sep 2011 16:04:09 +0200
parents 05188f09e432
children e730ec8b82e8
files mamba/habitats/mainmenu.py mamba/widgets/base.py
diffstat 2 files changed, 20 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/habitats/mainmenu.py	Sun Sep 11 15:51:17 2011 +0200
+++ b/mamba/habitats/mainmenu.py	Sun Sep 11 16:04:09 2011 +0200
@@ -1,10 +1,18 @@
 """Main menu."""
 
+from pygame.locals import MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN
+
 from mamba.engine import Habitat
 from mamba.widgets.text import TextWidget
 
-
 class MainMenu(Habitat):
     def __init__(self):
         super(MainMenu, self).__init__()
-        self.container.add(TextWidget((100, 100), "Hello", color='white'))
+        hello = TextWidget((100, 100), "Hello", color='white')
+        self.container.add(hello)
+        hello.add_callback(MOUSEMOTION, self.debug_event)
+        quit = TextWidget((100, 200), "Quit", color='red')
+        self.container.add(quit)
+
+    def debug_event(self, event, widget):
+        print event
--- a/mamba/widgets/base.py	Sun Sep 11 15:51:17 2011 +0200
+++ b/mamba/widgets/base.py	Sun Sep 11 16:04:09 2011 +0200
@@ -1,3 +1,5 @@
+import collections
+
 import pygame
 from pygame.locals import MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN
 
@@ -8,10 +10,14 @@
         if not isinstance(rect, pygame.Rect):
             rect = pygame.Rect(rect, (0, 0))
         self.rect = rect
+        self.callbacks = collections.defaultdict(list)
+
+    def add_callback(self, eventtype, callback, *args):
+        self.callbacks[eventtype].append((callback, args))
 
     def event(self, event):
-        "Override me"
-        pass
+        for callback, args in self.callbacks[event.type]:
+            callback(event, self, *args)
 
     def draw(self, surface):
         "Override me"
@@ -26,9 +32,8 @@
     def event(self, event):
         for child in self.children:
             if event.type in (MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN):
-                if not child.rect.collidepoint(event.pos):
-                    continue
-            child.event(event)
+                if child.rect.collidepoint(event.pos):
+                    child.event(event)
 
     def add(self, widget):
         self.children.append(widget)