nettoyage / implémentation de la méthode update.
[minwii.git] / src / app / widgets / cursors.py
index b52bfb3..6b0d6e8 100755 (executable)
@@ -10,29 +10,14 @@ import pygame
 import os
 from eventutils import EventHandlerMixin, event_handler
 from itertools import cycle
 import os
 from eventutils import EventHandlerMixin, event_handler
 from itertools import cycle
-from pygame.locals import USEREVENT
+from pygame.locals import MOUSEBUTTONDOWN, MOUSEBUTTONUP, USEREVENT
 TIMEOUT = USEREVENT + 1
 
 class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
     '''
     The class for animating the warping cursor
 TIMEOUT = USEREVENT + 1
 
 class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
     '''
     The class for animating the warping cursor
-        
-        duration:
-            The duration of each image in the animation
-        centerPosition:
-            The Position of the center of the cursor
-        _imagePointer:
-            A pointer to the current image
-        _animationOffset:
-            The time elapsed since when the current image should have been displayed
     '''
     '''
-    #screen = None
-    #images = None
-    #durations = None
-    #centerPosition = None
-    #_imagePointer = None
-    #_animationOffset = None
-    
+
     @staticmethod
     def _get_theme_images(name) :
         basePath = os.path.abspath(__file__).split(os.path.sep)[:-1]
     @staticmethod
     def _get_theme_images(name) :
         basePath = os.path.abspath(__file__).split(os.path.sep)[:-1]
@@ -43,10 +28,12 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
         return basePath, images
 
     
         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)
         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 = []
         images.sort(lambda a, b : cmp(*[int(os.path.splitext(f)[0]) for f in [a, b]]))
         
         self.images = []
@@ -55,7 +42,6 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
             img = pygame.image.load(imagePath).convert_alpha()
             self.images.append(img)
         
             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()
         # assumes that all images have same dimensions
         self.width = self.images[0].get_width()
         self.height = self.images[0].get_height()
@@ -63,21 +49,12 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
         
         self.image = self.images[0]
         self.rect = pygame.Rect((0,0), (self.width, self.height))
         
         self.image = self.images[0]
         self.rect = pygame.Rect((0,0), (self.width, self.height))
+        self.update()
         
         
-        surface = pygame.display.get_surface()
-        surface.blit(self.image, self.rect)
-        self._startBlink()
-        
-        #self.flashImagePath = flashImage
-        #self.durations = durations
-        #self.centerPosition = initCenterPosition
-        #self.flashLength = 100
-        #self.flashing = False
-        #self.image = pygame.image.load(self.images[0]).convert_alpha()
-        #self._imagePointer = 0
-        #self._animationOffset = 0
-        #self._flashTimer = 0
-    
+        self.blink = blink
+        if blink :
+            self._startBlink()
+            
     def _startBlink(self) :
         pygame.time.set_timer(TIMEOUT, self.duration)
         self.iterator = self.iterImages()
     def _startBlink(self) :
         pygame.time.set_timer(TIMEOUT, self.duration)
         self.iterator = self.iterImages()
@@ -88,59 +65,21 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
     
     @event_handler(TIMEOUT)
     def loadNext(self, event) :
     
     @event_handler(TIMEOUT)
     def loadNext(self, event) :
-        self.image = self.iterator.next()
-        surface = pygame.display.get_surface()
-        surface.blit(self.image, self.rect)
+        if self.blink :
+            self.image = self.iterator.next()
+            self.update()
+    
+    @event_handler(MOUSEBUTTONDOWN)
+    def flashOn(self, event) :
+        self.blink=False
+        self.image = self.flashImage
+        self.update()
+
+    @event_handler(MOUSEBUTTONUP)
+    def flashOff(self, event) :
+        self.blink = True
+        self.loadNext(event)
 
     def update(self) :
 
     def update(self) :
-        print 'cursor update'
-    
-#    def update(self, elapsedTime, centerPosition):
-#        '''
-#        Update the cursor's look and position
-#
-#            elapsedTime:
-#                The time passed since the previous update
-#            centerPosition:
-#                the new position of the creep
-#        '''
-#        self._updateImage(elapsedTime)
-#        self.centerPosition = centerPosition
-#        if self.flashing :
-#            self._flashTimer += elapsedTime
-#            if self._flashTimer > self.flashLength:
-#                self.flashing = False
-    
-    def _updateImage(self, elapsedTime):
-        '''
-        Update the cursor's image
-            
-            elapsedTime:
-                The time passed since the previous update
-        '''
-        self._animationOffset += elapsedTime
-        
-        if self._animationOffset > self.duration :
-            #New animation offset is computed first, before updating the pointer
-            self._animationOffset -= self.duration
-            #point to the next image (restarts from the beginning when it reaches the end)
-            self._imagePointer = (self._imagePointer + 1) % len(self.images)
-        
-        if self.flashing:
-            self.image = pygame.image.load(self.flashImagePath).convert_alpha()
-        else :
-            self.image = pygame.image.load(self.images[self._imagePointer]).convert_alpha()
-    
-    def flash(self,flashLength = None):
-        self._flashTimer = 0
-        self.flashing = True
-        if flashLength:
-            self.flashlength = flashLength
-    
-    def blit(self,surface):
-        '''
-        Draw the circle on surface
-        '''
-        
-        newPos = (self.centerPosition[0] - self.image.get_width() / 2, self.centerPosition[1] - self.image.get_height() / 2)
-        surface.blit(self.image, newPos)
+        surface = pygame.display.get_surface()
+        surface.blit(self.image, self.rect)