X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/blobdiff_plain/a810f09e895d66ce684214e67969fe373bf96560..4c4732c6ed8cb0aaa70fb2d4c6e5a958868c5349:/src/app/widgets/cursors.py?ds=sidebyside diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py index fc05b56..fa1f673 100755 --- a/src/app/widgets/cursors.py +++ b/src/app/widgets/cursors.py @@ -8,8 +8,9 @@ $URL$ import pygame import os +from threading import Thread +import time from eventutils import EventHandlerMixin, event_handler -from events import TIMEOUT from itertools import cycle class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): @@ -27,7 +28,7 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): return basePath, images - def __init__(self, theme='black', duration=50, blinkMode=True): + def __init__(self, theme='black-perforated', duration=100, blinkMode=True): pygame.sprite.DirtySprite.__init__(self) imagesPath, images = WarpingCursor._get_theme_images(theme) flashImage = images.pop(images.index('flash.png')) @@ -60,22 +61,27 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): self.blinkMode = blinkMode self._startBlink() + def __del__(self) : + if hasattr(self, 'timer') : + try : self.timer.stop() + except : pass + def _startBlink(self) : if self.blinkMode : self._blinking = True - pygame.time.set_timer(TIMEOUT, self.duration) self.iterator = self.iterImages() + self.timer = ForeverTimer(self.duration, self.loadNext) + self.timer.start() def _stopBlink(self) : if self.blinkMode : - pygame.time.set_timer(TIMEOUT, 0) + self.timer.stop() def iterImages(self) : for img in cycle(self.images) : yield img - @event_handler(TIMEOUT) - def loadNext(self, event) : + def loadNext(self) : if self._blinking : self.dirty = 1 self.image = self.iterator.next() @@ -91,7 +97,6 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): self.dirty = 1 if self.blinkMode : self._blinking = True - self.loadNext(event) else : self.image = self.images[0] @@ -99,3 +104,27 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): 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) + + +class ForeverTimer(Thread) : + def __init__(self, duration, func, *args, **kw) : + Thread.__init__(self) + self.duration = duration / 1000. + self.func = func + self.args = args + self.kw = kw + self.running = True + + def run(self) : + while self.running : + self.func(*self.args, **self.kw) + time.sleep(self.duration) + + def stop(self) : + self.running = False \ No newline at end of file