📄 menubar.py
字号:
# menubar.py: wxMenuBar objects# $Id: menubar.py,v 1.28 2007/08/07 12:18:34 agriggio Exp $## Copyright (c) 2002-2007 Alberto Griggio <agriggio@users.sourceforge.net># License: MIT (see license.txt)# THIS PROGRAM COMES WITH NO WARRANTYimport wximport common, math, miscfrom tree import Treefrom MenuTree import *from widget_properties import *from edit_windows import EditBase, TopLevelBase, PreviewMixinclass MenuItemDialog(wx.Dialog): def __init__(self, parent, owner, items=None): wx.Dialog.__init__(self, parent, -1, _("Menu editor"), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) ADD_ID, REMOVE_ID, NAME_ID, LABEL_ID, ID_ID, CHECK_RADIO_ID, LIST_ID, \ ADD_SEP_ID, MOVE_LEFT_ID, MOVE_RIGHT_ID, MOVE_UP_ID, \ MOVE_DOWN_ID, HELP_STR_ID = [wx.NewId() for i in range(13)] self._staticbox = wx.StaticBox(self, -1, _("Menu item:")) self.owner = owner self.menu_items = wx.ListCtrl(self, LIST_ID, style=wx.LC_REPORT | \ wx.LC_SINGLE_SEL|wx.SUNKEN_BORDER) # ALB 2004-09-26: workaround to make the scroll wheel work... wx.EVT_MOUSEWHEEL(self.menu_items, lambda e: e.Skip()) self.menu_items.InsertColumn(0, _("Label")) self.menu_items.InsertColumn(1, _("Id")) self.menu_items.InsertColumn(2, _("Name")) self.menu_items.InsertColumn(3, _("Help String")) self.menu_items.InsertColumn(4, _("Type")) # ALB 2004-12-05 self.menu_items.InsertColumn(5, _("Event Handler")) self.menu_items.SetColumnWidth(0, 250) self.menu_items.SetColumnWidth(2, 250) self.menu_items.SetColumnWidth(3, 250) self.menu_items.SetColumnWidth(5, 250) # menu item fields self.id = wx.TextCtrl(self, ID_ID) self.label = wx.TextCtrl(self, LABEL_ID) self.name = wx.TextCtrl(self, NAME_ID) self.help_str = wx.TextCtrl(self, HELP_STR_ID) # ALB 2004-12-05 self.event_handler = wx.TextCtrl(self, -1) import re self.handler_re = re.compile(r'^\s*\w*\s*$') #self.checkable = wx.CheckBox(self, CHECK_ID, "") #Checkable") self.check_radio = wx.RadioBox( self, CHECK_RADIO_ID, _("Type"), choices=['Normal', 'Checkable', 'Radio'], majorDimension=3) self.add = wx.Button(self, ADD_ID, _("Add")) self.remove = wx.Button(self, REMOVE_ID, _("Remove")) self.add_sep = wx.Button(self, ADD_SEP_ID, _("Add separator")) # menu items navigation self.move_up = wx.Button(self, MOVE_UP_ID, _("Up")) self.move_down = wx.Button(self, MOVE_DOWN_ID, _("Down")) self.move_left = wx.Button(self, MOVE_LEFT_ID, " < ") self.move_right = wx.Button(self, MOVE_RIGHT_ID, " > ") self.ok = wx.Button(self, wx.ID_OK, _("OK")) self.apply = wx.Button(self, wx.ID_APPLY, _("Apply")) self.cancel = wx.Button(self, wx.ID_CANCEL, _("Cancel")) self.do_layout() self.selected_index = -1 # index of the selected element in the # wx.ListCtrl menu_items # event handlers wx.EVT_BUTTON(self, ADD_ID, self.add_menu_item) wx.EVT_BUTTON(self, REMOVE_ID, self.remove_menu_item) wx.EVT_BUTTON(self, ADD_SEP_ID, self.add_separator) wx.EVT_BUTTON(self, MOVE_LEFT_ID, self.move_item_left) wx.EVT_BUTTON(self, MOVE_RIGHT_ID, self.move_item_right) wx.EVT_BUTTON(self, MOVE_UP_ID, self.move_item_up) wx.EVT_BUTTON(self, MOVE_DOWN_ID, self.move_item_down) wx.EVT_BUTTON(self, wx.ID_APPLY, self.on_apply) wx.EVT_KILL_FOCUS(self.name, self.update_menu_item) wx.EVT_KILL_FOCUS(self.label, self.update_menu_item) wx.EVT_KILL_FOCUS(self.id, self.update_menu_item) wx.EVT_KILL_FOCUS(self.help_str, self.update_menu_item) # ALB 2004-12-05 wx.EVT_KILL_FOCUS(self.event_handler, self.update_menu_item) #wx.EVT_CHECKBOX(self, CHECK_ID, self.update_menu_item) wx.EVT_RADIOBOX(self, CHECK_RADIO_ID, self.update_menu_item) wx.EVT_LIST_ITEM_SELECTED(self, LIST_ID, self.show_menu_item) if items: self.add_items(items) def do_layout(self): self.label.Enable(False) self.id.Enable(False) self.name.Enable(False) self.help_str.Enable(False) self.event_handler.Enable(False) self.check_radio.Enable(False) sizer = wx.BoxSizer(wx.VERTICAL) sizer2 = wx.StaticBoxSizer(self._staticbox, wx.VERTICAL) self.label.SetSize((150, -1)) self.id.SetSize((150, -1)) self.name.SetSize((150, -1)) self.help_str.SetSize((150, -1)) self.event_handler.SetSize((150, -1)) szr = wx.FlexGridSizer(0, 2) if misc.check_wx_version(2, 5, 2): flag = wx.FIXED_MINSIZE else: flag = 0 label_flag = wx.ALIGN_CENTER_VERTICAL szr.Add(wx.StaticText(self, -1, _("Id ")), flag=label_flag) szr.Add(self.id, flag=flag) szr.Add(wx.StaticText(self, -1, _("Label ")), flag=label_flag) szr.Add(self.label, flag=flag) szr.Add(wx.StaticText(self, -1, _("Name ")), flag=label_flag) szr.Add(self.name, flag=flag) szr.Add(wx.StaticText(self, -1, _("Help String ")), flag=label_flag) szr.Add(self.help_str, flag=flag) szr.Add(wx.StaticText(self, -1, _("Event Handler ")), flag=label_flag) szr.Add(self.event_handler, flag=flag) sizer2.Add(szr, 1, wx.ALL|wx.EXPAND, 5) sizer2.Add(self.check_radio, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM, 4) szr = wx.GridSizer(0, 2, 3, 3) szr.Add(self.add, 0, wx.EXPAND); szr.Add(self.remove, 0, wx.EXPAND) sizer2.Add(szr, 0, wx.EXPAND) sizer2.Add(self.add_sep, 0, wx.TOP|wx.EXPAND, 3) sizer3 = wx.BoxSizer(wx.VERTICAL) sizer3.Add(self.menu_items, 1, wx.ALL|wx.EXPAND, 5) sizer4 = wx.BoxSizer(wx.HORIZONTAL) sizer4.Add(self.move_up, 0, wx.LEFT|wx.RIGHT, 3) sizer4.Add(self.move_down, 0, wx.LEFT|wx.RIGHT, 5) sizer4.Add(self.move_left, 0, wx.LEFT|wx.RIGHT, 5) sizer4.Add(self.move_right, 0, wx.LEFT|wx.RIGHT, 5) sizer3.Add(sizer4, 0, wx.ALIGN_CENTER|wx.ALL, 5) szr = wx.BoxSizer(wx.HORIZONTAL) szr.Add(sizer3, 1, wx.ALL|wx.EXPAND, 5) szr.Add(sizer2, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5) sizer.Add(szr, 1, wx.EXPAND) sizer2 = wx.BoxSizer(wx.HORIZONTAL) sizer2.Add(self.ok, 0, wx.ALL, 5) sizer2.Add(self.apply, 0, wx.ALL, 5) sizer2.Add(self.cancel, 0, wx.ALL, 5) sizer.Add(sizer2, 0, wx.ALL|wx.ALIGN_CENTER, 3) self.SetAutoLayout(1) self.SetSizer(sizer) sizer.Fit(self) self.SetSize((-1, 350)) self.CenterOnScreen() def _enable_fields(self, enable=True): for s in (self.label, self.id, self.name, self.help_str, self.check_radio, self.event_handler): s.Enable(enable) def add_menu_item(self, event): """\ Event handler called when the Add button is clicked """ index = self.selected_index = self.selected_index+1 if not self.menu_items.GetItemCount(): self._enable_fields()## for s in (self.label, self.id, self.name, self.help_str,## self.check_radio, self.event_handler):## s.Enable(True) if index < 0: index = self.menu_items.GetItemCount() elif index > 0: indent = " " * self.item_level(index-1) else: indent = "" name, label, id, check_radio = "", "item", "", "0" self.menu_items.InsertStringItem(index, indent + label) self.menu_items.SetStringItem(index, 1, id) self.menu_items.SetStringItem(index, 2, name) self.menu_items.SetStringItem(index, 4, check_radio) # fix bug 698074 self.menu_items.SetItemState(index, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) self.name.SetValue(name) self.label.SetValue(label) self.id.SetValue(id) self.check_radio.SetSelection(int(check_radio)) self.event_handler.SetValue("") def add_separator(self, event): """\ Event handler called when the Add Separator button is clicked """ index = self.selected_index+1 if not self.menu_items.GetItemCount(): self._enable_fields()## for s in (self.label, self.id, self.name, self.help_str,## self.check_radio, self.event_handler):## s.Enable(True) if index < 0: index = self.menu_items.GetItemCount() elif index > 0: label = " " * self.item_level(index-1) + '---' else: label = '---' self.menu_items.InsertStringItem(index, label) self.menu_items.SetStringItem(index, 1, '---') self.menu_items.SetStringItem(index, 2, '---') # fix bug 698074 self.menu_items.SetItemState(index, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) def show_menu_item(self, event): """\ Event handler called when a menu item in the list is selected """ self.selected_index = index = event.GetIndex() if not misc.streq(self.menu_items.GetItem(index, 2).m_text, '---'): # skip if the selected item is a separator for (s, i) in ((self.label, 0), (self.id, 1), (self.name, 2), (self.help_str, 3), (self.event_handler, 5)): s.SetValue(self.menu_items.GetItem(index, i).m_text) self.label.SetValue(self.label.GetValue().lstrip()) try: self.check_radio.SetSelection( int(self.menu_items.GetItem(index, 4).m_text)) except: self.check_radio.SetSelection(0) event.Skip() def update_menu_item(self, event): """\ Event handler called when some of the properties of the current menu item changes """ set_item = self.menu_items.SetStringItem index = self.selected_index val = self.event_handler.GetValue() if not self.handler_re.match(val): event.GetEventObject().SetFocus() return if index < 0: return event.Skip() set_item(index, 0, " " * self.item_level(index) + \ self.label.GetValue().lstrip()) set_item(index, 1, self.id.GetValue()) set_item(index, 2, self.name.GetValue()) set_item(index, 3, self.help_str.GetValue()) set_item(index, 4, str(self.check_radio.GetSelection())) set_item(index, 5, self.event_handler.GetValue()) event.Skip() def item_level(self, index, label=None): """\ returns the indentation level of the menu item at the given index """ label = self.menu_items.GetItem(index, 0).m_text return (len(label) - len(label.lstrip())) / 4 def remove_menu_item(self, event): """\ Event handler called when the Remove button is clicked """ if self.selected_index >= 0: index = self.selected_index+1 if index < self.menu_items.GetItemCount() and \ (self.item_level(self.selected_index) < self.item_level(index)): self._move_item_left(index) self.selected_index = index-1 for s in (self.name, self.id, self.label, self.help_str, self.event_handler): s.SetValue("") self.check_radio.SetSelection(0) self.menu_items.DeleteItem(self.selected_index) if not self.menu_items.GetItemCount(): self._enable_fields(False)## for s in (self.name, self.id, self.label, \## self.help_str, self.check_radio, self.event_handler):## s.Enable(False) def add_items(self, menus): """\ adds the content of 'menus' to self.menu_items. menus is a sequence of
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -