Implement icon resizing.
[drlaunch] / src / win_config.py
index 92ff48d..472885e 100755 (executable)
@@ -26,6 +26,7 @@ import gtk
 import gobject
 import hildon
 import time
+import copy
 
 from hildon import StackableWindow
 #from portrait import FremantleRotation
@@ -38,13 +39,171 @@ from icongrid import IconGridWidget
 from about import DlgAbout
 from portrait import FremantleRotation
 
+class DialogIconSize(gtk.Dialog):
+    def __init__(self, config):
+       gtk.Dialog.__init__(self, "Adjust icon size")
+
+       # Operate on copy of config
+       self.config=copy.copy(config)
+       # And keep another copy to be able to undo
+       self.config0=copy.copy(config)
+
+       vbox=self.vbox
+
+       self.labelDim=gtk.Label("koko")
+       vbox.add(self.labelDim)
+
+       vbox.add(gtk.Label("Icon size:"))
+       scale=gtk.HScale()
+       scale.set_digits(0)
+       scale.set_value_pos(gtk.POS_RIGHT)
+       scale.set_range(48,128)
+       scale.set_increments(8, 16)
+       self.scaleIconSize=scale
+       vbox.add(scale)
+
+       hbox=gtk.HBox()
+       vbox.add(hbox)
+
+       vbox2=gtk.VBox()
+       vbox2.add(gtk.Label("Padding:"))
+       scale=gtk.HScale()
+       scale.set_digits(0)
+       scale.set_value_pos(gtk.POS_RIGHT)
+       scale.set_range(2,16)
+       scale.set_increments(2,2)
+       self.scaleIconPadding=scale
+       vbox2.add(scale)
+       hbox.add(vbox2)
+
+       vbox2=gtk.VBox()
+       vbox2.add(gtk.Label("Margin:"))
+       scale=gtk.HScale()
+       scale.set_digits(0)
+       scale.set_value_pos(gtk.POS_RIGHT)
+       scale.set_range(2,16)
+       scale.set_increments(2,2)
+       self.scaleIconMargin=scale
+       vbox2.add(scale)
+       hbox.add(vbox2)
+
+       self.scaleIconSize.set_value(self.config.getIconSize())
+       self.scaleIconPadding.set_value(self.config.getIconPadding())
+       self.scaleIconMargin.set_value(self.config.getIconMargin())
+
+       # Set thos after settings initial values to avoid unwanted effects
+       self.scaleIconSize.connect('value-changed', self.slotSzChangeSize)
+       self.scaleIconPadding.connect('value-changed', self.slotSzChangePadding)
+       self.scaleIconMargin.connect('value-changed', self.slotSzChangeMargin)
+
+       hbox=gtk.HBox()
+       vbox.add(hbox)
+
+       but=hildon.Button(
+               gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
+               hildon.BUTTON_ARRANGEMENT_VERTICAL)
+       but.set_title("OK")
+       but.connect("clicked", self.slotButtonOK)
+       #hbox.add(but)
+       self.action_area.pack_start(but)
+       self.buttonOK=but
+
+       but=hildon.Button(
+               gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
+               hildon.BUTTON_ARRANGEMENT_VERTICAL)
+       but.set_title("Undo")
+       but.connect("clicked", self.slotButtonUndo)
+       #hbox.add(but)
+       self.action_area.pack_start(but)
+       self.buttonUndo=but
+
+       but=hildon.Button(
+               gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
+               hildon.BUTTON_ARRANGEMENT_VERTICAL)
+       but.set_title("Restore defaults")
+       but.connect("clicked", self.slotButtonDefaults)
+       #hbox.add(but)
+       self.action_area.pack_start(but)
+       self.buttonDefaults=but
+
+       self.show_all()
+
+       self.recalc()
+
+    def setWH(self, w, h):
+       self.labelDim.set_text("Grid size: %d x %d icons" % (w, h))
+       #self.labelWidth.set_text("Width: %d icons" % w)
+       #self.labelHeight.set_text("Height: %d icons" % h)
+
+    def recalc(self):
+       maxsz=self.config.getMaxSize()
+       self.setWH(maxsz[0], maxsz[1])
+
+    def getIconSize(self):
+       return(self.scaleIconSize.get_value())
+
+    def setIconSize(self, iconsize):
+       self.scaleIconSize.set_value(iconsize)
+
+    def getIconPadding(self):
+       return(self.scaleIconPadding.get_value())
+
+    def setIconPadding(self, pad):
+       self.scaleIconPadding.set_value(pad)
+
+    def getIconMargin(self):
+       return(self.scaleIconMargin.get_value())
+
+    def setIconMargin(self, margin):
+       self.scaleIconMargin.set_value(margin)
+
+    def slotSzChangeSize(self, sender):
+       self.config.setIconSize(int(self.getIconSize()))
+       self.recalc()
+
+    def slotSzChangeMargin(self, sender):
+       self.config.setIconMargin(int(self.getIconMargin()))
+       self.recalc()
+
+    def slotSzChangePadding(self, sender):
+       self.config.setIconPadding(int(self.getIconPadding()))
+       self.recalc()
+
+    def slotButtonUndo(self, sender):
+       self.config=copy.copy(self.config0)
+       self.recalc()
+       self.resetSliders()
+
+    def slotButtonDefaults(self, sender):
+       self.config.setDefaultSizes()
+       self.recalc()
+       self.resetSliders()
+
+    def slotButtonOK(self, sender):
+       self.response(gtk.RESPONSE_OK)
+
+    def resetSliders(self):
+       self.scaleIconSize.set_value(self.config.getIconSize())
+       self.scaleIconPadding.set_value(self.config.getIconPadding())
+       self.scaleIconMargin.set_value(self.config.getIconMargin())
+
+    def getData(self):
+       ret={
+           'size':     self.config.getIconSize(),
+           'padding':  self.config.getIconPadding(),
+           'margin':   self.config.getIconMargin()
+           }
+
+       return(ret)
+
+
 class WinConfig(StackableWindow): #, FremantleRotation):
     def __init__(self, config, *args):
        StackableWindow.__init__(self)
 #      FremantleRotation.__init__(self, "DrlaunchPlugin",
 #          mode=FremantleRotation.AUTOMATIC)
 
