1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
"""
"""
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.
<pre>Menus(data)</pre>
<dl>
<dt>data<dd>Menu data, a list of (path,fnc,value), see example below
</dl>
<strong>Example</strong>
<code>
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)
|