bugfix sous windows.
[minwii.git] / src / app / eventutils.py
index ed03913..505455c 100755 (executable)
@@ -6,7 +6,7 @@ l'implémentation des gestionnaires d'événements pygame.
 Utilisation :
 - hériter de EventHandlerMixin
 - décorer les méthodes gestionnaires d'événements avec le décorateur 'event_handler'
 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.
 
 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.
@@ -29,6 +29,7 @@ $URL$
 import types
 import pygame
 from StringIO import StringIO
 import types
 import pygame
 from StringIO import StringIO
+from log import console, eventLogger
 
 class _EventDispatcher :
     def __init__(self) :
 
 class _EventDispatcher :
     def __init__(self) :
@@ -36,16 +37,24 @@ class _EventDispatcher :
         
     def addEventListener(self, eventType, listener) :
         if self.registry.has_key(eventType) :
         
     def addEventListener(self, eventType, listener) :
         if self.registry.has_key(eventType) :
-            self.registry[eventType].append(listener)
+            self.registry[eventType][listener] = True
         else :
         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 :
     
     def dispatchEvents(self) :
         events = pygame.event.get()
         for event in events :
-            listeners = self.registry.get(event.type, [])
-            for listener in listeners :
+            eventLogger.info(event)
+            listeners = self.registry.get(event.type, {})
+            for listener in listeners.keys() :
                 listener(event)
                 listener(event)
+
     def reset(self) :
         self.registry = {}
     
     def reset(self) :
         self.registry = {}
     
@@ -55,7 +64,7 @@ class _EventDispatcher :
         keys.sort()
         for k in keys :
             print >> out, "event", k
         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()
                 print >> out, listener.__name__
         out.seek(0)
         return out.read()
@@ -63,10 +72,10 @@ class _EventDispatcher :
 
 EventDispatcher = _EventDispatcher()
 
 
 EventDispatcher = _EventDispatcher()
 
-def event_handler(eventType) :
+def event_handler(*eventTypes) :
     def markFunctionAsListener(m) :
         m.__islistener__ = True
     def markFunctionAsListener(m) :
         m.__islistener__ = True
-        m.__eventtype__ = eventType
+        m.__eventtypes__ = eventTypes
         return m
     return markFunctionAsListener
 
         return m
     return markFunctionAsListener
 
@@ -78,7 +87,8 @@ class EventInitializer(type):
             for k, v in dict.items() :
                 if isinstance(v, types.FunctionType) and hasattr(v, '__islistener__') :
                     listener = getattr(self, k)
             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__')
         
         def ctor(self, *args, **kw) :
             default_ctor = dict.get('__init__')
@@ -93,8 +103,3 @@ class EventInitializer(type):
 
 class EventHandlerMixin(object) :
     __metaclass__ = EventInitializer
 
 class EventHandlerMixin(object) :
     __metaclass__ = EventInitializer
-    
-    #def input(self) :
-    #    event = pygame.event.wait()
-    #    handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)
-    #    handler(event)