Added support for saving/loading 'animate' option.
[drlaunch] / src / icongrid.py
index 670c80f..b13f7df 100755 (executable)
@@ -51,6 +51,8 @@ class IconGrid(object):       #(gobject.GObject):
     def __init__(self, isconfig=False):
 #      self.__gobject_init__()
 
+       self.init_done=False
+
        self.size=(0,0)
 
        self.isconfig=isconfig
@@ -58,12 +60,16 @@ class IconGrid(object):     #(gobject.GObject):
        self.icons=None
        self.lasticon=None  # The last icon that got selected
 
+       self.draw_pending=False
+
+       self.mode=None
+
     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):
@@ -81,10 +87,71 @@ class IconGrid(object):     #(gobject.GObject):
        return(ret)
 
     def setMode(self, mode):
+       if self.mode==mode:
+           print "same mode"
+           return
+
        self.mode=mode
-       if isinstance(self, gtk.Widget):
+       if not isinstance(self, gtk.Widget):
+           return
+
+       do_draw=False
+
+       try:
+           v=self.get_property('is-on-current-desktop')
+           if v:
+               do_draw=True
+           else:
+               self.draw_pending=True
+       except TypeError:
+           do_draw=True
+
+       if do_draw and self.config.getAnimate():
+           #self.queue_draw()
+           self.angle_timer_start=time.time()
+           gobject.timeout_add(20, self.timerAngle)
+        else:
+            if self.mode=='l':
+                self.setAngle(0)
+            else:
+                self.setAngle(90)
+
+           if do_draw:
+               self.queue_draw()
+                
+    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
+
+       if self.mode=='l':
+           angle=90-da
+       else:
+           angle=da
+
+       if angle>=90:
+           angle=90
+           ret=False
+       elif angle<0:
+           angle=0
+           ret=False
+       else:
+           ret=True
+
+       if self.setAngle(angle):
            self.queue_draw()
 
+       if ret==False:
+           self.angle_timer_start=0
+
+       return(ret)
+
     def iconAt(self, x, y):
        """ Get icon at coordinates x,y. X and Y are in pixels """
 
@@ -107,6 +174,8 @@ class IconGrid(object):     #(gobject.GObject):
        return(ret)
 
     def _draw(self, cr, event):
+       self.draw_pending=False
+
        w=self.config.iconsize + self.config.iconspace
        for x,y in self.icons:
            if self.mode=='l' or self.config.getIndiv():
@@ -124,7 +193,17 @@ class IconGrid(object):    #(gobject.GObject):
                continue
 
            ico=self.icons.get(x,y)
-           ico.draw(cr, x2, y2, self.mode)
+           ico.draw(cr, x2, y2)
+
+    def setAngle(self, angle):
+       """ Return True/False indicating that angle has changed """
+       ret=False
+       for x,y in self.icons:
+           ic=self.icons.get(x,y)
+           if ic.setAngle(angle):
+               ret=True
+
+       return(ret)
 
     def do_expose_event(self, event):
        cr=self.window.cairo_create()
@@ -134,6 +213,10 @@ class IconGrid(object):    #(gobject.GObject):
 
        cr.clip()
 
+       if not self.init_done:
+           self.icons.setWindow(self.window)
+           self.init_done=True
+
        self._draw(cr, event)
 
     def setLastIcon(self, icon):
@@ -220,13 +303,13 @@ class IconGridWidget(IconGrid, gtk.Widget):
 
        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)