Début de refactoring du curseur.
[minwii.git] / src / app / widgets / cursors.py
1 # -*- coding: utf-8 -*-
2 """
3 Curseurs winwii
4
5 $Id$
6 $URL$
7 """
8
9 import pygame
10 import os
11
12
13 class WarpingCursor(pygame.sprite.Sprite):
14 '''
15 The class for animating the warping cursor
16
17 durations:
18 The duration of each image in the animation
19 centerPosition:
20 The Position of the center of the cursor
21 _imagePointer:
22 A pointer to the current image
23 _animationOffset:
24 The time elapsed since when the current image should have been displayed
25 '''
26 #screen = None
27 #images = None
28 #durations = None
29 #centerPosition = None
30 #_imagePointer = None
31 #_animationOffset = None
32
33 @staticmethod
34 def _get_theme_images(name) :
35 basePath = os.path.abspath(__file__).split(os.path.sep)[:-1]
36 basePath.append('data')
37 basePath.append(name)
38 basePath = os.path.sep.join(basePath)
39 images = [f for f in os.listdir(basePath) if os.path.splitext(f)[1] == '.png']
40 return basePath, images
41
42
43 def __init__(self, theme='black', duration=75):
44 pygame.sprite.Sprite.__init__(self)
45 imagesPath, images = WarpingCursor._get_theme_images(theme)
46 flashImage = images.pop(images.index('flash.png'))
47 images.sort(lambda a, b : cmp(*[int(os.path.splitext(f)[0]) for f in [a, b]]))
48
49 self.images = []
50 for img in images :
51 imagePath = os.path.sep.join([imagesPath, img])
52 self.images = pygame.image.load(imagePath).convert_alpha()
53
54 #self.flashImagePath = flashImage
55 #self.durations = durations
56 #self.centerPosition = initCenterPosition
57 #self.flashLength = 100
58 #self.flashing = False
59 #self.image = pygame.image.load(self.images[0]).convert_alpha()
60 #self._imagePointer = 0
61 #self._animationOffset = 0
62 #self._flashTimer = 0
63
64 def update(self, elapsedTime, centerPosition):
65 '''
66 Update the cursor's look and position
67
68 elapsedTime:
69 The time passed since the previous update
70 centerPosition:
71 the new position of the creep
72 '''
73 self._updateImage(elapsedTime)
74 self.centerPosition = centerPosition
75 if self.flashing :
76 self._flashTimer += elapsedTime
77 if self._flashTimer > self.flashLength:
78 self.flashing = False
79
80 def _updateImage(self, elapsedTime):
81 '''
82 Update the cursor's image
83
84 elapsedTime:
85 The time passed since the previous update
86 '''
87 self._animationOffset += elapsedTime
88
89 if self._animationOffset > self.durations[self._imagePointer]:
90 #New animation offset is computed first, before updating the pointer
91 self._animationOffset -= self.durations[self._imagePointer]
92 #point to the next image (restarts from the beginning when it reaches the end)
93 self._imagePointer = (self._imagePointer + 1) % len(self.images)
94
95 if self.flashing:
96 self.image = pygame.image.load(self.flashImagePath).convert_alpha()
97 else :
98 self.image = pygame.image.load(self.images[self._imagePointer]).convert_alpha()
99
100 def flash(self,flashLength = None):
101 self._flashTimer = 0
102 self.flashing = True
103 if flashLength:
104 self.flashlength = flashLength
105
106 def blit(self,surface):
107 '''
108 Draw the circle on surface
109 '''
110
111 newPos = (self.centerPosition[0] - self.image.get_width() / 2, self.centerPosition[1] - self.image.get_height() / 2)
112 surface.blit(self.image, newPos)