1 """Manage binding views.
3 The Views module manages the on-screen keymap representations. A View
4 is registered for a specific context. The view will be called with a
5 list of all active bindings whenever the bindings change."""
7 import Events, Node, curses
10 def __init__(self, context, label, x, y, dx, dy):
11 Node.Node.__init__(self)
12 self._context = context
15 self.x, self.y, self.dx, self.dy = x, y, dx, dy
18 self._win = self.owner.win().derwin(self.dy, self.dx, self.y, self.x)
21 def drawFrame(self, subtitle=None):
22 label = ' %s ' % self._label
24 label = '%s- %s ' % (label, subtitle)
26 self._win.addstr(0,2,label)
27 self._win.nooutrefresh()
32 def updateView(self, bindings):
33 raise NotImplementedError
36 class WidgetView(View):
38 _widgets = Node.NodeMap()
40 def __init__(self, context, label, x, y, dx, dy):
41 View.__init__(self, context, label, x, y, dx, dy)
45 for widget in self._widgets.itervalues():
49 if self.win() : raise RuntimeError, 'Cannot change active view'
50 self._widgets[widget.code] = widget
52 def updateView(self, bindings):
54 self.drawFrame(bindings.itervalues().next().keymap().keylist().path())
55 for code, widget in self._widgets.iteritems():
56 event = Events.Event(self._context,code)
57 if bindings.has_key(event):
58 widget.updateView(bindings[event])
60 widget.updateView(None)
63 class EventWidget(Node.Node):
65 def __init__(self, code, label, x, y, size=9):
66 Node.Node.__init__(self)
67 self.x, self.y, self.size = x, y, size
73 self._win = self.owner.win().derwin(2, self.size, self.y, self.x)
74 self._win.hline(0,0,curses.ACS_HLINE,self.size-1)
75 self._win.addstr(0,(self.size-1-min(self.size-3,len(self.label)))/2, self.label[:self.size-3])
76 self._win.nooutrefresh()
78 def updateView(self, binding):
80 self._win.addstr(1,0, binding.label[:self.size-1].center(self.size-1), curses.A_BOLD)
82 self._win.addstr(1, 0, ' '*(self.size-1))
83 self._win.nooutrefresh()
86 class ViewManager(object):
88 _views = Node.NodeMap()
90 def __init__(self, keylist, dispatcher, win):
92 keylist.registerCallback(self.updateViews)
93 dispatcher.registerCallback(self.beforeIdle)
98 def registerView(self, view):
99 self._views[view._context] = view
102 def updateViews(self, keylist):
103 bindings = keylist.bindingsByContext()
104 for context, keys in bindings.iteritems():
105 if self._views.has_key(context):
106 self._views[context].updateView(keys)
108 def beforeIdle(self):