4 # Copyright (C) 2010 Stefanos Harhalakis
6 # This file is part of wifieye.
8 # wifieye is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # wifieye is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with wifieye. If not, see <http://www.gnu.org/licenses/>.
21 # $Id: 0.py 2265 2010-02-21 19:16:26Z v13 $
23 __version__ = "$Id: 0.py 2265 2010-02-21 19:16:26Z v13 $"
31 from hildon import StackableWindow
32 #from portrait import FremantleRotation
33 #from xdg.IconTheme import getIconPath
37 from icon import Icon, getIcon
38 from iconw import IconWidget
39 from icongrid import IconGridWidget
40 from about import DlgAbout
41 from portrait import FremantleRotation
42 from sig import Disconnector
44 class DialogIconSize(gtk.Dialog):
45 def __init__(self, config):
46 gtk.Dialog.__init__(self, "Adjust icon size")
48 # Operate on copy of config
49 self.config=copy.copy(config)
50 # And keep another copy to be able to undo
51 self.config0=copy.copy(config)
55 self.pa=hildon.PannableArea()
57 self.pa.set_property('mov-mode', hildon.MOVEMENT_MODE_VERT)
60 self.pa.add_with_viewport(vbox)
61 self.pa.set_size_request(-1, 1000)
63 self.labelDim=gtk.Label("koko")
64 vbox.add(self.labelDim)
66 vbox.add(gtk.Label("Icon size:"))
69 scale.set_value_pos(gtk.POS_RIGHT)
70 scale.set_range(*self.config.getIconSizeRange())
71 scale.set_increments(8, 16)
72 self.scaleIconSize=scale
79 vbox2.add(gtk.Label("Padding:"))
82 scale.set_value_pos(gtk.POS_RIGHT)
83 scale.set_range(*self.config.getIconPaddingRange())
84 scale.set_increments(2,2)
85 self.scaleIconPadding=scale
90 vbox2.add(gtk.Label("Margin:"))
93 scale.set_value_pos(gtk.POS_RIGHT)
94 scale.set_range(*self.config.getIconMarginRange())
95 scale.set_increments(2,2)
96 self.scaleIconMargin=scale
100 self.icon=IconWidget(False, self.config)
101 self.icon.setApp('osso-addressbook')
104 self.scaleIconSize.set_value(self.config.getIconSize())
105 self.scaleIconPadding.set_value(self.config.getIconPadding())
106 self.scaleIconMargin.set_value(self.config.getIconMargin())
108 # Set thos after settings initial values to avoid unwanted effects
109 self.scaleIconSize.connect('value-changed', self.slotSzChangeSize)
110 self.scaleIconPadding.connect('value-changed', self.slotSzChangePadding)
111 self.scaleIconMargin.connect('value-changed', self.slotSzChangeMargin)
117 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
118 hildon.BUTTON_ARRANGEMENT_VERTICAL)
120 but.connect("clicked", self.slotButtonOK)
122 self.action_area.pack_start(but)
126 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
127 hildon.BUTTON_ARRANGEMENT_VERTICAL)
128 but.set_title("Undo")
129 but.connect("clicked", self.slotButtonUndo)
131 self.action_area.pack_start(but)
135 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
136 hildon.BUTTON_ARRANGEMENT_VERTICAL)
137 but.set_title("Restore defaults")
138 but.connect("clicked", self.slotButtonDefaults)
140 self.action_area.pack_start(but)
141 self.buttonDefaults=but
147 def setWH(self, w, h):
148 self.labelDim.set_text("Grid size: %d x %d icons" % (w, h))
149 #self.labelWidth.set_text("Width: %d icons" % w)
150 #self.labelHeight.set_text("Height: %d icons" % h)
153 maxsz=self.config.getMaxSize()
154 self.setWH(maxsz[0], maxsz[1])
157 def getIconSize(self):
158 return(self.scaleIconSize.get_value())
160 def setIconSize(self, iconsize):
161 self.scaleIconSize.set_value(iconsize)
163 def getIconPadding(self):
164 return(self.scaleIconPadding.get_value())
166 def setIconPadding(self, pad):
167 self.scaleIconPadding.set_value(pad)
169 def getIconMargin(self):
170 return(self.scaleIconMargin.get_value())
172 def setIconMargin(self, margin):
173 self.scaleIconMargin.set_value(margin)
175 def slotSzChangeSize(self, sender):
176 self.config.setIconSize(int(self.getIconSize()))
179 def slotSzChangeMargin(self, sender):
180 self.config.setIconMargin(int(self.getIconMargin()))
183 def slotSzChangePadding(self, sender):
184 self.config.setIconPadding(int(self.getIconPadding()))
187 def slotButtonUndo(self, sender):
188 self.config=copy.copy(self.config0)
192 def slotButtonDefaults(self, sender):
193 self.config.setDefaultSizes()
197 def slotButtonOK(self, sender):
198 self.response(gtk.RESPONSE_OK)
200 def resetSliders(self):
201 self.scaleIconSize.set_value(self.config.getIconSize())
202 self.scaleIconPadding.set_value(self.config.getIconPadding())
203 self.scaleIconMargin.set_value(self.config.getIconMargin())
207 'size': self.config.getIconSize(),
208 'padding': self.config.getIconPadding(),
209 'margin': self.config.getIconMargin()
215 class WinConfig(StackableWindow, Disconnector): #, FremantleRotation):
216 def __init__(self, config, *args):
217 StackableWindow.__init__(self)
218 Disconnector.__init__(self)
219 # FremantleRotation.__init__(self, "DrlaunchPlugin",
220 # mode=FremantleRotation.AUTOMATIC)
222 self.config=copy.copy(config)
226 # h=self.c(self, 'delete-event', self.slotDeleteEvent)
228 # This is a nice test. If it is displayed then the window is actually
229 # destroyed and there is no memory leak
235 self.pa Main Pannable Area
236 self.col1 A VBox for the first column
237 self.col2 A VBox for the second column
238 self.w_igw The IGW in an alignment
240 self.set_title("DrLaunch v" + config.version)
242 self.pa=hildon.PannableArea()
244 self.pa.set_property('mov-mode', hildon.MOVEMENT_MODE_HORIZ)
249 #1 self.pa.add_with_viewport(hbox)
251 # Add the first column of options
252 al=gtk.Alignment(yscale=1)
259 maxsz=self.config.getMaxSize()
261 self.maxmaxsz=(16,16)
263 # ----------------------------------------------
264 vbox.add(gtk.Label('Width:'))
270 for i in xrange(self.maxmaxsz[0]):
271 but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
272 but.set_label("%s" % (i+1,))
273 self.c(but, 'toggled', self.slotButtonSizeX, i)
275 self.butsSizeX.append(but)
279 # ----------------------------------------------
280 vbox.add(gtk.Label('Height:'))
286 for i in xrange(self.maxmaxsz[1]):
287 but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
288 but.set_label("%s" % (i+1,))
289 self.c(but, 'toggled', self.slotButtonSizeY, i)
291 self.butsSizeY.append(but)
297 al=gtk.Alignment(xalign=0, yalign=1, xscale=1)
304 but=hildon.CheckButton(
305 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
306 but.set_label("Rotate icons individually")
307 self.c(but, 'toggled', self.slotButtonRotateIndividually)
308 self.buttonRotateIndividually=but
311 but=hildon.CheckButton(
312 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
313 but.set_label("Require long press")
314 # but.connect('toggled', self.slotButtonLongpress)
315 self.buttonRequireLongpress=but
318 but=hildon.CheckButton(
319 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
320 but.set_label("Animate rotation")
321 self.buttonAnimateRotation=but
324 # -----------------------------------------------
325 # Second column of options
328 al=gtk.Alignment(xalign=0, yalign=1, xscale=1)
332 but=hildon.CheckButton(
333 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
334 but.set_label("Theme background")
335 but.connect('toggled', self.slotButtonThemeBackground)
336 self.buttonThemeBackground=but
339 but=hildon.CheckButton(
340 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
341 but.set_label("No background")
342 self.c(but, 'toggled', self.slotButtonNoBackground)
343 self.buttonNoBackground=but
347 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
348 hildon.BUTTON_ARRANGEMENT_VERTICAL)
349 but.set_label("Adjust icon size")
350 self.c(but, 'clicked', self.slotButtonIconSize)
351 self.buttonIconSize=but
356 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
357 hildon.BUTTON_ARRANGEMENT_VERTICAL)
358 but.set_title("About")
359 self.c(but, "clicked", self.slotButtonAbout)
363 # -----------------------------------------------
365 self.igw=IconGridWidget(True, self.config, False)
366 # self.igw.do_realize()
367 # self.igw.setSize(config.getSize())
368 al=gtk.Alignment(xalign=0, xscale=0)
370 al.set_padding(0, 0, 20, 0)
374 self.igw.connect('long-press', self.slotLongpress)
375 self.igw.connect('click', self.slotLongpress)
377 self.ignore_toggle=False
379 self.setSize(self.config.getSize())
380 self.setIndiv(self.config.getIndiv())
381 self.setLongpress(self.config.getLongpress())
382 self.setAnimate(self.config.getAnimate())
383 self.setNoBg(self.config.getNoBg())
384 self.setThemeBg(self.config.getThemeBg())
385 # self.setIconSize(self.config.getIconSize())
386 # self.setIconPadding(self.config.getIconPadding())
387 # self.setIconMargin(self.config.getIconMargin())
393 self.pa.add_with_viewport(hbox)
397 # def setupUi(self, orientation):
403 # if orientation=='l':
404 # hbox.add(self.col1)
405 # hbox.add(self.col2)
406 # hbox.add(self.w_igw)
410 # vbox.add(self.col1)
411 # vbox.add(self.col2)
412 # hbox.add(self.w_igw)
414 # self.pa.add_with_viewport(hbox)
416 # if self.get_child()!=None:
417 # self.remove(self.get_child())
421 def adjustMaxSize(self):
422 sz=self.config.getMaxSize()
425 for x in xrange(maxsz[0]):
427 self.butsSizeX[x].show()
429 self.butsSizeX[x].hide()
431 for y in xrange(maxsz[1]):
433 self.butsSizeY[y].show()
435 self.butsSizeY[y].hide()
446 self.setIndiv(self.getIndiv())
448 def setLayoutPortrait(self):
454 self.col1.reparent(vbox)
455 self.col2.reparent(vbox)
456 self.w_igw.reparent(hbox)
458 r=self.pa.get_children()[0]
461 self.pa.add_with_viewport(hbox)
465 def setLayoutLandscape(self):
469 self.col1.reparent(hbox)
470 self.col2.reparent(hbox)
471 self.w_igw.reparent(hbox)
473 r=self.pa.get_children()[0]
476 self.pa.add_with_viewport(hbox)
480 def on_orientation_changed(self, orientation):
481 # This is disabled for now since I've not found any reliable
482 # way for supporting orientation changes (#$#%$#*&% GTK)
485 print "orch:", orientation
486 if orientation=='portrait':
487 self.setLayoutPortrait()
489 self.setLayoutLandscape()
491 # def slotDeleteEvent(self, sender, event):
492 # print "wc-del-event"
495 def slotLongpress(self, sender, icon):
498 def slotButtonSizeX(self, sender, id):
507 def slotButtonSizeY(self, sender, id):
512 def slotButtonRotateIndividually(self, sender):
513 but=self.buttonRotateIndividually
514 self.setIndiv(but.get_active())
516 def slotButtonNoBackground(self, sender):
520 def slotButtonThemeBackground(self, sender):
521 themebg=self.getThemeBg()
522 self.setThemeBg(themebg)
524 def slotButtonAbout(self, sender):
525 DlgAbout.present2(self)
527 def slotButtonIconSize(self, sender):
528 dlg=DialogIconSize(self.config)
533 if ret!=gtk.RESPONSE_OK:
536 self.config.setIconSize(dt['size'])
537 self.config.setIconMargin(dt['margin'])
538 self.config.setIconPadding(dt['padding'])
544 StackableWindow.show_all(self)
549 # def slotScaleIconSzChange(self, sender):
551 # self.config.setIconSize(self.getIconSize())
552 # self.config.setIconMargin(self.getIconMargin())
553 # self.config.setIconPadding(self.getIconPadding())
554 # self.igw.reconfig()
555 # self.adjustMaxSize()
558 # def slotButtonLongpress(self, sender):
559 # but=self.buttonRequireLongpress
562 def setSize(self, sz):
563 if self.ignore_toggle:
566 self.ignore_toggle=True
568 maxsz=self.config.getMaxSize()
572 for i in xrange(maxsz[0]):
573 but=self.butsSizeX[i]
574 but.set_active(i==id)
578 for i in xrange(maxsz[1]):
579 but=self.butsSizeY[i]
580 but.set_active(i==id)
582 self.ignore_toggle=False
586 self.igw.queue_draw()
590 return(self.igw.getSize())
593 ret=self.buttonRotateIndividually.get_active()
597 def setIndiv(self, indiv):
599 for i in self.butsSizeY:
600 i.set_sensitive(True)
601 for i in self.butsSizeX:
602 i.set_sensitive(True)
605 sz=self.config.getMaxSize()
607 for i in self.butsSizeY:
608 i.set_sensitive(False)
611 for i in self.butsSizeX:
613 # Height is always the narrower, so use that as a limit
615 i.set_sensitive(False)
617 i.set_sensitive(True)
623 self.setSize((szx, szx))
625 self.buttonRotateIndividually.set_active(indiv)
627 def setLongpress(self, lp):
628 self.buttonRequireLongpress.set_active(lp)
630 def setAnimate(self, ar):
631 self.buttonAnimateRotation.set_active(ar)
634 ret=self.buttonNoBackground.get_active()
637 def setNoBg(self, nobg):
638 self.buttonNoBackground.set_active(nobg)
640 self.buttonThemeBackground.set_sensitive(not nobg)
641 self.config.setNoBg(nobg)
644 def getThemeBg(self):
645 ret=self.buttonThemeBackground.get_active()
648 def setThemeBg(self, themebg):
649 self.buttonThemeBackground.set_active(themebg)
650 self.config.setThemeBg(themebg)
653 def doConfig(self, icon):
656 lst=[aps[x]['name'] for x in aps]
659 dialog=gtk.Dialog('App select', None,
660 gtk.DIALOG_DESTROY_WITH_PARENT, buttons=())
662 selector=hildon.TouchSelectorEntry(text=True)
663 selector.set_column_selection_mode(
664 hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
666 dialog.vbox.pack_start(selector, True, True, 0)
667 dialog.set_size_request(0,900)
668 dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
669 dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
671 selector.append_text('None')
678 selector.append_text(app)
679 if icon.appname!=None and aps[icon.appname]['name']==app:
683 selector.set_active(0, idx)
691 if r==gtk.RESPONSE_OK:
692 idx2=selector.get_active(0)
698 if aps[i]['name']==cur:
702 app['icon2']=getIcon(app['icon'], self.config.getIconSize())
721 for but in self.butsSizeX:
723 if but.get_active()==True:
726 for but in self.butsSizeY:
728 if but.get_active()==True:
738 for x in xrange(sz[0]):
739 for y in xrange(sz[1]):
740 ico=self.igw.get(x,y)
744 indiv=self.buttonRotateIndividually.get_active()
745 lp=self.buttonRequireLongpress.get_active()
746 ar=self.buttonAnimateRotation.get_active()
747 nobg=self.buttonNoBackground.get_active()
748 themebg=self.buttonThemeBackground.get_active()
758 'iconsize': self.config.getIconSize(),
759 'iconpadding': self.config.getIconPadding(),
760 'iconmargin': self.config.getIconMargin(),
765 if __name__=="__main__":
767 win.connect('delete-event', gtk.main_quit)
774 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent: