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
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
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:
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):
#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
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):
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:
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()
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
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
self.size=sz
+ def getSize(self):
+ return(self.size)
+
def signalLongpress(self, icon):
#print "signalLongpress()", icon
self.emit('long-press', icon)
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)
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)
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)
# 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
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()
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)