Début de refactoring du curseur.
[minwii.git] / src / app / widgets / cursors.py
diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py
new file mode 100755 (executable)
index 0000000..2cbe4cc
--- /dev/null
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+"""
+Curseurs winwii
+
+$Id$
+$URL$
+"""
+
+import pygame
+import os
+
+
+class WarpingCursor(pygame.sprite.Sprite):
+    '''
+    The class for animating the warping cursor
+        
+        durations:
+            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]
+        basePath.append('data')
+        basePath.append(name)
+        basePath = os.path.sep.join(basePath)
+        images = [f for f in os.listdir(basePath) if os.path.splitext(f)[1] == '.png']
+        return basePath, images
+    
+
+    def __init__(self, theme='black', duration=75):
+        pygame.sprite.Sprite.__init__(self)
+        imagesPath, images = WarpingCursor._get_theme_images(theme)
+        flashImage = images.pop(images.index('flash.png'))
+        images.sort(lambda a, b : cmp(*[int(os.path.splitext(f)[0]) for f in [a, b]]))
+
+        self.images = []
+        for img in images :
+            imagePath = os.path.sep.join([imagesPath, img])
+            self.images = pygame.image.load(imagePath).convert_alpha()
+            
+        #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        
+    
+    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.durations[self._imagePointer]:
+            #New animation offset is computed first, before updating the pointer
+            self._animationOffset -= self.durations[self._imagePointer]
+            #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)