(no commit message)
authorStefanos Harhalakis <v13@v13.gr>
Mon, 28 Jun 2010 22:01:03 +0000 (22:01 +0000)
committerStefanos Harhalakis <v13@v13.gr>
Mon, 28 Jun 2010 22:01:03 +0000 (22:01 +0000)
src/config.py
src/icon.py
src/icongrid.py
src/icons.py
src/widget.py
src/win_config.py

index d208444..5c7e39e 100755 (executable)
@@ -38,10 +38,15 @@ except:
 
        return(cfg)
 
-size = 2
+size = (2,2)
 iconsize = 64
 iconspace = 42
 apps=None
+indiv=False
+id=None                # Applet ID
+longpress=True
+
+maxsz=(4,4)
 
 def setSize(sz):
     global size
@@ -53,6 +58,31 @@ def getSize():
 
     return(size)
 
+def getMaxSize():
+    global maxsz
+
+    return(maxsz)
+
+def setIndiv(_indiv):
+    global indiv
+
+    indiv=_indiv
+
+def getIndiv():
+    global indiv
+
+    return(indiv)
+
+def setLongpress(_lp):
+    global longpress
+
+    longpress=_lp
+
+def getLongpress():
+    global longpress
+
+    return(longpress)
+
 def setApps(aps):
     """ apps is a dictionary of (x,y)=>appname """
     global apps
@@ -90,32 +120,115 @@ def get_config_fn():
     return(ret)
 
 def save():
-    fn=get_config_fn()
+    global id
+
+    check_init()
 
