$URL$
"""
import types
+import pygame
+
+class _EventDispatcher :
+ def __init__(self) :
+ self.registry = {}
+
+ def addEventListener(self, eventType, listener) :
+ if self.registry.has_key(eventType) :
+ self.registry[eventType].append(listener)
+ else :
+ self.registry[eventType] = [listener]
+
+ def dispatchEvents(self) :
+ events = pygame.event.get()
+ for event in events :
+ listeners = self.registry.get(event.type, [])
+ for listener in listeners :
+ listener(event)
+
+EventDispatcher = _EventDispatcher()
def event_handler(eventType) :
- def doRename(m) :
- m.__name__ = 'eventHandler%s' % eventType
+ def markFunctionAsListener(m) :
+ m.__islistener__ = True
+ m.__eventtype__ = eventType
return m
- return doRename
+ return markFunctionAsListener
-class MetaRenamer(type):
- def __new__(mcs, name, bases, dict) :
- for k, v in dict.items() :
- if isinstance(v, types.FunctionType) :
- if k != v.__name__ :
- print 'renommage de %s en %s' % (k, v.__name__)
- dict[v.__name__] = v
- del dict[k]
- return type.__new__(mcs, name, bases, dict)
+class EventInitializer(type):
+
+ def __init__(cls, name, bases, dict) :
+ def init_listeners(self) :
+ for k, v in dict.items() :
+ if isinstance(v, types.FunctionType) and hasattr(v, '__islistener__') :
+ listener = getattr(self, k)
+ EventDispatcher.addEventListener(v.__eventtype__, listener)
+ del v.__islistener__
+ del v.__eventtype__
+
+ def ctor(self, *args, **kw) :
+ init_listeners(self)
+ default_ctor = dict.get('__init__')
+ if not default_ctor :
+ super(cls, self).__init__(*args, **kw)
+ else :
+ default_ctor(self, *args, **kw)
+
+ cls.__init__ = ctor
class EventHandlerMixin(object) :
- __metaclass__ = MetaRenamer
+ __metaclass__ = EventInitializer
- def input(self, event) :
- handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)
- handler(event)
+ #def input(self) :
+ # event = pygame.event.wait()
+ # handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)
+ # handler(event)
from pgu.gui import QUIT
from widgets.home import Home
from widgets.playingscreen import _PlayingScreenBase, SongPlayingScreenTest
-import time
class MinWii(Desktop):
def __init__(self) :
Desktop.__init__(self)
-
- # home = Home()
- # home.connect(QUIT, self.quit)
- # self.run(home)
-
- # class C:pass
- # o = C()
- # o.midi=1
- # playingScreen = _PlayingScreenBase([o])
-
import pygame
playingScreen = SongPlayingScreenTest()
- #playingScreen.draw(pygame.display.get_surface())
playingScreen.run()
-
- #pygame.display.flip()
- #time.sleep(2)
pygame.init()
modeResolution = (1024,768)
- window = pygame.display.set_mode(modeResolution)
+ window = pygame.display.set_mode(modeResolution, pygame.FULLSCREEN)
MinWii()
# from gui.PGUConfiguration import PGUConfiguration
# pygame.init()
import pygame
import os
+from eventutils import EventHandlerMixin, event_handler
+from itertools import cycle
+from pygame.locals import USEREVENT
+TIMEOUT = USEREVENT + 1
-
-class WarpingCursor(pygame.sprite.Sprite):
+class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
'''
The class for animating the warping cursor
surface = pygame.display.get_surface()
surface.blit(self.image, self.rect)
+ self._startBlink()
#self.flashImagePath = flashImage
#self.durations = durations
#self._imagePointer = 0
#self._animationOffset = 0
#self._flashTimer = 0
+
+ def _startBlink(self) :
+ pygame.time.set_timer(TIMEOUT, self.duration)
+ self.iterator = self.iterImages()
+
+ def iterImages(self) :
+ for img in cycle(self.images) :
+ yield img
+
+ @event_handler(TIMEOUT)
+ def loadNext(self, event) :
+ self.image = self.iterator.next()
+ surface = pygame.display.get_surface()
+ surface.blit(self.image, self.rect)
def update(self) :
print 'cursor update'
from colorsys import hls_to_rgb
from gradients import gradients
from cursors import WarpingCursor
-from eventutils import event_handler, EventHandlerMixin
+from eventutils import event_handler, EventDispatcher, EventHandlerMixin
from math import floor
import types
# TODO : positionner cette constance en fonction de la résolution d'affichage
distinctNotes : notes disctinctes présentes dans la chanson
triées du plus grave au plus aigu.
"""
+ print '__init__ _PlayingScreenBase'
super(_PlayingScreenBase, self).__init__()
self.distinctNotes = distinctNotes
self.keyboardLength = 0
hueStep = FIRST_HUE / (self.keyboardLength - 1)
for i, rect in enumerate(self.keyboardRects) :
hue = FIRST_HUE - hueStep * i
- print hue
c = Column(hue, rect)
self.add(c)
def run(self):
self._running = True
+ clock = pygame.time.Clock()
while self._running :
pygame.display.flip()
- events = pygame.event.get()
- for event in events:
- self.input(event)
-
- def input(self, event) :
- handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)
- handler(event)
+ EventDispatcher.dispatchEvents()
+ clock.tick(50)
@event_handler(pygame.KEYDOWN)
def handleKeyDown(self, event) :
class SongPlayingScreenTest(_PlayingScreenBase) :
def __init__(self) :
+ print '__init__ SongPlayingScreenTest'
class C:pass
o = C()
o.midi=1