X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/blobdiff_plain/1949ce08d8bd0e485280de3039c1c103522d7c2d..bf4fd0cf6bb79dffd32e4995f0b312fb1a32502f:/src/app/widgets/cursors.py diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py index 3ac9c43..041c0fb 100755 --- a/src/app/widgets/cursors.py +++ b/src/app/widgets/cursors.py @@ -9,11 +9,10 @@ $URL$ import pygame import os from eventutils import EventHandlerMixin, event_handler +from events import TIMEOUT from itertools import cycle -from pygame.locals import USEREVENT -TIMEOUT = USEREVENT + 1 -class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): +class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): ''' The class for animating the warping cursor ''' @@ -28,9 +27,8 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): return basePath, images - def __init__(self, theme='black', duration=75, blink=True): - pygame.sprite.Sprite.__init__(self) - pygame.mouse.set_visible(False) + def __init__(self, theme='black', duration=50, blinkMode=True): + pygame.sprite.DirtySprite.__init__(self) imagesPath, images = WarpingCursor._get_theme_images(theme) flashImage = images.pop(images.index('flash.png')) flashImagePath = os.path.sep.join([imagesPath, flashImage]) @@ -49,38 +47,55 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): self.duration = duration self.image = self.images[0] - self.rect = pygame.Rect((0,0), (self.width, self.height)) + # workarround cursor alignement problem + pygame.event.set_blocked(pygame.MOUSEMOTION) + pygame.mouse.set_pos(pygame.mouse.get_pos()) + pygame.event.set_allowed(pygame.MOUSEMOTION) + # --- + x, y = pygame.mouse.get_pos() + left = x - self.width / 2 + top = y - self.height / 2 + self.rect = pygame.Rect((left, top), (self.width, self.height)) - self.blink = blink - if blink : - self._startBlink() - + self.blinkMode = blinkMode + self._startBlink() + def _startBlink(self) : - pygame.time.set_timer(TIMEOUT, self.duration) - self.iterator = self.iterImages() + if self.blinkMode : + self._blinking = True + pygame.time.set_timer(TIMEOUT, self.duration) + self.iterator = self.iterImages() + def _stopBlink(self) : + if self.blinkMode : + pygame.time.set_timer(TIMEOUT, 0) + def iterImages(self) : for img in cycle(self.images) : yield img @event_handler(TIMEOUT) def loadNext(self, event) : - if self.blink : + if self._blinking : + self.dirty = 1 self.image = self.iterator.next() @event_handler(pygame.MOUSEBUTTONDOWN) def flashOn(self, event) : - self.blink=False + self.dirty = 1 + self._blinking = False self.image = self.flashImage @event_handler(pygame.MOUSEBUTTONUP) def flashOff(self, event) : - self.blink = True - self.loadNext(event) + self.dirty = 1 + if self.blinkMode : + self._blinking = True + self.loadNext(event) + else : + self.image = self.images[0] @event_handler(pygame.MOUSEMOTION) def move(self, event) : - x, y = event.rel - self.rect.centerx += x - self.rect.centery += y - #self.rect.move_ip(*rel) + self.dirty = 1 + self.rect.move_ip(event.rel)