Fix the double-rotation bug.
[drlaunch] / src / icongrid.py
index 3571736..d5c458e 100755 (executable)
@@ -64,12 +64,20 @@ class IconGrid(object):     #(gobject.GObject):
 
        self.mode=None
 
+       # If this is False then animations are forcefully disabled
+       self.do_animations=True
+
+       self.angle_timer_start=0
+
+       # Duration of the rotation effect
+       self.rotation_time=0.8
+
     def do_realize(self, config):
        self.config=config
 
        self.icons=Icons(self.isconfig, self.config)
        self.setMode('l')
-       self.setSize((4,4))
+       self.setSize((8,4))
        self.reloadIcons()
 
     def connect(self, what, *args):
@@ -106,26 +114,48 @@ class IconGrid(object):   #(gobject.GObject):
        except TypeError:
            do_draw=True
 
-       if do_draw:
+       if do_draw and self.config.getAnimate() and self.do_animations:
            #self.queue_draw()
-           self.angle_timer_start=time.time()
-           gobject.timeout_add(20, self.timerAngle)
+           # Don't start another timer
+           # Instead adjust the time start to produce a nice effect ;-)
+           if self.angle_timer_start==0:
+               self.angle_timer_start=time.time()
+               gobject.timeout_add(20, self.timerAngle)
+           else:
+               dt=time.time()-self.angle_timer_start
+               da=90.0*dt/self.rotation_time
+
+               da2=90.0-da
+               dt2=da2*self.rotation_time/90.0
+               self.angle_timer_start=time.time()-dt2
         else:
             if self.mode=='l':
                 self.setAngle(0)
             else:
                 self.setAngle(90)
-                
+
+           if do_draw:
+               self.queue_draw()
+
+    def disableAnimation(self):
+       self.do_animations=False
+
+    def enableAnimation(self):
+       self.do_animations=True
+
+    def setAnimationEnable(self, value):
+       if value:
+           self.enableAnimation()
+       else:
+           self.disableAnimation()
+
     def timerAngle(self):
        if self.angle_timer_start==0:
            self.angle_timer_start=time.time()-0.05
 
        dt=time.time()-self.angle_timer_start
 
-       # Duration of the rotation effect
-       rotation_time=0.5
-
-       da=90.0*dt/rotation_time
+       da=90.0*dt/self.rotation_time
 
        if self.mode=='l':
            angle=90-da
@@ -202,6 +232,12 @@ class IconGrid(object):    #(gobject.GObject):
 
        return(ret)
 
+    def clearAnimationCache(self):
+       """ Clear animation cache, freeing memory """
+       for x,y in self.icons:
+           ic=self.icons.get(x,y)
+           ic.clearAnimationCache()
+
     def do_expose_event(self, event):
        cr=self.window.cairo_create()
 
@@ -292,21 +328,24 @@ class IconGrid(object):   #(gobject.GObject):
 #      self.setMode(o)
 
 class IconGridWidget(IconGrid, gtk.Widget):
-    def __init__(self, isconfig, config):
+    def __init__(self, isconfig, config, animation=True):
        IconGrid.__init__(self, isconfig)
        gtk.Widget.__init__(self)
 
+       # This must be called before do_realize
+       self.setAnimationEnable(animation)
+
        self.config=config
 
        IconGrid.do_realize(self, self.config)
 
-       if isconfig:
-           maxsz=self.config.getMaxSize()
-           w=maxsz[0] * (self.config.iconsize + self.config.iconspace)
-           h=maxsz[1] * (self.config.iconsize + self.config.iconspace)
-       else:
-           w=self.size[0] * (self.config.iconsize + self.config.iconspace)
-           h=self.size[1] * (self.config.iconsize + self.config.iconspace)
+       self.setSize(self.size)
+
+    def setSize(self, size):
+       IconGrid.setSize(self, size)
+
+       w=self.size[0] * (self.config.iconsize + self.config.iconspace)
+       h=self.size[1] * (self.config.iconsize + self.config.iconspace)
 
        self.set_size_request(w, h)