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
45 class DialogIconSize(gtk.Dialog):
46 def __init__(self, config):
47 gtk.Dialog.__init__(self, "Adjust icon size")
49 # Operate on copy of config
50 self.config=copy.copy(config)
51 # And keep another copy to be able to undo
52 self.config0=copy.copy(config)
56 self.pa=hildon.PannableArea()
58 self.pa.set_property('mov-mode', hildon.MOVEMENT_MODE_VERT)
61 self.pa.add_with_viewport(vbox)
62 self.pa.set_size_request(-1, 1000)
64 self.labelDim=gtk.Label("koko")
65 vbox.add(self.labelDim)
67 vbox.add(gtk.Label("Icon size:"))
70 scale.set_value_pos(gtk.POS_RIGHT)
71 scale.set_range(*self.config.getIconSizeRange())
72 scale.set_increments(8, 16)
73 self.scaleIconSize=scale
80 vbox2.add(gtk.Label("Padding:"))
83 scale.set_value_pos(gtk.POS_RIGHT)
84 scale.set_range(*self.config.getIconPaddingRange())
85 scale.set_increments(2,2)
86 self.scaleIconPadding=scale
91 vbox2.add(gtk.Label("Margin:"))
94 scale.set_value_pos(gtk.POS_RIGHT)
95 scale.set_range(*self.config.getIconMarginRange())
96 scale.set_increments(2,2)
97 self.scaleIconMargin=scale
101 self.icon=IconWidget(False, self.config)
102 self.icon.setApp('osso-addressbook')
105 self.scaleIconSize.set_value(self.config.getIconSize())
106 self.scaleIconPadding.set_value(self.config.getIconPadding())
107 self.scaleIconMargin.set_value(self.config.getIconMargin())
109 # Set thos after settings initial values to avoid unwanted effects
110 self.scaleIconSize.connect('value-changed', self.slotSzChangeSize)
111 self.scaleIconPadding.connect('value-changed', self.slotSzChangePadding)
112 self.scaleIconMargin.connect('value-changed', self.slotSzChangeMargin)
118 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
119 hildon.BUTTON_ARRANGEMENT_VERTICAL)
121 but.connect("clicked", self.slotButtonOK)
123 self.action_area.pack_start(but)
127 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
128 hildon.BUTTON_ARRANGEMENT_VERTICAL)
129 but.set_title("Undo")
130 but.connect("clicked", self.slotButtonUndo)
132 self.action_area.pack_start(but)
136 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
137 hildon.BUTTON_ARRANGEMENT_VERTICAL)
138 but.set_title("Restore defaults")
139 but.connect("clicked", self.slotButtonDefaults)
141 self.action_area.pack_start(but)
142 self.buttonDefaults=but
148 def setWH(self, w, h):
149 self.labelDim.set_text("Grid size: %d x %d icons" % (w, h))
150 #self.labelWidth.set_text("Width: %d icons" % w)
151 #self.labelHeight.set_text("Height: %d icons" % h)
154 maxsz=self.config.getMaxSize()
155 self.setWH(maxsz[0], maxsz[1])
158 def getIconSize(self):
159 return(self.scaleIconSize.get_value())
161 def setIconSize(self, iconsize):
162 self.scaleIconSize.set_value(iconsize)
164 def getIconPadding(self):
165 return(self.scaleIconPadding.get_value())
167 def setIconPadding(self, pad):
168 self.scaleIconPadding.set_value(pad)
170 def getIconMargin(self):
171 return(self.scaleIconMargin.get_value())
173 def setIconMargin(self, margin):
174 self.scaleIconMargin.set_value(margin)
176 def slotSzChangeSize(self, sender):
177 self.config.setIconSize(int(self.getIconSize()))
180 def slotSzChangeMargin(self, sender):
181 self.config.setIconMargin(int(self.getIconMargin()))
184 def slotSzChangePadding(self, sender):
185 self.config.setIconPadding(int(self.getIconPadding()))
188 def slotButtonUndo(self, sender):
189 self.config=copy.copy(self.config0)
193 def slotButtonDefaults(self, sender):
194 self.config.setDefaultSizes()
198 def slotButtonOK(self, sender):
199 self.response(gtk.RESPONSE_OK)
201 def resetSliders(self):
202 self.scaleIconSize.set_value(self.config.getIconSize())
203 self.scaleIconPadding.set_value(self.config.getIconPadding())
204 self.scaleIconMargin.set_value(self.config.getIconMargin())
208 'size': self.config.getIconSize(),
209 'padding': self.config.getIconPadding(),
210 'margin': self.config.getIconMargin()
216 class WinConfig(StackableWindow, Disconnector): #, FremantleRotation):
217 def __init__(self, config, *args):
218 StackableWindow.__init__(self)
219 Disconnector.__init__(self)
220 # FremantleRotation.__init__(self, "DrlaunchPlugin",
221 # mode=FremantleRotation.AUTOMATIC)
223 self.config=copy.copy(config)
227 # h=self.c(self, 'delete-event', self.slotDeleteEvent)
229 # This is a nice test. If it is displayed then the window is actually
230 # destroyed and there is no memory leak
236 self.pa Main Pannable Area
237 self.col1 A VBox for the first column
238 self.col2 A VBox for the second column
239 self.w_igw The IGW in an alignment
241 self.set_title("DrLaunch v" + config.version)
243 self.pa=hildon.PannableArea()
245 self.pa.set_property('mov-mode', hildon.MOVEMENT_MODE_HORIZ)
250 #1 self.pa.add_with_viewport(hbox)
252 # Add the first column of options
253 al=gtk.Alignment(yscale=1)
260 maxsz=self.config.getMaxSize()
262 self.maxmaxsz=(16,16)
264 # ----------------------------------------------
265 vbox.add(gtk.Label('Width:'))
271 for i in xrange(self.maxmaxsz[0]):
272 but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
273 but.set_label("%s" % (i+1,))
274 self.c(but, 'toggled', self.slotButtonSizeX, i)
276 self.butsSizeX.append(but)
280 # ----------------------------------------------
281 vbox.add(gtk.Label('Height:'))
287 for i in xrange(self.maxmaxsz[1]):
288 but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
289 but.set_label("%s" % (i+1,))
290 self.c(but, 'toggled', self.slotButtonSizeY, i)
292 self.butsSizeY.append(but)
298 al=gtk.Alignment(xalign=0, yalign=1, xscale=1)
305 but=hildon.CheckButton(
306 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
307 but.set_label("Rotate icons individually")
308 self.c(but, 'toggled', self.slotButtonRotateIndividually)
309 self.buttonRotateIndividually=but
312 but=hildon.CheckButton(
313 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
314 but.set_label("Require long press")
315 # but.connect('toggled', self.slotButtonLongpress)
316 self.buttonRequireLongpress=but
319 but=hildon.CheckButton(
320 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
321 but.set_label("Animate rotation")
322 self.buttonAnimateRotation=but
325 # -----------------------------------------------
326 # Second column of options
329 al=gtk.Alignment(xalign=0, yalign=1, xscale=1)
333 but=hildon.CheckButton(
334 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
335 but.set_label("Theme background")
336 but.connect('toggled', self.slotButtonThemeBackground)
337 self.buttonThemeBackground=but
340 but=hildon.CheckButton(
341 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
342 but.set_label("No background")
343 self.c(but, 'toggled', self.slotButtonNoBackground)
344 self.buttonNoBackground=but
348 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
349 hildon.BUTTON_ARRANGEMENT_VERTICAL)
350 but.set_label("Adjust icon size")
351 self.c(but, 'clicked', self.slotButtonIconSize)
352 self.buttonIconSize=but
357 gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
358 hildon.BUTTON_ARRANGEMENT_VERTICAL)
359 but.set_title("About")
360 self.c(but, "clicked", self.slotButtonAbout)
364 # -----------------------------------------------
366 self.igw=IconGridWidget(True, self.config, False)
367 # self.igw.do_realize()
368 # self.igw.setSize(config.getSize())
369 al=gtk.Alignment(xalign=0, xscale=0)
371 al.set_padding(0, 0, 20, 0)
375 self.igw.connect('long-press', self.slotLongpress)
376 self.igw.connect('click', self.slotLongpress)
378 self.ignore_toggle=False
380 self.setSize(self.config.getSize())
381 self.setIndiv(self.config.getIndiv())
382 self.setLongpress(self.config.getLongpress())
383 self.setAnimate(self.config.getAnimate())
384 self.setNoBg(self.config.getNoBg())
385 self.setThemeBg(self.config.getThemeBg())
386 # self.setIconSize(self.config.getIconSize())
387 # self.setIconPadding(self.config.getIconPadding())
388 # self.setIconMargin(self.config.getIconMargin())
394 self.pa.add_with_viewport(hbox)
398 # def setupUi(self, orientation):
404 # if orientation=='l':
405 # hbox.add(self.col1)
406 # hbox.add(self.col2)
407 # hbox.add(self.w_igw)
411 # vbox.add(self.col1)
412 # vbox.add(self.col2)
413 # hbox.add(self.w_igw)
415 # self.pa.add_with_viewport(hbox)
417 # if self.get_child()!=None:
418 # self.remove(self.get_child())
422 def adjustMaxSize(self):
423 sz=self.config.getMaxSize()
426 for x in xrange(maxsz[0]):
428 self.butsSizeX[x].show()
430 self.butsSizeX[x].hide()
432 for y in xrange(maxsz[1]):
434 self.butsSizeY[y].show()
436 self.butsSizeY[y].hide()
447 self.setIndiv(self.getIndiv())
449 def setLayoutPortrait(self):
455 self.col1.reparent(vbox)
456 self.col2.reparent(vbox)
457 self.w_igw.reparent(hbox)
459 r=self.pa.get_children()[0]
462 self.pa.add_with_viewport(hbox)
466 def setLayoutLandscape(self):
470 self.col1.reparent(hbox)
471 self.col2.reparent(hbox)
472 self.w_igw.reparent(hbox)
474 r=self.pa.get_children()[0]
477 self.pa.add_with_viewport(hbox)
481 def on_orientation_changed(self, orientation):
482 # This is disabled for now since I've not found any reliable
483 # way for supporting orientation changes (#$#%$#*&% GTK)
486 print "orch:", orientation
487 if orientation=='portrait':
488 self.setLayoutPortrait()
490 self.setLayoutLandscape()
492 # def slotDeleteEvent(self, sender, event):
493 # print "wc-del-event"
496 def slotLongpress(self, sender, icon):
499 def slotButtonSizeX(self, sender, id):
508 def slotButtonSizeY(self, sender, id):
513 def slotButtonRotateIndividually(self, sender):
514 but=self.buttonRotateIndividually
515 self.setIndiv(but.get_active())
517 def slotButtonNoBackground(self, sender):
521 def slotButtonThemeBackground(self, sender):
522 themebg=self.getThemeBg()
523 self.setThemeBg(themebg)
525 def slotButtonAbout(self, sender):
526 DlgAbout.present2(self)
528 def slotButtonIconSize(self, sender):
529 dlg=DialogIconSize(self.config)
534 if ret!=gtk.RESPONSE_OK:
537 self.config.setIconSize(dt['size'])
538 self.config.setIconMargin(dt['margin'])
539 self.config.setIconPadding(dt['padding'])
545 StackableWindow.show_all(self)
550 # def slotScaleIconSzChange(self, sender):
552 # self.config.setIconSize(self.getIconSize())
553 # self.config.setIconMargin(self.getIconMargin())
554 # self.config.setIconPadding(self.getIconPadding())
555 # self.igw.reconfig()
556 # self.adjustMaxSize()
559 # def slotButtonLongpress(self, sender):
560 # but=self.buttonRequireLongpress
563 def setSize(self, sz):
564 if self.ignore_toggle:
567 self.ignore_toggle=True
569 maxsz=self.config.getMaxSize()
573 for i in xrange(maxsz[0]):
574 but=self.butsSizeX[i]
575 but.set_active(i==id)
579 for i in xrange(maxsz[1]):
580 but=self.butsSizeY[i]
581 but.set_active(i==id)
583 self.ignore_toggle=False
587 self.igw.queue_draw()
591 return(self.igw.getSize())
594 ret=self.buttonRotateIndividually.get_active()
598 def setIndiv(self, indiv):
600 for i in self.butsSizeY:
601 i.set_sensitive(True)
602 for i in self.butsSizeX:
603 i.set_sensitive(True)
606 sz=self.config.getMaxSize()
608 for i in self.butsSizeY:
609 i.set_sensitive(False)
612 for i in self.butsSizeX:
614 # Height is always the narrower, so use that as a limit
616 i.set_sensitive(False)
618 i.set_sensitive(True)
624 self.setSize((szx, szx))
626 self.buttonRotateIndividually.set_active(indiv)
628 def setLongpress(self, lp):
629 self.buttonRequireLongpress.set_active(lp)
631 def setAnimate(self, ar):
632 self.buttonAnimateRotation.set_active(ar)
635 ret=self.buttonNoBackground.get_active()
638 def setNoBg(self, nobg):
639 self.buttonNoBackground.set_active(nobg)
641 self.buttonThemeBackground.set_sensitive(not nobg)
642 self.config.setNoBg(nobg)
645 def getThemeBg(self):
646 ret=self.buttonThemeBackground.get_active()
649 def setThemeBg(self, themebg):
650 self.buttonThemeBackground.set_active(themebg)
651 self.config.setThemeBg(themebg)
654 def doConfig(self, icon):
657 lst=[aps[x]['name'] for x in aps]
660 dialog=gtk.Dialog('App select', None,
661 gtk.DIALOG_DESTROY_WITH_PARENT, buttons=())
663 selector=hildon.TouchSelectorEntry(text=True)
664 selector.set_column_selection_mode(
665 hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
667 dialog.vbox.pack_start(selector, True, True, 0)
668 dialog.set_size_request(0,900)
669 dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
670 dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
672 selector.append_text('None')
679 selector.append_text(app)
680 if icon.appname!=None and aps[icon.appname]['name']==app:
684 selector.set_active(0, idx)
692 if r==gtk.RESPONSE_OK:
693 idx2=selector.get_active(0)
699 if aps[i]['name']==cur:
703 app['icon2']=getIcon(app['icon'], self.config.getIconSize())
722 for but in self.butsSizeX:
724 if but.get_active()==True:
727 for but in self.butsSizeY:
729 if but.get_active()==True:
739 for x in xrange(sz[0]):
740 for y in xrange(sz[1]):
741 ico=self.igw.get(x,y)
745 indiv=self.buttonRotateIndividually.get_active()
746 lp=self.buttonRequireLongpress.get_active()
747 ar=self.buttonAnimateRotation.get_active()
748 nobg=self.buttonNoBackground.get_active()
749 themebg=self.buttonThemeBackground.get_active()
759 'iconsize': self.config.getIconSize(),
760 'iconpadding': self.config.getIconPadding(),
761 'iconmargin': self.config.getIconMargin(),
766 if __name__=="__main__":
768 win.connect('delete-event', gtk.main_quit)
775 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent: