Change the max grid size before changing the size (fixes bug #12292). Don't rotate...
[drlaunch] / src / icons.py
index e0d1c9a..808d922 100755 (executable)
 
 __version__ = "$Id: 0.py 2265 2010-02-21 19:16:26Z v13 $"
 
-import config
+#import config
 import apps
 import icon
 from icon import getIcon, Icon
+from sig import Disconnector
 
 import gobject
+import gtk
 
 class IconIter:
     def __init__(self, items):
@@ -41,48 +43,106 @@ class IconIter:
        ret=self.iter.next()
        return(ret)
 
-class Icons(gobject.GObject):
-    def __init__(self, isconfig):
+class Icons(gobject.GObject, Disconnector):
+#class Icons(gtk.Widget, Disconnector):
+
+    #__gsignals__=Icon.gsignals
+    def __init__(self, isconfig, config):
        self.__gobject_init__()
+       #gobject.GObject.__init__(self)
+       #gtk.Widget.__init__(self)
+       Disconnector.__init__(self)
+
        self.icons={}
        self.allicons={}
        self.size=0
        self.isconfig=isconfig
+       self.config=config
 
        # signal handlers
-       self.h={}
+       self.handlers={}
+
+       self.maxsz=(0,0)
 
        # setup allicons
-       maxsz=4
-       for x in xrange(maxsz):
-           for y in xrange(maxsz):
-               k=(x,y)
-               ico=Icon(self.isconfig)
-               self.allicons[k]=ico
-               self.connect_one(ico)
+       self.resizeMax()
+
+#      print "icons-init"
+
+    def finish(self):
+       self.dis_finish()
+       return
+#      self.icons=None
+#      self.allicons=None
+#      print "icons-finish"
+
+#    def __del__(self):
+#      print "icons-del"
+
+    def resizeMax(self):
+       sz=self.maxsz
+       maxsz=self.config.getMaxSize()
+
+       # Create new entries in x
+       if maxsz[0]>sz[0]:
+           for x in xrange(maxsz[0]-sz[0]):
+               for y in xrange(sz[1]):
+                   k=(x+sz[0],y)
+                   ico=Icon(self.isconfig, self.config)
+                   self.allicons[k]=ico
+                   self.connect_one(ico)
+           sz=(maxsz[0], sz[1])
+       elif maxsz[0]<sz[0]:
+           for x in xrange(sz[0]-maxsz[0]):
+               for y in xrange(sz[1]):
+                   k=(maxsz[0]+x,y)
+                   t=self.allicons.pop(k)
+                   self.disconnect_one(t)
+           sz=(maxsz[0], sz[1])
+
+       # Create new entries in y
+       if maxsz[1]>sz[1]:
+           for y in xrange(maxsz[1]-sz[1]):
+               for x in xrange(sz[0]):
+                   k=(x,y+sz[1])
+                   ico=Icon(self.isconfig, self.config)
+                   self.allicons[k]=ico
+                   self.connect_one(ico)
+           sz=(sz[0], maxsz[1])
+       elif maxsz[1]<sz[1]:
+           for y in xrange(sz[1]-maxsz[1]):
+               for x in xrange(sz[0]):
+                   k=(x,y+maxsz[1])
+                   t=self.allicons.pop(k)
+                   self.disconnect_one(t)
+           sz=(sz[0], maxsz[1])
+
+       self.maxsz=sz
 
     @classmethod
     def register_signals(cls):
-       signals=icon.signals
+       signals=Icon.gsignals
        for s in signals:
-           gobject.signal_new(s, cls, gobject.SIGNAL_RUN_FIRST,
-               gobject.TYPE_NONE, (Icon,))
+           ss=signals[s]
+           gobject.signal_new(s, cls, ss[0], ss[1], (Icon,))
+#          gobject.SIGNAL_RUN_FIRST,
+#              gobject.TYPE_NONE, (Icon,))
 
     def __iter__(self):
        return(IconIter(self.icons))
 
     def connect_one(self, which):
-       self.h[which]={
-           'longpress':    which.connect('long-press', self.signalLongpress),
-           'click':        which.connect('click', self.signalClick),
-           'tripple':      which.connect('tripple-click',
+       self.handlers[which]={
+           'longpress':    self.c(which, 'long-press', self.signalLongpress),
+           'click':        self.c(which, 'click', self.signalClick),
+           'tripple':      self.c(which, 'tripple-click',
                                self.signalTrippleClick)
            }
 
     def disconnect_one(self, which):
-       for i in self.h[which]:
-           which.disconnect(self.h[which][i])
-       self.h.pop(which)
+       for i in self.handlers[which]:
+           which.disconnect(self.handlers[which][i])
+       self.handlers.pop(which)
 #      which.disconnect(self.h[which]_longpress)
 #      which.disconnect(self.h_click)
 #      which.disconnect(self.h_tripple)
@@ -96,8 +156,8 @@ class Icons(gobject.GObject):
        old=self.icons
        self.icons={}
 
-       for x in xrange(sz):
-           for y in xrange(sz):
+       for x in xrange(sz[0]):
+           for y in xrange(sz[1]):
                k=(x,y)
                ico=self.allicons[k]
                self.icons[k]=ico
@@ -112,6 +172,16 @@ class Icons(gobject.GObject):
 
        self.size=sz
 
+    def getSize(self):
+       return(self.size)
+
+    def setWindow(self, win):
+       """ Set the window for all icons """
+
+       for i in self.icons:
+           ic=self.icons[i]
+           ic.setWindow(win)
+
     def signalLongpress(self, icon):
        #print "signalLongpress()", icon
        self.emit('long-press', icon)
@@ -140,8 +210,9 @@ class Icons(gobject.GObject):
 #          'tecnoballz', 'ncalc', 'rtcom-call-ui', 'rtcom-messaging-ui',
 #          'extcalllog', 'browser', 'modest', 'osso-addressbook']
 
-       wapps=config.getApps()
-       sz=config.getSize()
+       wapps=self.config.getApps()
+       #sz=self.config.getSize()
+       sz=self.getSize()
 
        for k in wapps:
            x,y=k
@@ -152,8 +223,18 @@ class Icons(gobject.GObject):
            if appname!=None:
                app=apps.readOne(appname)
                if app!=None:
-                   app['icon2']=getIcon(app['icon'])
+                   app['icon2']=getIcon(app['icon'], self.config.getIconSize())
                    self.get(x,y).setApp(app)
+           else:
+               ic=self.get(x,y)
+               ic.setApp(None)
+
+       # Reload icons to make sure backgrounds, etc are valid
+       for x in xrange(sz[0]):
+           for y in xrange(sz[1]):
+               ic=self.get(x,y)
+               ic.reload()
+
 
 #      for f in fn:
 #          dt=apps.readOne(f)