gestion du flash du curseur.
[minwii.git] / src / app / widgets / cursors.py
index 6d81a67..29ce61c 100755 (executable)
@@ -8,9 +8,12 @@ $URL$
 
 import pygame
 import os
+from eventutils import EventHandlerMixin, event_handler
+from itertools import cycle
+from pygame.locals import MOUSEBUTTONDOWN, MOUSEBUTTONUP, USEREVENT
+TIMEOUT = USEREVENT + 1
 
-
-class WarpingCursor(pygame.sprite.Sprite):
+class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
     '''
     The class for animating the warping cursor
         
@@ -40,10 +43,12 @@ class WarpingCursor(pygame.sprite.Sprite):
         return basePath, images
 
     
-    def __init__(self, theme='black', duration=75):
+    def __init__(self, theme='black', duration=75, blink=True):
         pygame.sprite.Sprite.__init__(self)
         imagesPath, images = WarpingCursor._get_theme_images(theme)
-        self.flashImage = images.pop(images.index('flash.png'))
+        flashImage = images.pop(images.index('flash.png'))
+        flashImagePath = os.path.sep.join([imagesPath, flashImage]) 
+        self.flashImage = pygame.image.load(flashImagePath).convert_alpha()
         images.sort(lambda a, b : cmp(*[int(os.path.splitext(f)[0]) for f in [a, b]]))
         
         self.images = []
@@ -52,7 +57,6 @@ class WarpingCursor(pygame.sprite.Sprite):
             img = pygame.image.load(imagePath).convert_alpha()
             self.images.append(img)
         
-        self._imageLength = len(self.images)
         # assumes that all images have same dimensions
         self.width = self.images[0].get_width()
         self.height = self.images[0].get_height()
@@ -63,6 +67,9 @@ class WarpingCursor(pygame.sprite.Sprite):
         
         surface = pygame.display.get_surface()
         surface.blit(self.image, self.rect)
+        self.blink = blink
+        if blink :
+            self._startBlink()
         
         #self.flashImagePath = flashImage
         #self.durations = durations
@@ -73,6 +80,33 @@ class WarpingCursor(pygame.sprite.Sprite):
         #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) :
+        if self.blink :
+            self.image = self.iterator.next()
+            surface = pygame.display.get_surface()
+            surface.blit(self.image, self.rect)
+    
+    @event_handler(MOUSEBUTTONDOWN)
+    def flashOn(self, event) :
+        self.blink=False
+        self.image = self.flashImage
+        surface = pygame.display.get_surface()
+        surface.blit(self.image, self.rect)
+
+    @event_handler(MOUSEBUTTONUP)
+    def flashOff(self, event) :
+        self.blink = True
+        self.loadNext(event)
 
     def update(self) :
         print 'cursor update'