3ce142d9ded8fe8203fd4071ced630c946d818f9
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 un ou plusieurs codes 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 from events
import TIMEOUT
, COLOVER
, eventNames
35 basicConfig(level
=DEBUG
, stream
= sys
.stdout
)
36 console
= getLogger('minwii')
37 eventLog
= getLogger('minwii.events')
39 hiddenEvents
= {pygame
.MOUSEMOTION
:True,
43 from event_pprinters
import pprinters
45 class _EventDispatcher
:
49 def addEventListener(self
, eventType
, listener
) :
50 if self
.registry
.has_key(eventType
) :
51 self
.registry
[eventType
][listener
] = True
53 self
.registry
[eventType
] = {listener
:True}
55 def removeEventListener(self
, eventType
, listener
) :
57 del self
.registry
[eventType
][listener
]
59 console
.warn("no listener to remove")
61 def dispatchEvents(self
) :
62 events
= pygame
.event
.get()
64 listeners
= self
.registry
.get(event
.type, {})
65 if listeners
and not hiddenEvents
.has_key(event
.type) :
66 eventLog
.info(pprinters
[event
.type](event
))
67 for listener
in listeners
.keys() :
75 keys
= self
.registry
.keys()
78 print >> out
, "event", k
79 for listener
in self
.registry
[k
].keys() :
80 print >> out
, listener
.__name
__
85 EventDispatcher
= _EventDispatcher()
87 def event_handler(*eventTypes
) :
88 def markFunctionAsListener(m
) :
89 m
.__islistener
__ = True
90 m
.__eventtypes
__ = eventTypes
92 return markFunctionAsListener
95 class EventInitializer(type):
97 def __init__(cls
, name
, bases
, dict) :
98 def init_listeners(self
) :
99 for k
, v
in dict.items() :
100 if isinstance(v
, types
.FunctionType
) and hasattr(v
, '__islistener__') :
101 listener
= getattr(self
, k
)
102 for eventType
in v
.__eventtypes
__ :
103 EventDispatcher
.addEventListener(eventType
, listener
)
105 def ctor(self
, *args
, **kw
) :
106 default_ctor
= dict.get('__init__')
107 if not default_ctor
:
108 super(cls
, self
).__init
__(*args
, **kw
)
110 default_ctor(self
, *args
, **kw
)
116 class EventHandlerMixin(object) :
117 __metaclass__
= EventInitializer