From 0fbb9ce4e10bb20ffc0078d666b8f0f58e9bfba2 Mon Sep 17 00:00:00 2001 From: Stefanos Harhalakis Date: Mon, 28 Jun 2010 22:01:03 +0000 Subject: [PATCH] --- src/config.py | 129 ++++++++++++++++++++++++++++++++++++++++++--- src/icon.py | 8 ++- src/icongrid.py | 17 ++++-- src/icons.py | 15 ++++-- src/widget.py | 54 +++++++++++++++---- src/win_config.py | 150 ++++++++++++++++++++++++++++++++++++++++++++--------- 6 files changed, 320 insertions(+), 53 deletions(-) diff --git a/src/config.py b/src/config.py index d208444..5c7e39e 100755 --- a/src/config.py +++ b/src/config.py @@ -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: diff --git a/src/icon.py b/src/icon.py index 8d2c099..335f6e4 100755 --- a/src/icon.py +++ b/src/icon.py @@ -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): diff --git a/src/icongrid.py b/src/icongrid.py index ad4f84f..5eee444 100755 --- a/src/icongrid.py +++ b/src/icongrid.py @@ -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() diff --git a/src/icons.py b/src/icons.py index e0d1c9a..9c344ee 100755 --- a/src/icons.py +++ b/src/icons.py @@ -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) diff --git a/src/widget.py b/src/widget.py index ed254c0..878c063 100755 --- a/src/widget.py +++ b/src/widget.py @@ -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) diff --git a/src/win_config.py b/src/win_config.py index 5aafacb..016de49 100755 --- a/src/win_config.py +++ b/src/win_config.py @@ -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) -- 1.7.9.5