Package vqt :: Module menubuilder
[hide private]
[frames] | no frames]

Source Code for Module vqt.menubuilder

 1  
 
 2  from PyQt4 import QtCore, QtGui 
 3  
 
4 -class FieldAdder:
5
6 - def __init__(self, splitchar='.'):
7 self.kids = {} 8 self.splitchar = splitchar 9 self._dyn_callback = None
10
11 - def _addMenuFields(self, plist):
12 parent = self 13 kid = self 14 for p in plist: 15 kid = parent.kids.get(p) 16 if kid == None: 17 kid = VQMenu(p, parent=parent, splitchar=self.splitchar) 18 action = parent.addMenu(kid) 19 parent.kids[p] = kid 20 parent = kid 21 22 return kid
23
24 - def _addDynActions(self):
25 self.clear() 26 for name in self._dyn_callback(): 27 act = QtGui.QAction(name, self) 28 cb = ActionCall(self._dyn_callback, name) 29 act.connect(act, QtCore.SIGNAL('triggered()'), cb) 30 self.addAction(act)
31
32 - def addDynMenu(self, pathstr, callback):
33 ''' 34 Add a dynamic menu item which will populate on-hover by asking 35 the specified callback for a list of actions. 36 37 Example: 38 def callback(name=None): 39 40 if name == None: 41 return ('one', 'two', 'three') 42 43 print('SELECTED: %s' % name) 44 45 m.addDynMenu( callback ) 46 ''' 47 plist = pathstr.split(self.splitchar) 48 menu = self._addMenuFields( plist ) 49 menu._dyn_callback = callback 50 menu.connect(menu, QtCore.SIGNAL('aboutToShow()'), menu._addDynActions)
51
52 - def addField(self, pathstr, callback=None, args=(), tip=None):
53 plist = pathstr.split(self.splitchar) 54 kid = self._addMenuFields(plist[:-1]) 55 56 acall = ActionCall( callback, *args ) 57 action = QtGui.QAction(plist[-1], kid) 58 action.connect(action, QtCore.SIGNAL('triggered()'), acall) 59 60 if tip: action.setStatusTip(tip) 61 62 kid.addAction(action) 63 64 return kid
65
66 -class VQMenuBar(FieldAdder, QtGui.QMenuBar):
67 - def __init__(self, parent=None, splitchar='.'):
68 QtGui.QMenuBar.__init__(self, parent=parent) 69 FieldAdder.__init__(self, splitchar=splitchar)
70
71 -class VQMenu(FieldAdder, QtGui.QMenu):
72
73 - def __init__(self, name, parent=None, splitchar='.'):
74 QtGui.QMenu.__init__(self, name, parent=parent) 75 FieldAdder.__init__(self, splitchar=splitchar)
76
77 -class ActionCall:
78
79 - def __init__(self, callback, *args, **kwargs):
80 self.args = args 81 self.kwargs = kwargs 82 self.callback = callback
83
84 - def __call__(self):
85 return self.callback(*self.args, **self.kwargs)
86