File: menus.py

package info (click to toggle)
python-box2d 2.3.2~dfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 3,596 kB
  • ctags: 5,116
  • sloc: python: 14,384; cpp: 13,393; makefile: 9
file content (115 lines) | stat: -rw-r--r-- 3,332 bytes parent folder | download | duplicates (2)
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
"""
"""
from .const import *
from . import table
from . 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._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 _valuefunc(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._valuefunc,{'fnc':fnc,'value':value})
        
        self.options.tr()
        self.options.add(b)
        
        return b

class Menus(table.Table):
    """A drop down menu bar.

    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
            print ("add", parts[1], cmd, value)
            m.add(basic.Label(parts[1],cls=m.cls+".option.label"),cmd,value)