X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/a08d887d02d2ba5f61f3c7b0eeb8dae1ba4deddf..d8d786898468fe6b6065a626070593cc162f5171:/src/app/widgets/cursors.py?ds=sidebyside diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py new file mode 100755 index 0000000..2cbe4cc --- /dev/null +++ b/src/app/widgets/cursors.py @@ -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)