ménage (par le vide)
[minwii.git] / src / app / widgets / cursors.py
index 2c22b5d..fa1f673 100755 (executable)
@@ -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):
@@ -20,14 +21,14 @@ class WarpingCursor(pygame.sprite.DirtySprite, 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']
         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'))
@@ -53,7 +54,6 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin):
         pygame.event.set_allowed(pygame.MOUSEMOTION)
         # ---
         x, y = pygame.mouse.get_pos()
-        print 'mouse pos :', x, y
         left = x - self.width / 2
         top = y - self.height / 2
         self.rect = pygame.Rect((left, top), (self.width, self.height))
@@ -61,22 +61,27 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin):
         self.blinkMode = blinkMode
         self._startBlink()
     
-    def _stopBlink(self) :
-        if self.blinkMode :
-            pygame.time.set_timer(TIMEOUT, 0)
-            
+    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 :
+            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()
@@ -92,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]
     
@@ -100,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