X-Git-Url: https://svn.cri.ensmp.fr/git/minwii.git/blobdiff_plain/46e3b6be9bc0e13866d44cca212b8ef94899c64d..c9bd8f475f8fb2bce0e96a300d50c3c7e3ffd23b:/src/app/widgets/cursors.py?ds=sidebyside diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py index 6729fc9..29ce61c 100755 --- a/src/app/widgets/cursors.py +++ b/src/app/widgets/cursors.py @@ -8,13 +8,16 @@ $URL$ import pygame import os +from eventutils import EventHandlerMixin, event_handler +from itertools import cycle +from pygame.locals import MOUSEBUTTONDOWN, MOUSEBUTTONUP, USEREVENT +TIMEOUT = USEREVENT + 1 - -class WarpingCursor(pygame.sprite.Sprite): +class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): ''' The class for animating the warping cursor - durations: + duration: The duration of each image in the animation centerPosition: The Position of the center of the cursor @@ -29,30 +32,45 @@ class WarpingCursor(pygame.sprite.Sprite): #centerPosition = None #_imagePointer = None #_animationOffset = None - + @staticmethod - def _get_theme_images(name) : + 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): + + def __init__(self, theme='black', duration=75, blink=True): pygame.sprite.Sprite.__init__(self) imagesPath, images = WarpingCursor._get_theme_images(theme) flashImage = images.pop(images.index('flash.png')) + flashImagePath = os.path.sep.join([imagesPath, flashImage]) + self.flashImage = pygame.image.load(flashImagePath).convert_alpha() 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() + img = pygame.image.load(imagePath).convert_alpha() + self.images.append(img) + # assumes that all images have same dimensions + self.width = self.images[0].get_width() + self.height = self.images[0].get_height() self.duration = duration - + + self.image = self.images[0] + self.rect = pygame.Rect((0,0), (self.width, self.height)) + + surface = pygame.display.get_surface() + surface.blit(self.image, self.rect) + self.blink = blink + if blink : + self._startBlink() + #self.flashImagePath = flashImage #self.durations = durations #self.centerPosition = initCenterPosition @@ -61,44 +79,74 @@ class WarpingCursor(pygame.sprite.Sprite): #self.image = pygame.image.load(self.images[0]).convert_alpha() #self._imagePointer = 0 #self._animationOffset = 0 - #self._flashTimer = 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 _startBlink(self) : + pygame.time.set_timer(TIMEOUT, self.duration) + self.iterator = self.iterImages() + + def iterImages(self) : + for img in cycle(self.images) : + yield img + + @event_handler(TIMEOUT) + def loadNext(self, event) : + if self.blink : + self.image = self.iterator.next() + surface = pygame.display.get_surface() + surface.blit(self.image, self.rect) + + @event_handler(MOUSEBUTTONDOWN) + def flashOn(self, event) : + self.blink=False + self.image = self.flashImage + surface = pygame.display.get_surface() + surface.blit(self.image, self.rect) + + @event_handler(MOUSEBUTTONUP) + def flashOff(self, event) : + self.blink = True + self.loadNext(event) + + def update(self) : + print 'cursor update' + +# 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]: + if self._animationOffset > self.duration : #New animation offset is computed first, before updating the pointer - self._animationOffset -= self.durations[self._imagePointer] + self._animationOffset -= self.duration #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.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