""" """ from const import * import table import basic, button class _Menu_Options(table.Table): def __init__(self,menu,**params): table.Table.__init__(self,**params) self.menu = menu def event(self,e): handled = False arect = self.get_abs_rect() if e.type == MOUSEMOTION: abspos = e.pos[0]+arect.x,e.pos[1]+arect.y for w in self.menu.container.widgets: if not w is self.menu: mrect = w.get_abs_rect() if mrect.collidepoint(abspos): self.menu._close(None) w._open(None) handled = True if not handled: table.Table.event(self,e) class _Menu(button.Button): def __init__(self,parent,widget=None,**params): #TODO widget= could conflict with module widget params.setdefault('cls','menu') button.Button.__init__(self,widget,**params) self.parent = parent self._cls = self.cls self.options = _Menu_Options(self, cls=self.cls+".options") self.connect(CLICK,self._open,None) self.pos = 0 def _open(self,value): self.parent.value = self self.pcls = 'down' self.repaint() self.container.open(self.options,self.rect.x,self.rect.bottom) self.options.connect(BLUR,self._pass,None) self.options.blur(self.options.myfocus) self.options.connect(BLUR,self._close,None) self.options.focus() self.repaint() def _pass(self,value): pass def _close(self,value): self.pcls = '' self.parent.value = None self.repaint() self.options.close() def _value(self,value): self._close(None) if value['fnc'] != None: value['fnc'](value['value']) def event(self,e): button.Button.event(self,e) if self.parent.value == self: self.pcls = 'down' def add(self,w,fnc=None,value=None): w.style.align = -1 b = button.Button(w,cls=self.cls+".option") b.connect(CLICK,self._value,{'fnc':fnc,'value':value}) self.options.tr() self.options.add(b) return b class Menus(table.Table): """A drop down menu bar.
Menus(data)
data
Menu data, a list of (path,fnc,value), see example below
Example data = [ ('File/Save',fnc_save,None), ('File/New',fnc_new,None), ('Edit/Copy',fnc_copy,None), ('Edit/Cut',fnc_cut,None), ('Help/About',fnc_help,help_about_content), ('Help/Reference',fnc_help,help_reference_content), ] w = Menus(data) """ def __init__(self,data,menu_cls='menu',**params): params.setdefault('cls','menus') table.Table.__init__(self,**params) self.value = None n,m,mt = 0,None,None for path,cmd,value in data: parts = path.split("/") if parts[0] != mt: mt = parts[0] m = _Menu(self,basic.Label(mt,cls=menu_cls+".label"),cls=menu_cls) self.add(m,n,0) n += 1 m.add(basic.Label(parts[1],cls=m.cls+".option.label"),cmd,value)