""" """ import traceback from .const import * from .button import Button from .basic import Label, Image from .table import Table class Select(Table): """A combo dropdown box widget. Example: 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 """ # The drop-down arrow button for the selection widget top_arrow = None # A button displaying the currently selected item top_selection = None # The first option added to the selector firstOption = None # The PGU table of options options = None _value = None def __init__(self,value=None,**params): params.setdefault('cls','select') Table.__init__(self,**params) label = Label(" ",cls=self.cls+".option.label") self.top_selected = Button(label, cls=self.cls+".selected") Table.add(self,self.top_selected) #,hexpand=1,vexpand=1)#,0,0) self.top_arrow = Button(Image(self.style.arrow), cls=self.cls+".arrow") Table.add(self,self.top_arrow) #,hexpand=1,vexpand=1) #,1,0) self.options = Table(cls=self.cls+".options") self.options.connect(BLUR,self._close,None) self.options.name = "pulldown-table" 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.resize(self,width,height) self.options.style.width = w #HACK: sort of, but not a big one.. self.options.resize() return w,h def _open(self,value): opts = self.options opts.rect.w, opts.rect.h = opts.resize() # y = self.rect.y # c = self.container # while hasattr(c, 'container'): # y += c.rect.y # if (not c.container): # break # c = c.container # if y + self.rect.h + opts.rect.h <= c.rect.h: #down # dy = self.rect.y + self.rect.h # else: #up # dy = self.rect.y - self.rect.h opts.rect.w, opts.rect.h = opts.resize() # TODO - make sure there is enough space to open down # ... yp = self.rect.bottom-1 self.container.open(opts, self.rect.x, yp) self.firstOption.focus() # TODO - this is a hack for opt in self.options.widgets: opt.repaint() def _close(self,value): self.options.close() self.top_selected.focus() def _setvalue(self,value): self.value = value._value if 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 @property def value(self): return self._value @value.setter def value(self, val): mywidget = None for w in self.values: if w._value == val: mywidget = w oldval = self._value self._value = val if (oldval != val): self.send(CHANGE) self.repaint() if not mywidget: mywidget = Label(" ",cls=self.cls+".option.label") self.top_selected.value = mywidget def add(self,w,value=None): """Add a widget and associated value to the dropdown box.""" if type(w) == str: w = Label(w,cls=self.cls+".option.label") w.style.align = -1 btn = Button(w,cls=self.cls+".option") btn.connect(CLICK,self._setvalue,w) self.options.tr() self.options.add(btn) if (not self.firstOption): self.firstOption = btn if value != None: w._value = value else: w._value = w if self.value == w._value: self.top_selected.value = w self.values.append(w)