Change the max grid size before changing the size (fixes bug #12292). Don't rotate...
[drlaunch] / src / widget.py
index 8a8bd3c..35141bb 100755 (executable)
@@ -42,6 +42,7 @@ from hildondesktop import *
 from gtk import gdk
 from math import pi
 import cairo
+import gconf
 import time
 
 from subprocess import Popen,PIPE
@@ -55,26 +56,32 @@ import config
 import apps
 from icon import Icon
 from icongrid import IconGrid
+from sig import Disconnector
 
 # Restore path
 sys.path=orig_path
 
 # IconGrid must be before HomePluginItem for its connect()
 # and do_button_*() to override those of HomePluginItem
-class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
+class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation, Disconnector):
     def __init__(self):
        IconGrid.__init__(self)
        HomePluginItem.__init__(self)
        FremantleRotation.__init__(self, 'DrlaunchPlugin',
            mode=FremantleRotation.AUTOMATIC, dontrotate=True)
+       Disconnector.__init__(self)
 
        self.winConfig=None
 
+       self.gconf=gconf.client_get_default()
+
        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 """
@@ -107,6 +114,41 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
 
        return(self.config)
 
+    def get_desktop_orientation(self):
+       """
+       Return desktop orientation
+
+       NOTE: This is the desktop orientation as it was introduced in CSSU.
+       Not the device orientation.
+
+       @return "portrait" or "landscape"
+       """
+
+       sw=gdk.screen_width()
+       sh=gdk.screen_height()
+
+       if sw>=sh:
+           ret='landscape'
+       else:
+           ret='portrait'
+
+       return(ret)
+
+    def is_rotating_desktop(self):
+       """
+       Check whether the desktop will change to portrait mode, as
+       added in CSSU.
+
+       @return True/False
+       """
+
+       c=self.gconf
+
+       # This returns False if the key doesn't exist
+       ret=c.get_bool('/apps/osso/hildon-desktop/ui_can_rotate')
+
+       return(ret)
+
     def do_realize(self):
        launcher.init()
        config=self.get_config()
@@ -121,22 +163,41 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
        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)
+       self.c(self, 'show-settings', self.slot_show_settings)
+       self.c(self, 'long-press', self.signalLongpress)
+       self.c(self, 'click', self.signalClick)
+       self.c(self, '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]
+
+       # Get desktop orientation
+       #do=self.get_desktop_orientation()
+
+       # Is desktop rotation (per CSSU) enabled?
+       rd=self.is_rotating_desktop()
+
+       #print "desktop: %s / %s, device: %s" % (do, rd, o)
+
+       # In case of a rotating desktop, force orientation to be
+       # 'landscape'
+       if rd:
+           o='l'
+
        self.setMode(o)
 #      self.queue_draw()
 
     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):
        if self.winConfig!=None:
@@ -146,25 +207,38 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
 
        s=WinConfig(self.get_config())
        s.show_all()
-       s.connect('destroy', self.slotConfigDestroy)
+       #s.c(s, 'delete-event', self.slotConfigDestroy)
+       self.c(s, 'delete-event', self.slotConfigDestroy)
+       #s.connect('destroy', self.slotConfigDestroy)
        self.winConfig=s
 
-    def slotConfigDestroy(self, sender):
-       self.winConfig=None
-
+    def slotConfigDestroy(self, sender, event):
+#      print "Sender:", sender
        dt=sender.getData()
 
-       config=self.get_config()
+       # Disconnect signals for that object in order to be deleted
+       self.dis_finish(self.winConfig)
+       #self.winConfig.finish()
+       #self.winConfig.destroy()
+
+       self.winConfig=None
 
-       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.save()
+       cfg=self.get_config()
+
+       cfg.setSize(dt['size'])
+       cfg.setApps(dt['apps'])
+       cfg.setIndiv(dt['indiv'])
+       cfg.setLongpress(dt['longpress'])
+       cfg.setAnimate(dt['animate'])
+       cfg.setNoBg(dt['nobg'])
+       cfg.setThemeBg(dt['themebg'])
+       cfg.setIconSize(dt['iconsize'])
+       cfg.setIconPadding(dt['iconpadding'])
+       cfg.setIconMargin(dt['iconmargin'])
+       cfg.save()
        
        # Resize widget
+       self.icons.resizeMax()
        self.setSize(dt['size'])
        self.reloadIcons()
 
@@ -172,13 +246,19 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
        if not dt['animate']:
            self.clearAnimationCache()
 
+       # Free memory of backgrounds in case they changed
+       self.clearBgCache()
+
        self.queue_draw()
 
+#      print "slot-config-destroy-end"
+
+       return(False)
+
     def handle_click(self, sender, icon):
        """ common handler for longpress and click """
-       if icon.name!=None and icon.name!='':
-           print "name:", icon.name
-           launcher.launch(icon.name)
+       if icon.appname!=None and icon.appname!='':
+           launcher.launch(icon.appname)
 
     def signalLongpress(self, sender, icon):
        self.handle_click(sender, icon)
@@ -199,9 +279,9 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
        config=self.get_config()
 
        w=(self.size[0] * config.iconsize) + \
-           (self.size[0] * config.iconspace)
+           (self.size[0] * config.getIconSpace())
        h=(self.size[1] * config.iconsize) + \
-           (self.size[1] * config.iconspace)
+           (self.size[1] * config.getIconSpace())
        self.set_size_request(w, h)
        self.resize(w, h)