1 # -*- coding: utf-8 -*-
11 from eventutils
import EventHandlerMixin
, event_handler
12 from events
import TIMEOUT
13 from itertools
import cycle
15 class WarpingCursor(pygame
.sprite
.DirtySprite
, EventHandlerMixin
):
17 The class for animating the warping cursor
21 def _get_theme_images(name
) :
22 basePath
= os
.path
.abspath(__file__
).split(os
.path
.sep
)[:-1]
23 basePath
.append('data')
25 basePath
= os
.path
.sep
.join(basePath
)
26 images
= [f
for f
in os
.listdir(basePath
) if os
.path
.splitext(f
)[1] == '.png']
27 return basePath
, images
30 def __init__(self
, theme
='black', duration
=50, blinkMode
=True):
31 pygame
.sprite
.DirtySprite
.__init
__(self
)
32 pygame
.mouse
.set_visible(False)
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
]]))
41 imagePath
= os
.path
.sep
.join([imagesPath
, img
])
42 img
= pygame
.image
.load(imagePath
).convert_alpha()
43 self
.images
.append(img
)
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
50 self
.image
= self
.images
[0]
51 self
.rect
= pygame
.Rect((-self
.width
/2,-self
.height
/2), (self
.width
, self
.height
))
53 self
.blinkMode
= blinkMode
56 def _startBlink(self
) :
59 pygame
.time
.set_timer(TIMEOUT
, self
.duration
)
60 self
.iterator
= self
.iterImages()
62 def iterImages(self
) :
63 for img
in cycle(self
.images
) :
66 @event_handler(TIMEOUT
)
67 def loadNext(self
, event
) :
70 self
.image
= self
.iterator
.next()
72 @event_handler(pygame
.MOUSEBUTTONDOWN
)
73 def flashOn(self
, event
) :
75 self
._blinking
= False
76 self
.image
= self
.flashImage
78 @event_handler(pygame
.MOUSEBUTTONUP
)
79 def flashOff(self
, event
) :
85 self
.image
= self
.images
[0]
87 @event_handler(pygame
.MOUSEMOTION
)
88 def move(self
, event
) :
90 self
.rect
.move_ip(event
.rel
)