📄 menubar.py
字号:
trees which describes the structure of the menus """ indent = " " * 4 set_item = self.menu_items.SetStringItem add_item = self.menu_items.InsertStringItem index = [0] def add(node, level): i = index[0] add_item(i, misc.wxstr(indent * level + node.label.lstrip())) set_item(i, 1, misc.wxstr(node.id)) set_item(i, 2, misc.wxstr(node.name)) set_item(i, 3, misc.wxstr(node.help_str)) # ALB 2004-12-05 set_item(i, 5, misc.wxstr(node.handler)) item_type = 0 try: if node.checkable and int(node.checkable): item_type = 1 elif int(node.radio): item_type = 2 except ValueError: pass set_item(i, 4, misc.wxstr(item_type)) index[0] += 1 for item in node.children: add(item, level+1) for tree in menus: add(tree.root, 0) if self.menu_items.GetItemCount(): self._enable_fields()## for s in (self.name, self.id, self.label, \## self.help_str, self.check_radio, self.event_handler):## s.Enable(True) def get_menus(self): """\ returns the contents of self.menu_items as a list of trees which describe the structure of the menus in the format used by EditMenuBar """ def get(i, j): return self.menu_items.GetItem(i, j).m_text trees = [] def add(node, index): label = get(index, 0).lstrip() id = get(index, 1) name = get(index, 2) help_str = get(index, 3) event_handler = get(index, 5) try: item_type = int(get(index, 4)) except ValueError: item_type = 0 checkable = item_type == 1 and misc.wxstr("1") or misc.wxstr("") radio = item_type == 2 and misc.wxstr("1") or misc.wxstr("") n = MenuTree.Node(label, id, name, help_str, checkable, radio, handler=event_handler) node.children.append(n) n.parent = node return n level = 0 curr_item = None for index in range(self.menu_items.GetItemCount()): label = get(index, 0) lvl = self.item_level(index) # get the indentation level if not lvl: t = MenuTree(get(index, 2), label, id=get(index, 1), handler=get(index, 5)) curr_item = t.root level = 1 trees.append(t) continue elif lvl < level: for i in range(level-lvl): curr_item = curr_item.parent level = lvl elif lvl > level: curr_item = curr_item.children[-1] level = lvl add(curr_item, index) return trees def _move_item_left(self, index): if index > 0: if (index+1 < self.menu_items.GetItemCount() and \ (self.item_level(index) < self.item_level(index+1))): return label = self.menu_items.GetItem(index, 0).m_text if misc.streq(label[:4], " " * 4): self.menu_items.SetStringItem(index, 0, label[4:]) self.menu_items.SetItemState(index, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) def move_item_left(self, event): """\ moves the selected menu item one level up in the hierarchy, i.e. shifts its label 4 spaces left in self.menu_items """ self.menu_items.SetFocus() self._move_item_left(self.selected_index) def _move_item_right(self, index): if index > 0 and (self.item_level(index) <= self.item_level(index-1)): label = self.menu_items.GetItem(index, 0).m_text self.menu_items.SetStringItem(index, 0, misc.wxstr(" " * 4) + label) self.menu_items.SetItemState(index, wx.LIST_STATE_SELECTED, \ wx.LIST_STATE_SELECTED) def move_item_right(self, event): """\ moves the selected menu item one level down in the hierarchy, i.e. shifts its label 4 spaces right in self.menu_items """ self.menu_items.SetFocus() self._move_item_right(self.selected_index) def move_item_up(self, event): """\ moves the selected menu item before the previous one at the same level in self.menu_items """ self.menu_items.SetFocus() index = self._do_move_item(event, self.selected_index, False) if index is not None: state = wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED self.menu_items.SetItemState(index, state, state) def _do_move_item(self, event, index, is_down): """\ internal function used by move_item_up and move_item_down. Returns the new index of the moved item, or None if no change occurred """ #index = self.selected_index if index <= 0: return None def get(i, j): return self.menu_items.GetItem(i, j).m_text def getall(i): return [get(i, j) for j in range(6)] level = self.item_level(index) items_to_move = [ getall(index) ] i = index+1 while i < self.menu_items.GetItemCount(): # collect the items to move up if level < self.item_level(i): items_to_move.append(getall(i)) i += 1 else: break i = index-1 while i >= 0: lvl = self.item_level(i) if level == lvl: break elif level > lvl: return None i -= 1 delete = self.menu_items.DeleteItem insert = self.menu_items.InsertStringItem set = self.menu_items.SetStringItem for j in range(len(items_to_move)-1, -1, -1): delete(index+j) items_to_move.reverse() for label, id, name, help_str, check_radio, event_handler in \ items_to_move: i = insert(i, label) set(i, 1, id) set(i, 2, name) set(i, 3, help_str) set(i, 4, check_radio) set(i, 5, event_handler) ret_idx = i if is_down: ret_idx += len(items_to_move) return ret_idx def move_item_down(self, event): """\ moves the selected menu item after the next one at the same level in self.menu_items """ self.menu_items.SetFocus() index = self.selected_index self.selected_index = -1 if index < 0: return def get(i, j): return self.menu_items.GetItem(i, j).m_text def getall(i): return [get(i, j) for j in range(6)] level = self.item_level(index) i = index+1 while i < self.menu_items.GetItemCount(): # collect the items to move down if level < self.item_level(i): i += 1 else: break if i < self.menu_items.GetItemCount(): # _do_move_item works with selected_index, so we must assing to # it the rigth value before the call #self.selected_index = i self.selected_index = self._do_move_item(event, i, True) # fix bug 698071 state = wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED self.menu_items.SetItemState(self.selected_index, state, state) else: # restore the selected index self.selected_index = index def on_apply(self, event): self.owner.set_menus(self.get_menus()) common.app_tree.app.saved = False #end of class MenuItemDialogclass MenuProperty(Property): """\ Property to edit the menus of an EditMenuBar instance. """ def __init__(self, owner, name, parent): Property.__init__(self, owner, name, parent) self.panel = None self.menu_items = {} if parent is not None: self.display(parent) def display(self, parent): self.panel = wx.Panel(parent, -1) edit_btn_id = wx.NewId() self.edit_btn = wx.Button(self.panel, edit_btn_id, _("Edit menus...")) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(self.edit_btn, 1, wx.EXPAND|wx.ALIGN_CENTER|wx.TOP|wx.BOTTOM, 4) self.panel.SetAutoLayout(1) self.panel.SetSizer(sizer) self.panel.SetSize(sizer.GetMinSize()) wx.EVT_BUTTON(self.panel, edit_btn_id, self.edit_menus) def bind_event(*args): pass def edit_menus(self, event): dialog = MenuItemDialog(self.panel, self.owner, items=self.owner.get_menus()) if dialog.ShowModal() == wx.ID_OK: self.owner.set_menus(dialog.get_menus()) common.app_tree.app.saved = False # update the status of the app def write(self, outfile, tabs): fwrite = outfile.write fwrite(' ' * tabs + '<menus>\n') for menu in self.owner[self.name][0](): menu.write(outfile, tabs+1) fwrite(' ' * tabs + '</menus>\n')# end of class MenuPropertyclass EditMenuBar(EditBase, PreviewMixin): __hidden_frame = None # used on GTK to reparent a menubar before deletion def __init__(self, name, klass, parent, property_window): custom_class = parent is None EditBase.__init__(self, name, klass, parent, wx.NewId(), property_window, custom_class=custom_class, show=False) self.base = 'wxMenuBar' def nil(*args): return () self.menus = [] # list of MenuTree objects self._mb = None # the real menubar self.access_functions['menus'] = (self.get_menus, self.set_menus) prop = self.properties['menus'] = MenuProperty(self, 'menus', None) ## self.node = Tree.Node(self)## common.app_tree.add(self.node, parent.node) PreviewMixin.__init__(self) def create_widget(self): if wx.Platform == '__WXGTK__' and not EditMenuBar.__hidden_frame: EditMenuBar.__hidden_frame = wx.Frame(common.palette, -1, "") EditMenuBar.__hidden_frame.Hide() if self.parent: self.widget = self._mb = wx.MenuBar() if self.parent.widget: self.parent.widget.SetMenuBar(self.widget) if wx.Platform == '__WXMSW__' or wx.Platform == '__WXMAC__': self.widget.SetFocus = lambda : None else: # "top-level" menubar self.widget = wx.Frame(None, -1, misc.design_title(self.name)) self.widget.SetClientSize((400, 30)) self._mb = wx.MenuBar() self.widget.SetMenuBar(self._mb)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -