6b0d6e84aca67a8dd89469da0cf14b248d41a4be
[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 from eventutils import EventHandlerMixin, event_handler
12 from itertools import cycle
13 from pygame.locals import MOUSEBUTTONDOWN, MOUSEBUTTONUP, USEREVENT
14 TIMEOUT = USEREVENT + 1
15
16 class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin):
17 '''
18 The class for animating the warping cursor
19 '''
20
21 @staticmethod
22 def _get_theme_images(name) :
23 basePath = os.path.abspath(__file__).split(os.path.sep)[:-1]
24 basePath.append('data')
25 basePath.append(name)
26 basePath = os.path.sep.join(basePath)
27 images = [f for f in os.listdir(basePath) if os.path.splitext(f)[1] == '.png']
28 return basePath, images
29
30
31 def __init__(self, theme='black', duration=75, blink=True):
32 pygame.sprite.Sprite.__init__(self)
33 imagesPath, images = WarpingCursor._get_theme_images(theme)
34 flashImage = images.pop(images.index('flash.png'))
35 flashImagePath = os.path.sep.join([imagesPath, flashImage])
36 self.flashImage = pygame.image.load(flashImagePath).convert_alpha()
37 images.sort(lambda a, b : cmp(*[int(os.path.splitext(f)[0]) for f in [a, b]]))
38
39 self.images = []
40 for img in images :
41 imagePath = os.path.sep.join([imagesPath, img])
42 img = pygame.image.load(imagePath).convert_alpha()
43 self.images.append(img)
44
45 # assumes that all images have same dimensions
46 self.width = self.images[0].get_width()
47 self.height = self.images[0].get_height()
48 self.duration = duration
49
50 self.image = self.images[0]
51 self.rect = pygame.Rect((0,0), (self.width, self.height))
52 self.update()
53
54 self.blink = blink
55 if blink :
56 self._startBlink()
57
58 def _startBlink(self) :
59 pygame.time.set_timer(TIMEOUT, self.duration)
60 self.iterator = self.iterImages()
61
62 def iterImages(self) :
63 for img in cycle(self.images) :
64 yield img
65
66 @event_handler(TIMEOUT)
67 def loadNext(self, event) :
68 if self.blink :
69 self.image = self.iterator.next()
70 self.update()
71
72 @event_handler(MOUSEBUTTONDOWN)
73 def flashOn(self, event) :
74 self.blink=False
75 self.image = self.flashImage
76 self.update()
77
78 @event_handler(MOUSEBUTTONUP)
79 def flashOff(self, event) :
80 self.blink = True
81 self.loadNext(event)
82
83 def update(self) :
84 surface = pygame.display.get_surface()
85 surface.blit(self.image, self.rect)