8 from ...util.callback import callback, in_callback
9 from . import panel as panel
13 """A `Bind`able version of :class:`wx.Menu`.
15 From the `wxPython Style Guide`_, you can't do
16 wx.Menu().Bind(...), so we hack around it by bubbling the Bind up
17 to the closest parent :class:`wx.Frame`.
19 .. _wxPython Style Guide:
20 http://wiki.wxpython.org/wxPython%20Style%20Guide#line-101
22 def __init__(self, parent=None, **kwargs):
24 super(Menu, self).__init__(**kwargs)
26 def Bind(self, **kwargs):
27 assert 'id' in kwargs, kwargs
29 while not isinstance(obj, wx.Frame):
34 class MenuBar (wx.MenuBar):
35 """A `Bind`able version of :class:`wx.MenuBar`.
37 See :class:`Menu` for the motivation.
39 def __init__(self, parent=None, **kwargs):
41 super(MenuBar, self).__init__(**kwargs)
43 def Append(self, menu, title):
45 super(MenuBar, self).Append(menu, title)
48 class FileMenu (Menu):
49 def __init__(self, callbacks=None, **kwargs):
50 super(FileMenu, self).__init__(**kwargs)
53 self._callbacks = callbacks
54 self._c = {'exit': self.Append(wx.ID_EXIT)}
55 self.Bind(event=wx.EVT_MENU, handler=self.close, id=wx.ID_EXIT)
58 def close(self, event):
62 class ViewMenu (Menu):
63 def __init__(self, callbacks=None, **kwargs):
64 super(ViewMenu, self).__init__(**kwargs)
67 self._callbacks = callbacks
69 for i,panelname in enumerate(sorted(panel.PANELS.keys())):
70 text = '%s\tF%d' % (panelname.capitalize(), i+5)
71 self._c[panelname] = self.AppendCheckItem(id=wx.ID_ANY, text=text)
72 for item in self._c.values():
74 self.Bind(event=wx.EVT_MENU, handler=self.view_panel, id=item.GetId())
76 def view_panel(self, event):
78 item = self.FindItemById(_id)
79 label = item.GetLabel()
80 selected = item.IsChecked()
81 in_callback(self, panel_name=label, visible=selected)
84 class PerspectiveMenu (Menu):
85 def __init__(self, callbacks=None, **kwargs):
86 super(PerspectiveMenu, self).__init__(**kwargs)
89 self._callbacks = callbacks
92 def update(self, perspectives, selected, callback):
93 """Rebuild the perspectives menu.
95 for item in self.GetMenuItems():
96 self.UnBind(item.GetId)
99 'save': self.Append(id=wx.ID_ANY, text='Save Perspective'),
100 'delete': self.Append(id=wx.ID_ANY, text='Delete Perspective'),
102 self.AppendSeparator()
103 for label in perspectives:
104 self._c[label] = self.AppendRadioItem(id=wx.ID_ANY, text=label)
105 self.Bind(event=wx.EVT_MENU, handler=callback,
106 id=self._c[label].GetId())
107 if label == selected:
108 self._c[label].Check(True)
111 class HelpMenu (Menu):
112 def __init__(self, callbacks=None, **kwargs):
113 super(HelpMenu, self).__init__(**kwargs)
114 if callbacks == None:
116 self._callbacks = callbacks
117 self._c = {'about': self.Append(id=wx.ID_ABOUT)}
118 self.Bind(event=wx.EVT_MENU, handler=self.about, id=wx.ID_ABOUT)
121 def about(self, event):
125 class HookeMenuBar (MenuBar):
126 def __init__(self, callbacks=None, **kwargs):
127 super(HookeMenuBar, self).__init__(**kwargs)
128 if callbacks == None:
130 self._callbacks = callbacks
133 # Attach *Menu() instances
134 for key in ['file', 'view', 'perspective', 'help']:
135 cap_key = key.capitalize()
136 _class = globals()['%sMenu' % cap_key]
137 self._c[key] = _class(parent=self, callbacks=callbacks)
138 self.Append(self._c[key], cap_key)