1e3fc4ed3294827db262d9d0e2832e392007bdde
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
.extend(['data', 'cursor'])
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 imagesPath
, images
= WarpingCursor
._get
_theme
_images
(theme
)
33 flashImage
= images
.pop(images
.index('flash.png'))
34 flashImagePath
= os
.path
.sep
.join([imagesPath
, flashImage
])
35 self
.flashImage
= pygame
.image
.load(flashImagePath
).convert_alpha()
36 images
.sort(lambda a
, b
: cmp(*[int(os
.path
.splitext(f
)[0]) for f
in [a
, b
]]))
40 imagePath
= os
.path
.sep
.join([imagesPath
, img
])
41 img
= pygame
.image
.load(imagePath
).convert_alpha()
42 self
.images
.append(img
)
44 # assumes that all images have same dimensions
45 self
.width
= self
.images
[0].get_width()
46 self
.height
= self
.images
[0].get_height()
47 self
.duration
= duration
49 self
.image
= self
.images
[0]
50 # workarround cursor alignement problem
51 pygame
.event
.set_blocked(pygame
.MOUSEMOTION
)
52 pygame
.mouse
.set_pos(pygame
.mouse
.get_pos())
53 pygame
.event
.set_allowed(pygame
.MOUSEMOTION
)
55 x
, y
= pygame
.mouse
.get_pos()
56 left
= x
- self
.width
/ 2
57 top
= y
- self
.height
/ 2
58 self
.rect
= pygame
.Rect((left
, top
), (self
.width
, self
.height
))
60 self
.blinkMode
= blinkMode
63 def _startBlink(self
) :
66 pygame
.time
.set_timer(TIMEOUT
, self
.duration
)
67 self
.iterator
= self
.iterImages()
69 def _stopBlink(self
) :
71 pygame
.time
.set_timer(TIMEOUT
, 0)
73 def iterImages(self
) :
74 for img
in cycle(self
.images
) :
77 @event_handler(TIMEOUT
)
78 def loadNext(self
, event
) :
81 self
.image
= self
.iterator
.next()
83 @event_handler(pygame
.MOUSEBUTTONDOWN
)
84 def flashOn(self
, event
) :
86 self
._blinking
= False
87 self
.image
= self
.flashImage
89 @event_handler(pygame
.MOUSEBUTTONUP
)
90 def flashOff(self
, event
) :
96 self
.image
= self
.images
[0]
98 @event_handler(pygame
.MOUSEMOTION
)
99 def move(self
, event
) :
101 self
.rect
.move_ip(event
.rel
)
103 def setPosition(self
, pos
) :
106 rx
, ry
= self
.rect
.centerx
, self
.rect
.centery
107 self
.rect
.move_ip(x
-rx
, y
-ry
)