# HG changeset patch # User Stefano Rivera # Date 1315749849 -7200 # Node ID 671d027f1b71a133b7aa6c858805b6c5083ebb7f # Parent 05188f09e432553eece77d4d1bec3b4441c007eb Callbacks for events in widgets diff -r 05188f09e432 -r 671d027f1b71 mamba/habitats/mainmenu.py --- 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 diff -r 05188f09e432 -r 671d027f1b71 mamba/widgets/base.py --- 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)