1 # -*- coding: utf-8 -*-
3 Décorateur, métaclasse et classe mixin pour faciliter
4 l'implémentation des gestionnaires d'événements pygame.
7 - hériter de EventHandlerMixin
8 - décorer les méthodes gestionnaires d'événements avec le décorateur 'event_handler'
9 en passant en paramètre le code d'événement pygame
11 Il n'existe aucune contrainte sur le nommage de la méthode décorée.
12 La méthode gestionnaire d'événement reçoit l'événement pygame comme unique paramètre.
17 class Machin(pygame.sprite.Sprite, EventHandlerMixin) :
21 @event_handler(pygame.KEYDOWN)
22 def handleKeyDown(self, event) :
31 from StringIO
import StringIO
32 from logging
import getLogger
, basicConfig
, DEBUG
34 basicConfig(level
=DEBUG
, stream
= sys
.stdout
)
35 console
= getLogger('minwii.eventutils')
37 class _EventDispatcher
:
41 def addEventListener(self
, eventType
, listener
) :
42 if self
.registry
.has_key(eventType
) :
43 self
.registry
[eventType
][listener
] = True
45 self
.registry
[eventType
] = {listener
:True}
47 def removeEventListener(self
, eventType
, listener
) :
49 del self
.registry
[eventType
][listener
]
51 console
.warn("no listener to remove")
53 def dispatchEvents(self
) :
54 events
= pygame
.event
.get()
56 #if event.type == pygame.MOUSEMOTION :
57 # if hasattr(event, 'wiimoteid') :
61 listeners
= self
.registry
.get(event
.type, {})
62 for listener
in listeners
.keys() :
69 keys
= self
.registry
.keys()
72 print >> out
, "event", k
73 for listener
in self
.registry
[k
].keys() :
74 print >> out
, listener
.__name
__
79 EventDispatcher
= _EventDispatcher()
81 def event_handler(*eventTypes
) :
82 def markFunctionAsListener(m
) :
83 m
.__islistener
__ = True
84 m
.__eventtypes
__ = eventTypes
86 return markFunctionAsListener
89 class EventInitializer(type):
91 def __init__(cls
, name
, bases
, dict) :
92 def init_listeners(self
) :
93 for k
, v
in dict.items() :
94 if isinstance(v
, types
.FunctionType
) and hasattr(v
, '__islistener__') :
95 listener
= getattr(self
, k
)
96 for eventType
in v
.__eventtypes
__ :
97 EventDispatcher
.addEventListener(eventType
, listener
)
99 def ctor(self
, *args
, **kw
) :
100 default_ctor
= dict.get('__init__')
101 if not default_ctor
:
102 super(cls
, self
).__init
__(*args
, **kw
)
104 default_ctor(self
, *args
, **kw
)
110 class EventHandlerMixin(object) :
111 __metaclass__
= EventInitializer
114 # event = pygame.event.wait()
115 # handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)