-    dt={
-       'version':  1,
-       'size':     getSize(),
-       'apps':     getApps()
+    dt=load_all()
+
+    if dt==None:
+       dt={
+           'version':  3,
+           'data':     {},
+           }
+
+    dt['data'][id]={
+       'size':         getSize(),
+       'apps':         getApps(),
+       'indiv':        getIndiv(),
+       'longpress':    getLongpress(),
        }
 
+    fn=get_config_fn()
+
     st=pickle.dumps(dt)
     f=file(fn, 'w')
     f.write(st)
     f.close()
 
-def load():
+def parse_v1(dt0):
+    """ Convert a v1 config to v2 """
+    global id
+
+    ret={
+       'version':  2,
+       'data':     {},
+       }
+
+    ret['data'][id]={
+       'size':     dt0['size'],
+       'apps':     dt0['apps'],
+       }
+
+    return(ret)
+
+def parse_v2(dt):
+    global id
+
+    # Perhaps copy dt?
+
+    dt['version']=3
+
+    for i in dt['data']:
+       dt['data'][i]['indiv']=False
+       dt['data'][i]['size']=(dt['data'][i]['size'], dt['data'][i]['size'])
+       dt['data'][i]['longpress']=True
+
+    return(dt)
+
+def load_all():
     fn=get_config_fn()
 
     try:
        f=file(fn, 'r')
        st=f.read()
        f.close()
-       dt=pickle.loads(st)
+       ret=pickle.loads(st)
     except:
+       ret=None
+
+    return(ret)
+
+def load():
+    global id
+
+    check_init()
+
+    fn=get_config_fn()
+
+    dt0=load_all()
+    if dt0==None:
+       return
+
+    if dt0['version']==1:
+       dt0=parse_v1(dt0)
+
+    if dt0['version']==2:
+       dt0=parse_v2(dt0)
+
+    if not dt0['data'].has_key(id):
        return
 
+    dt=dt0['data'][id]
+
     setSize(dt['size'])
     setApps(dt['apps'])
+    setIndiv(dt['indiv'])
+    setLongpress(dt['longpress'])
+
+def init(_id):
+    global id
+
+    id=_id
+
+def check_init():
+    global id
+
+    if id==None:
+       import sys
+
+       print "config.init() not done"
+       sys.exit(1)
 
 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent:
 
index 8d2c099..335f6e4 100755 (executable)
@@ -73,8 +73,12 @@ class Icon(gobject.GObject):
        return(dt)
 
     def setApp(self, dt):
-       self.name=dt['id']
-       self.icon=dt['icon2']
+       if dt==None:
+           self.name=None
+           self.icon=None
+       else:
+           self.name=dt['id']
+           self.icon=dt['icon2']
        self.invalidate()
 
     def getSize(self):
index ad4f84f..5eee444 100755 (executable)
@@ -66,7 +66,7 @@ class IconGrid(object):       #(gobject.GObject):
        #self.set_size_request(w, w)
 
 #      self.setSize(config.getSize())
-       self.setSize(4)
+       self.setSize((4,4))
 
        self.lasticon=None  # The last icon that got selected
 
@@ -82,6 +82,10 @@ class IconGrid(object):      #(gobject.GObject):
        self.size=size
        self.icons.setSize(size)
 
+    def getSize(self):
+       ret=self.icons.getSize()
+       return(ret)
+
     def setMode(self, mode):
        self.mode=mode
        if isinstance(self, gtk.Widget):
@@ -111,7 +115,7 @@ class IconGrid(object):     #(gobject.GObject):
     def _draw(self, cr, event):
        w=config.iconsize + config.iconspace
        for x,y in self.icons:
-           if self.mode=='l':
+           if self.mode=='l' or config.getIndiv():
                x2=x * (config.iconsize + config.iconspace)
                y2=y * (config.iconsize + config.iconspace)
            else:
@@ -218,11 +222,14 @@ class IconGridWidget(IconGrid, gtk.Widget):
        gtk.Widget.__init__(self)
 
        if isconfig:
-           w=4 * (config.iconsize + config.iconspace)
+           maxsz=config.getMaxSize()
+           w=maxsz[0] * (config.iconsize + config.iconspace)
+           h=maxsz[1] * (config.iconsize + config.iconspace)
        else:
-           w=self.size * (config.iconsize + config.iconspace)
+           w=self.size[0] * (config.iconsize + config.iconspace)
+           h=self.size[1] * (config.iconsize + config.iconspace)
 
-       self.set_size_request(w, w)
+       self.set_size_request(w, h)
 
     def do_realize(self):
        screen=self.get_screen()
index e0d1c9a..9c344ee 100755 (executable)
@@ -53,9 +53,9 @@ class Icons(gobject.GObject):
        self.h={}
 
        # setup allicons
-       maxsz=4
-       for x in xrange(maxsz):
-           for y in xrange(maxsz):
+       maxsz=config.getMaxSize()
+       for x in xrange(maxsz[0]):
+           for y in xrange(maxsz[1]):
                k=(x,y)
                ico=Icon(self.isconfig)
                self.allicons[k]=ico
@@ -96,8 +96,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 +112,9 @@ class Icons(gobject.GObject):
 
        self.size=sz
 
+    def getSize(self):
+       return(self.size)
+
     def signalLongpress(self, icon):
        #print "signalLongpress()", icon
        self.emit('long-press', icon)
@@ -154,6 +157,8 @@ class Icons(gobject.GObject):
                if app!=None:
                    app['icon2']=getIcon(app['icon'])
                    self.get(x,y).setApp(app)
+           else:
+               self.get(x,y).setApp(None)
 
 #      for f in fn:
 #          dt=apps.readOne(f)
index ed254c0..878c063 100755 (executable)
@@ -65,16 +65,31 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
        HomePluginItem.__init__(self)
        FremantleRotation.__init__(self, 'DrlaunchPlugin')
 
-       launcher.init()
-       config.load()
-       self.setSize(config.getSize())
-       self.reloadIcons()
+       self.winConfig=None
 
        self.set_settings(True)
        self.connect('show-settings', self.slot_show_settings)
        self.connect('long-press', self.signalLongpress)
+       self.connect('click', self.signalClick)
+
+    def get_id(self):
+       """If this is called from the constructor then the program
+       core dumps """
+       aid=self.get_applet_id()
+
+       ret="%s" % aid
+
+       return(ret)
 
     def do_realize(self):
+       #print "realize"
+
+       launcher.init()
+       config.init(self.get_id())
+       config.load()
+       self.setSize(config.getSize())
+       self.reloadIcons()
+
        screen=self.get_screen()
        self.set_colormap(screen.get_rgba_colormap())
        self.set_app_paintable(True)
@@ -91,30 +106,51 @@ class DrlaunchPlugin(IconGrid, HomePluginItem, FremantleRotation):
        HomePluginItem.do_expose_event(self, event)
 
     def slot_show_settings(self, dt):
+       if self.winConfig!=None:
+           # Doesn't work
+           # self.winConfig.show_all()
+           return
+
        s=WinConfig()
        s.show_all()
        s.connect('destroy', self.slotConfigDestroy)
+       self.winConfig=s
 
     def slotConfigDestroy(self, sender):
+       self.winConfig=None
+
        dt=sender.getData()
        config.setSize(dt['size'])
        config.setApps(dt['apps'])
+       config.setIndiv(dt['indiv'])
+       config.setLongpress(dt['longpress'])
        config.save()
        
        # Resize widget
        self.setSize(dt['size'])
        self.reloadIcons()
 
-#      self.queue_draw()
+       self.queue_draw()
 
-    def signalLongpress(self, sender, icon):
+    def handle_click(self, sender, icon):
+       """ common handler for longpress and click """
        if icon.name!=None and icon.name!='':
            launcher.launch(icon.name)
 
+    def signalLongpress(self, sender, icon):
+       if config.getLongpress():
+           self.handle_click(sender, icon)
+
+    def signalClick(self, sender, icon):
+       if not config.getLongpress():
+           self.handle_click(sender, icon)
+
     def resize(self):
-       w=(self.size * config.iconsize) + \
-           (self.size * config.iconspace)
-       self.set_size_request(w, w)
+       w=(self.size[0] * config.iconsize) + \
+           (self.size[0] * config.iconspace)
+       h=(self.size[1] * config.iconsize) + \
+           (self.size[1] * config.iconspace)
+       self.set_size_request(w, h)
 
     def setSize(self, size):
        IconGrid.setSize(self, size)
index 5aafacb..016de49 100755 (executable)
@@ -60,46 +60,107 @@ class WinConfig(StackableWindow):
 #      hbox.add(vbox)
        al.add(vbox)
 
-       vbox.add(gtk.Label('Grid size:'))
+       maxsz=config.getMaxSize()
 
-       self.butsSize=[]
-       for i in xrange(4):
-           but=gtk.ToggleButton("%sx%s" % (i+1,i+1))
-           but.set_size_request(160, 90)
-           self.butsSize.append(but)
-           but.connect('toggled', self.slotButtonSize, i)
+       # ----------------------------------------------
+       vbox.add(gtk.Label('Width:'))
 
        hbox2=gtk.HBox()
        vbox.add(hbox2)
-       hbox2.add(self.butsSize[0])
-       hbox2.add(self.butsSize[1])
+
+       self.butsSizeX=[]
+       self.butsSize=self.butsSizeX # For now
+       for i in xrange(maxsz[0]):
+           but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
+           but.set_label("%s" % (i+1,))
+           but.connect('toggled', self.slotButtonSizeX, i)
+
+           self.butsSizeX.append(but)
+
+           hbox2.add(but)
+
+       # ----------------------------------------------
+       vbox.add(gtk.Label('Height:'))
+
        hbox2=gtk.HBox()
        vbox.add(hbox2)
-       hbox2.add(self.butsSize[2])
-       hbox2.add(self.butsSize[3])
 
-       self.igw.connect('long-press', self.slotLongpress)
+       self.butsSizeY=[]
+       for i in xrange(maxsz[1]):
+           but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
+           but.set_label("%s" % (i+1,))
+           but.connect('toggled', self.slotButtonSizeY, i)
+
+           self.butsSizeY.append(but)
+
+           hbox2.add(but)
+
+       but=hildon.CheckButton(
+               gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
+       but.set_label("Rotate icons individually")
+       but.connect('toggled', self.slotButtonRotateIndividually)
+       self.buttonRotateIndividually=but
+       vbox.add(but)
+
+       but=hildon.CheckButton(
+               gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
+       but.set_label("Require long press")
+#      but.connect('toggled', self.slotButtonLongpress)
+       self.buttonRequireLongpress=but
+       vbox.add(but)
+
+       #self.igw.connect('long-press', self.slotLongpress)
+       self.igw.connect('click', self.slotLongpress)
 
        self.ignore_toggle=False
 
        self.setSize(config.getSize())
+       self.setIndiv(config.getIndiv())
+       self.setLongpress(config.getLongpress())
 
     def slotLongpress(self, sender, icon):
        self.doConfig(icon)
 
-    def slotButtonSize(self, sender, id):
-       self.setSize(id+1)
+    def slotButtonSizeX(self, sender, id):
+       if self.getIndiv():
+           old=self.getSize()
+           sz=(id+1, old[1])
+       else:
+           sz=(id+1, id+1)
+
+       self.setSize(sz)
+       
+    def slotButtonSizeY(self, sender, id):
+       old=self.getSize()
+       sz=(old[0], id+1)
+       self.setSize(sz)
        
+    def slotButtonRotateIndividually(self, sender):
+       but=self.buttonRotateIndividually
+       self.setIndiv(but.get_active())
+
+#    def slotButtonLongpress(self, sender):
+#      but=self.buttonRequireLongpress
+#      self.set
+
     def setSize(self, sz):
        if self.ignore_toggle:
            return
 
        self.ignore_toggle=True
 
-       id=sz-1
+       maxsz=config.getMaxSize()
+
+       id=sz[0]-1
 
-       for i in xrange(4):
-           but=self.butsSize[i]
+       for i in xrange(maxsz[0]):
+           but=self.butsSizeX[i]
+           but.set_active(i==id)
+
+       id=sz[1]-1
+
+       for i in xrange(maxsz[1]):
+           but=self.butsSizeY[i]
            but.set_active(i==id)
 
        self.ignore_toggle=False
@@ -108,6 +169,31 @@ class WinConfig(StackableWindow):
 
        self.igw.queue_draw()
 
+    def getSize(self):
+       return(self.igw.getSize())
+
+    def getIndiv(self):
+       ret=self.buttonRotateIndividually.get_active()
+
+       return(ret)
+
+    def setIndiv(self, indiv):
+       if indiv:
+           for i in self.butsSizeY:
+               i.set_sensitive(True)
+       else:
+           for i in self.butsSizeY:
+               i.set_sensitive(False)
+           sz=self.getSize()
+           szx=sz[0]
+           if szx>4:
+               szx=4
+           self.setSize((szx, szx))
+
+       self.buttonRotateIndividually.set_active(indiv)
+
+    def setLongpress(self, lp):
+       self.buttonRequireLongpress.set_active(lp)
 
     def doConfig(self, icon):
        aps=apps.scan()
@@ -168,23 +254,39 @@ class WinConfig(StackableWindow):
        dialog.destroy()
 
     def getData(self):
-       sz=0
-       for but in self.butsSize:
-           sz+=1
+       szx=0
+       szy=0
+       for but in self.butsSizeX:
+           szx+=1
            if but.get_active()==True:
                break
 
+       for but in self.butsSizeY:
+           szy+=1
+           if but.get_active()==True:
+               break
+
+       if self.getIndiv():
+           sz=(szx, szy)
+       else:
+           sz=(szx, szx)
+
        wapps={}
 
-       for x in xrange(sz):
-           for y in xrange(sz):
+       for x in xrange(sz[0]):
+           for y in xrange(sz[1]):
                ico=self.igw.get(x,y)
                k=(x,y)
                wapps[k]=ico.name
 
+       indiv=self.buttonRotateIndividually.get_active()
+       lp=self.buttonRequireLongpress.get_active()
+
        ret={
-           'size':     sz,
-           'apps':     wapps
+           'size':         sz,
+           'apps':         wapps,
+           'indiv':        indiv,
+           'longpress':    lp,
            }
 
        return(ret)