diff options
author | Sin Nombre <sin@ubuntu.(none)> | 2010-05-28 20:45:29 (GMT) |
---|---|---|
committer | Sin Nombre <sin@ubuntu.(none)> | 2010-05-28 20:45:29 (GMT) |
commit | 9e93d1b9802385900b6f833f81f84c0ac50f91ef (patch) | |
tree | f2c16599bde31b31e5d44bae4a87e7e4093f3cab /pgu/gui/select.py | |
parent | ac8cbb6691ba3de1c7c42f4362edbe11270f4506 (diff) |
Diffstat (limited to 'pgu/gui/select.py')
-rw-r--r-- | pgu/gui/select.py | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/pgu/gui/select.py b/pgu/gui/select.py new file mode 100644 index 0000000..90fcfe4 --- /dev/null +++ b/pgu/gui/select.py @@ -0,0 +1,191 @@ +""" +""" +from const import * +import table +import basic, button + +class Select(table.Table): + """A select input. + + <pre>Select(value=None)</pre> + + <dl> + <dt>value<dd>initial value + </dl> + + <strong>Example</strong> + <code> + w = Select(value="goats") + w.add("Cats","cats") + w.add("Goats","goats") + w.add("Dogs","Dogs") + + w.value = 'dogs' #changes the value from goats to dogs + </code> + + """ + + def __init__(self,value=None,**params): + params.setdefault('cls','select') + table.Table.__init__(self,**params) + + self.top_selected = button.Button(cls=self.cls+".selected") + table.Table.add(self,self.top_selected) #,hexpand=1,vexpand=1)#,0,0) + self.top_selected.value = basic.Label(" ",cls=self.cls+".option.label") + + self.top_arrow = button.Button(basic.Image(self.style.arrow),cls=self.cls+".arrow") + table.Table.add(self,self.top_arrow) #,hexpand=1,vexpand=1) #,1,0) + + self.options = table.Table() #style={'border':3}) + self.options_first = None + + self.options.tr() + self.spacer_top = basic.Spacer(0,0) + self.options.add(self.spacer_top) + + self.options.tr() + self._options = table.Table(cls=self.cls+".options") + self.options.add(self._options) + + self.options.tr() + self.spacer_bottom = basic.Spacer(0,0) + self.options.add(self.spacer_bottom) + + + self.options.connect(BLUR,self._close,None) + self.spacer_top.connect(CLICK,self._close,None) + self.spacer_bottom.connect(CLICK,self._close,None) + + self.values = [] + self.value = value + + def resize(self,width=None,height=None): + max_w,max_h = 0,0 + for w in self._options.widgets: + w.rect.w,w.rect.h = w.resize() + max_w,max_h = max(max_w,w.rect.w),max(max_h,w.rect.h) + + #xt,xr,xb,xl = self.top_selected.getspacing() + self.top_selected.style.width = max_w #+ xl + xr + self.top_selected.style.height = max_h #+ xt + xb + + self.top_arrow.connect(CLICK,self._open,None) + self.top_selected.connect(CLICK,self._open,None) + + w,h = table.Table.resize(self,width,height) + + self.spacer_top.style.width, self.spacer_top.style.height = w,h + self.spacer_bottom.style.width, self.spacer_bottom.style.height = w,h + self._options.style.width = w + #HACK: sort of, but not a big one.. + self._options.resize() + + return w,h + + def _open(self,value): + sh = self.rect.h #spacer height + opts = self.options + + self.spacer_top.style.height = 0 + self.spacer_bottom.style.height = 0 + opts.rect.w, opts.rect.h = opts.resize() + h = opts.rect.h + + y = self.rect.y + c = self.container + while hasattr(c,'container'): + y += c.rect.y + if c.container == None: break + c = c.container + + if y + sh + h <= c.rect.h: #down + self.spacer_top.style.height = sh + dy = self.rect.y + else: #up + self.spacer_bottom.style.height = sh + dy = self.rect.y - h + + opts.rect.w, opts.rect.h = opts.resize() + + self.container.open(opts,self.rect.x,dy) + self.options_first.focus() + + def _close(self,value): +# print 'my close!' + self.options.close() + self.top_selected.focus() +# self.blur() +# self.focus() +# print self.container.myfocus == self + + def _setvalue(self,value): + self.value = value._value + if hasattr(self,'container'): + #self.chsize() + #HACK: improper use of resize() + #self.resize() #to recenter the new value, etc. + pass + # #self._resize() + + self._close(None) + #self.repaint() #this will happen anyways + + + + def __setattr__(self,k,v): + mywidget = None + if k == 'value': + for w in self.values: + if w._value == v: + mywidget = w + _v = self.__dict__.get(k,NOATTR) + self.__dict__[k]=v + if k == 'value' and _v != NOATTR and _v != v: + self.send(CHANGE) + self.repaint() + if k == 'value': + if not mywidget: + mywidget = basic.Label(" ",cls=self.cls+".option.label") + self.top_selected.value = mywidget + + def add(self,w,value=None): + """Add a widget, value item to the Select. + + <pre>Select.add(widget,value=None)</pre> + + <dl> + <dt>widget<dd>Widget or string to represent the item + <dt>value<dd>value for this item + </dl> + + <strong>Example</strong> + <code> + w = Select() + w.add("Goat") #adds a Label + w.add("Goat","goat") #adds a Label with the value goat + w.add(gui.Label("Cuzco"),"goat") #adds a Label with value goat + </code> + """ + + if type(w) == str: w = basic.Label(w,cls=self.cls+".option.label") + + w.style.align = -1 + b = button.Button(w,cls=self.cls+".option") + b.connect(CLICK,self._setvalue,w) + #b = w + #w.cls = self.cls+".option" + #w.cls = self.cls+".option" + + self._options.tr() + self._options.add(b) #,align=-1) + + if self.options_first == None: + self.options_first = b + #self._options.td(b, align=-1, cls=self.cls+".option") + #self._options.td(_List_Item(w,value=value),align=-1) + + if value != None: w._value = value + else: w._value = w + if self.value == w._value: + self.top_selected.value = w + self.values.append(w) |