X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/a7c9d1fda4c70e7213db409ca66b1555e6539c21..baf4f2fe0e04d6b95c428813dd920b597031ec04:/src/app/widgets/cursors.py?ds=inline diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py index 863b757..1e3fc4e 100755 --- a/src/app/widgets/cursors.py +++ b/src/app/widgets/cursors.py @@ -12,7 +12,7 @@ from eventutils import EventHandlerMixin, event_handler from events import TIMEOUT from itertools import cycle -class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): +class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): ''' The class for animating the warping cursor ''' @@ -20,7 +20,7 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): @staticmethod def _get_theme_images(name) : basePath = os.path.abspath(__file__).split(os.path.sep)[:-1] - basePath.append('data') + basePath.extend(['data', 'cursor']) basePath.append(name) basePath = os.path.sep.join(basePath) images = [f for f in os.listdir(basePath) if os.path.splitext(f)[1] == '.png'] @@ -28,8 +28,7 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): def __init__(self, theme='black', duration=50, blinkMode=True): - pygame.sprite.Sprite.__init__(self) - pygame.mouse.set_visible(False) + 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]) @@ -48,17 +47,29 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): self.duration = duration self.image = self.images[0] - self.rect = pygame.Rect((-self.width/2,-self.height/2), (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.blinkMode = blinkMode self._startBlink() - + def _startBlink(self) : 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 @@ -66,15 +77,18 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): @event_handler(TIMEOUT) def loadNext(self, event) : if self._blinking : + self.dirty = 1 self.image = self.iterator.next() @event_handler(pygame.MOUSEBUTTONDOWN) def flashOn(self, event) : + self.dirty = 1 self._blinking = False self.image = self.flashImage @event_handler(pygame.MOUSEBUTTONUP) def flashOff(self, event) : + self.dirty = 1 if self.blinkMode : self._blinking = True self.loadNext(event) @@ -83,4 +97,11 @@ class WarpingCursor(pygame.sprite.Sprite, EventHandlerMixin): @event_handler(pygame.MOUSEMOTION) def move(self, event) : + self.dirty = 1 self.rect.move_ip(event.rel) + + def setPosition(self, pos) : + self.dirty = 1 + x, y = pos + rx, ry = self.rect.centerx, self.rect.centery + self.rect.move_ip(x-rx, y-ry)