-       self.config=config
+       self.config=copy.copy(config)
 
        self.setupUi()
 
@@ -74,6 +233,8 @@ class WinConfig(StackableWindow): #, FremantleRotation):
 
        maxsz=self.config.getMaxSize()
 
+       self.maxmaxsz=(16,16)
+
        # ----------------------------------------------
        vbox.add(gtk.Label('Width:'))
 
@@ -82,7 +243,7 @@ class WinConfig(StackableWindow): #, FremantleRotation):
 
        self.butsSizeX=[]
        self.butsSize=self.butsSizeX # For now
-       for i in xrange(maxsz[0]):
+       for i in xrange(self.maxmaxsz[0]):
            but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
            but.set_label("%s" % (i+1,))
            but.connect('toggled', self.slotButtonSizeX, i)
@@ -98,7 +259,7 @@ class WinConfig(StackableWindow): #, FremantleRotation):
        vbox.add(hbox2)
 
        self.butsSizeY=[]
-       for i in xrange(maxsz[1]):
+       for i in xrange(self.maxmaxsz[1]):
            but=hildon.GtkToggleButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
            but.set_label("%s" % (i+1,))
            but.connect('toggled', self.slotButtonSizeY, i)
@@ -154,10 +315,18 @@ class WinConfig(StackableWindow): #, FremantleRotation):
        but=hildon.CheckButton(
                gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
        but.set_label("No background")
-       #but.connect('toggled', self.slotButtonNoBackground)
+       but.connect('toggled', self.slotButtonNoBackground)
        self.buttonNoBackground=but
        vbox.add(but)
 
+       but=hildon.Button(
+               gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
+               hildon.BUTTON_ARRANGEMENT_VERTICAL)
+       but.set_label("Adjust icon size")
+       but.connect('clicked', self.slotButtonIconSize)
+       self.buttonIconSize=but
+       vbox.add(but)
+
 #1     hbox.add(al)
        but=hildon.Button(
                gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
@@ -189,6 +358,9 @@ class WinConfig(StackableWindow): #, FremantleRotation):
        self.setAnimate(self.config.getAnimate())
        self.setNoBg(self.config.getNoBg())
        self.setThemeBg(self.config.getThemeBg())
+#      self.setIconSize(self.config.getIconSize())
+#      self.setIconPadding(self.config.getIconPadding())
+#      self.setIconMargin(self.config.getIconMargin())
 
        hbox=gtk.HBox()
        hbox.add(self.col1)
@@ -198,6 +370,8 @@ class WinConfig(StackableWindow): #, FremantleRotation):
 
        self.add(self.pa)
 
+       self.adjustMaxSize()
+
 #    def setupUi(self, orientation):
 #
 #      self.setupUi0()
@@ -222,6 +396,33 @@ class WinConfig(StackableWindow): #, FremantleRotation):
 #      self.add(self.pa)
 #      self.pa.show_all()
 
+    def adjustMaxSize(self):
+       sz=self.config.getMaxSize()
+       maxsz=self.maxmaxsz
+
+       for x in xrange(maxsz[0]):
+           if x<sz[0]:
+               self.butsSizeX[x].show()
+           else:
+               self.butsSizeX[x].hide()
+
+       for y in xrange(maxsz[1]):
+           if y<sz[1]:
+               self.butsSizeY[y].show()
+           else:
+               self.butsSizeY[y].hide()
+
+       osz=self.getSize()
+       nsz=[osz[0], osz[1]]
+
+       if osz[0]>sz[0]:
+           nsz[0]=sz[0]
+       if osz[1]>sz[1]:
+           nsz[1]=sz[1]
+       self.setSize(nsz)
+
+       self.setIndiv(self.getIndiv())
+
     def setLayoutPortrait(self):
        print "lo: p"
        hbox=gtk.HBox()
@@ -286,9 +487,43 @@ class WinConfig(StackableWindow): #, FremantleRotation):
        but=self.buttonRotateIndividually
        self.setIndiv(but.get_active())
 
+    def slotButtonNoBackground(self, sender):
+       nobg=self.getNoBg()
+       self.setNoBg(nobg)
+
     def slotButtonAbout(self, sender):
        DlgAbout.present2(self)
 
+    def slotButtonIconSize(self, sender):
+       dlg=DialogIconSize(self.config)
+       ret=dlg.run()
+       dt=dlg.getData()
+       dlg.destroy()
+
+       if ret!=gtk.RESPONSE_OK:
+           return
+
+       self.config.setIconSize(dt['size'])
+       self.config.setIconMargin(dt['margin'])
+       self.config.setIconPadding(dt['padding'])
+       self.igw.reconfig()
+       self.adjustMaxSize()
+       self.queue_draw()
+
+    def show_all(self):
+       StackableWindow.show_all(self)
+       self.adjustMaxSize()
+       self.queue_draw()
+
+    def slotScaleIconSzChange(self, sender):
+       return
+       self.config.setIconSize(self.getIconSize())
+       self.config.setIconMargin(self.getIconMargin())
+       self.config.setIconPadding(self.getIconPadding())
+       self.igw.reconfig()
+       self.adjustMaxSize()
+       self.queue_draw()
+
 #    def slotButtonLongpress(self, sender):
 #      but=self.buttonRequireLongpress
 #      self.set
@@ -318,6 +553,7 @@ class WinConfig(StackableWindow): #, FremantleRotation):
        self.igw.setSize(sz)
 
        self.igw.queue_draw()
+       self.queue_draw()
 
     def getSize(self):
        return(self.igw.getSize())
@@ -335,19 +571,24 @@ class WinConfig(StackableWindow): #, FremantleRotation):
                i.set_sensitive(True)
 
        else:
+           sz=self.config.getMaxSize()
+
            for i in self.butsSizeY:
                i.set_sensitive(False)
 
            cnt=0
            for i in self.butsSizeX:
                cnt+=1
-               if cnt>4:
+               # Height is always the narrower, so use that as a limit
+               if cnt>sz[1]:
                    i.set_sensitive(False)
+               else:
+                   i.set_sensitive(True)
 
            sz=self.getSize()
            szx=sz[0]
-           if szx>4:
-               szx=4
+           if szx>sz[1]:
+               szx=sz[1]
            self.setSize((szx, szx))
 
        self.buttonRotateIndividually.set_active(indiv)
@@ -358,9 +599,16 @@ class WinConfig(StackableWindow): #, FremantleRotation):
     def setAnimate(self, ar):
        self.buttonAnimateRotation.set_active(ar)
 
+    def getNoBg(self):
+       ret=self.buttonNoBackground.get_active()
+
+       return(ret)
+
     def setNoBg(self, nobg):
        self.buttonNoBackground.set_active(nobg)
 
+       self.buttonThemeBackground.set_sensitive(not nobg)
+
     def setThemeBg(self, themebg):
        self.buttonThemeBackground.set_active(themebg)
 
@@ -463,6 +711,9 @@ class WinConfig(StackableWindow): #, FremantleRotation):
            'animate':      ar,
            'nobg':         nobg,
            'themebg':      themebg,
+           'iconsize':     self.config.getIconSize(),
+           'iconpadding':  self.config.getIconPadding(),
+           'iconmargin':   self.config.getIconMargin(),
            }
 
        return(ret)