Utilisation :
- hériter de EventHandlerMixin
- décorer les méthodes gestionnaires d'événements avec le décorateur 'event_handler'
- en passant en paramètre le code d'événement pygame
+ en passant en paramètre un ou plusieurs codes d'événement pygame
Il n'existe aucune contrainte sur le nommage de la méthode décorée.
La méthode gestionnaire d'événement reçoit l'événement pygame comme unique paramètre.
import types
import pygame
from StringIO import StringIO
+from logging import getLogger, basicConfig, DEBUG
+import sys
+from events import TIMEOUT, COLOVER, eventNames
+basicConfig(level=DEBUG, stream = sys.stdout)
+console = getLogger('minwii')
+eventLog = getLogger('minwii.events')
+
+hiddenEvents = {pygame.MOUSEMOTION:True,
+ TIMEOUT:True,
+ COLOVER:True,}
class _EventDispatcher :
def __init__(self) :
def addEventListener(self, eventType, listener) :
if self.registry.has_key(eventType) :
- self.registry[eventType].append(listener)
+ self.registry[eventType][listener] = True
else :
- self.registry[eventType] = [listener]
+ self.registry[eventType] = {listener:True}
+
+ def removeEventListener(self, eventType, listener) :
+ try :
+ del self.registry[eventType][listener]
+ except KeyError :
+ console.warn("no listener to remove")
def dispatchEvents(self) :
events = pygame.event.get()
for event in events :
- listeners = self.registry.get(event.type, [])
- for listener in listeners :
+ listeners = self.registry.get(event.type, {})
+ if listeners and not hiddenEvents.has_key(event.type) :
+ eventLog.info((eventNames.get(event.type, event.type), event))
+ for listener in listeners.keys() :
listener(event)
+
def reset(self) :
self.registry = {}
keys.sort()
for k in keys :
print >> out, "event", k
- for listener in self.registry[k] :
+ for listener in self.registry[k].keys() :
print >> out, listener.__name__
out.seek(0)
return out.read()
EventDispatcher = _EventDispatcher()
-def event_handler(eventType) :
+def event_handler(*eventTypes) :
def markFunctionAsListener(m) :
m.__islistener__ = True
- m.__eventtype__ = eventType
+ m.__eventtypes__ = eventTypes
return m
return markFunctionAsListener
for k, v in dict.items() :
if isinstance(v, types.FunctionType) and hasattr(v, '__islistener__') :
listener = getattr(self, k)
- EventDispatcher.addEventListener(v.__eventtype__, listener)
+ for eventType in v.__eventtypes__ :
+ EventDispatcher.addEventListener(eventType, listener)
def ctor(self, *args, **kw) :
default_ctor = dict.get('__init__')
class EventHandlerMixin(object) :
__metaclass__ = EventInitializer
-
- #def input(self) :
- # event = pygame.event.wait()
- # handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)
- # handler(event)