cleanup
[drlaunch] / src / widget.py
index ed254c0..56605d4 100755 (executable)
@@ -44,6 +44,8 @@ from math import pi
 import cairo
 import time
 
+from subprocess import Popen,PIPE
+
 from portrait import FremantleRotation
 import launcher
 from xdg.IconTheme import getIconPath
@@ -63,25 +65,77 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
     def __init__(self):
        IconGrid.__init__(self)
        HomePluginItem.__init__(self)
-       FremantleRotation.__init__(self, 'DrlaunchPlugin')
+       FremantleRotation.__init__(self, 'DrlaunchPlugin',
+           mode=FremantleRotation.AUTOMATIC, dontrotate=True)
+
+       self.winConfig=None
+
+       self.set_settings(True)
+
+       self.id=None
+       self.config=None
+
+       self.reset_mode()
+
+    def get_id0(self):
+       """If this is called from the constructor then the program
+       core dumps """
+       aid=self.get_applet_id()
+
+       # Get desktop activity if D.A.M. is present
+       
+       act="/usr/bin/activity"
+
+       if os.path.exists(act):
+           r=Popen([act, "current"], stdout=PIPE).communicate()
+           activity=r[0].strip()
+       else:
+           activity=""
+
+       ret="%s-%s" % (aid, activity)
 
+       return(ret)
+
+    def get_id(self):
+       if self.id==None:
+           self.id=self.get_id0()
+
+       return(self.id)
+
+    def get_config(self):
+       if self.config==None:
+           id=self.get_id()
+           self.config=config.Config(id)
+
+       return(self.config)
+
+    def do_realize(self):
        launcher.init()
+       config=self.get_config()
        config.load()
+
+       IconGrid.do_realize(self, config)
+
        self.setSize(config.getSize())
        self.reloadIcons()
 
-       self.set_settings(True)
-       self.connect('show-settings', self.slot_show_settings)
-       self.connect('long-press', self.signalLongpress)
-
-    def do_realize(self):
        screen=self.get_screen()
        self.set_colormap(screen.get_rgba_colormap())
        self.set_app_paintable(True)
 
+       self.connect('show-settings', self.slot_show_settings)
+       self.connect('long-press', self.signalLongpress)
+       self.connect('click', self.signalClick)
+       self.connect('notify', self.signalNotify)
+
        HomePluginItem.do_realize(self)
 
     def on_orientation_changed(self, orientation):
+       # Avoid bugs
+       if orientation==None or len(orientation)==0:
+           return
+
+       # Get the first character of the string (l/p)
        o=orientation[0]
        self.setMode(o)
 #      self.queue_draw()
@@ -89,36 +143,85 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
     def do_expose_event(self, event):
        IconGrid.do_expose_event(self, event)
        HomePluginItem.do_expose_event(self, event)
+       self.reset_mode()
 
     def slot_show_settings(self, dt):
-       s=WinConfig()
+       if self.winConfig!=None:
+           # Doesn't work
+           # self.winConfig.show_all()
+           return
+
+       s=WinConfig(self.get_config())
        s.show_all()
        s.connect('destroy', self.slotConfigDestroy)
+       self.winConfig=s
 
     def slotConfigDestroy(self, sender):
+       self.winConfig=None
+
        dt=sender.getData()
+
+       config=self.get_config()
+
        config.setSize(dt['size'])
        config.setApps(dt['apps'])
+       config.setIndiv(dt['indiv'])
+       config.setLongpress(dt['longpress'])
+       config.setAnimate(dt['animate'])
+       config.setNoBg(dt['nobg'])
+       config.setThemeBg(dt['themebg'])
+       config.setIconSize(dt['iconsize'])
+       config.setIconPadding(dt['iconpadding'])
+       config.setIconMargin(dt['iconmargin'])
        config.save()
        
        # Resize widget
        self.setSize(dt['size'])
        self.reloadIcons()
+       self.icons.resizeMax()
 
-#      self.queue_draw()
+       # Free memory that is used for animations if animations are disabled
+       if not dt['animate']:
+           self.clearAnimationCache()
 
-    def signalLongpress(self, sender, icon):
+       # Free memory of backgrounds in case they changed
+       self.clearBgCache()
+
+       self.queue_draw()
+
+    def handle_click(self, sender, icon):
+       """ common handler for longpress and click """
        if icon.name!=None and icon.name!='':
            launcher.launch(icon.name)
 
-    def resize(self):
-       w=(self.size * config.iconsize) + \
-           (self.size * config.iconspace)
-       self.set_size_request(w, w)
+    def signalLongpress(self, sender, icon):
+       self.handle_click(sender, icon)
+
+    def signalClick(self, sender, icon):
+       config=self.get_config()
+
+       if not config.getLongpress():
+           self.handle_click(sender, icon)
+
+    def signalNotify(self, sender, property):
+       if property.name=='is-on-current-desktop':
+           v=self.get_property(property.name)
+           if v and self.draw_pending:
+               self.queue_draw()
+
+    def resize2(self):
+       config=self.get_config()
+
+       w=(self.size[0] * config.iconsize) + \
+           (self.size[0] * config.getIconSpace())
+       h=(self.size[1] * config.iconsize) + \
+           (self.size[1] * config.getIconSpace())
+       self.set_size_request(w, h)
+       self.resize(w, h)
 
     def setSize(self, size):
        IconGrid.setSize(self, size)
-       self.resize()
+       self.resize2()
 
 hd_plugin_type = DrlaunchPlugin