10ddbad861b981f322a93911cd7f9f2909f6943b
[minwii.git] / src / app / eventutils.py
1 # -*- coding: utf-8 -*-
2 """
3 Décorateur, métaclasse et classe mixin pour faciliter
4 l'implémentation des gestionnaires d'événements pygame.
5
6 Utilisation :
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
10
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.
13
14 par exemple :
15
16 import pygame
17 class Machin(pygame.sprite.Sprite, EventHandlerMixin) :
18
19 # .../...
20
21 @event_handler(pygame.KEYDOWN)
22 def handleKeyDown(self, event) :
23 pass
24
25
26 $Id$
27 $URL$
28 """
29 import types
30
31 def event_handler(eventType) :
32 def doRename(m) :
33 m.__name__ = 'eventHandler%s' % eventType
34 return m
35 return doRename
36
37
38 class MetaRenamer(type):
39 def __new__(mcs, name, bases, dict) :
40 for k, v in dict.items() :
41 if isinstance(v, types.FunctionType) :
42 if k != v.__name__ :
43 print 'renommage de %s en %s' % (k, v.__name__)
44 dict[v.__name__] = v
45 del dict[k]
46 return type.__new__(mcs, name, bases, dict)
47
48
49 class EventHandlerMixin(object) :
50 __metaclass__ = MetaRenamer
51
52 def input(self, event) :
53 handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)
54 handler(event)