# HG changeset patch # User Edouard Tisserant # Date 1554647029 -7200 # Node ID eed31489c9096d6978f50667022515c49db6c1e7 # Parent f88eef34a5239c039cd27a37a1f4f674a4a06552# Parent c08bbfe7bbd48809505cadf6f1d8175bcc4b9d3c Merged diff -r f88eef34a523 -r eed31489c909 BeremizIDE.py --- a/BeremizIDE.py Wed Apr 03 06:31:34 2019 +0000 +++ b/BeremizIDE.py Sun Apr 07 16:23:49 2019 +0200 @@ -276,17 +276,14 @@ (wx.ID_PRINT, "print", _(u'Print'), None)]) def _RecursiveAddMenuItems(self, menu, items): - for name, text, help, children in items: - new_id = wx.NewId() + for name, text, helpstr, children in items: if len(children) > 0: new_menu = wx.Menu(title='') - menu.AppendMenu(new_id, text, new_menu) + menu.AppendMenu(wx.ID_ANY, text, new_menu) self._RecursiveAddMenuItems(new_menu, children) else: - AppendMenu(menu, help=help, id=new_id, - kind=wx.ITEM_NORMAL, text=text) - self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name), - id=new_id) + item = menu.Append(wx.ID_ANY, text, helpstr) + self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name), item) def _init_coll_AddMenu_Items(self, parent): IDEFrame._init_coll_AddMenu_Items(self, parent, False) @@ -299,9 +296,8 @@ _(u'Community support'), wx.OK | wx.ICON_INFORMATION) - id = wx.NewId() - parent.Append(help='', id=id, kind=wx.ITEM_NORMAL, text=_(u'Community support')) - self.Bind(wx.EVT_MENU, handler, id=id) + item = parent.Append(wx.ID_ANY, _(u'Community support'), '') + self.Bind(wx.EVT_MENU, handler, item) parent.Append(help='', id=wx.ID_ABOUT, kind=wx.ITEM_NORMAL, text=_(u'About')) @@ -686,7 +682,7 @@ except Exception: recent_projects = [] - while self.RecentProjectsMenu.GetMenuItemCount() > len(recent_projects): + while self.RecentProjectsMenu.GetMenuItemCount() > 0: item = self.RecentProjectsMenu.FindItemByPosition(0) self.RecentProjectsMenu.RemoveItem(item) @@ -694,16 +690,8 @@ for idx, projectpath in enumerate(recent_projects): text = u'&%d: %s' % (idx + 1, projectpath) - if idx < self.RecentProjectsMenu.GetMenuItemCount(): - item = self.RecentProjectsMenu.FindItemByPosition(idx) - id = item.GetId() - item.SetItemLabel(text) - self.Disconnect(id, id, wx.EVT_BUTTON._getEvtType()) - else: - id = wx.NewId() - AppendMenu(self.RecentProjectsMenu, help='', id=id, - kind=wx.ITEM_NORMAL, text=text) - self.Bind(wx.EVT_MENU, self.GenerateOpenRecentProjectFunction(projectpath), id=id) + item = self.RecentProjectsMenu.Append(wx.ID_ANY, text, '') + self.Bind(wx.EVT_MENU, self.GenerateOpenRecentProjectFunction(projectpath), item) def GenerateOpenRecentProjectFunction(self, projectpath): def OpenRecentProject(event): @@ -743,11 +731,10 @@ for confnode_method in self.CTR.StatusMethods: if "method" in confnode_method and confnode_method.get("shown", True): - id = wx.NewId() - StatusToolBar.AddSimpleTool( - id, GetBitmap(confnode_method.get("bitmap", "Unknown")), + tool = StatusToolBar.AddSimpleTool( + wx.ID_ANY, GetBitmap(confnode_method.get("bitmap", "Unknown")), confnode_method["tooltip"]) - self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id) + self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), tool) StatusToolBar.Realize() self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show() @@ -984,20 +971,17 @@ if confnode is not None: menu_items = confnode.GetContextualMenuItems() if menu_items is not None: - for text, help, callback in menu_items: - new_id = wx.NewId() - confnode_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=text) - self.Bind(wx.EVT_MENU, callback, id=new_id) + for text, helpstr, callback in menu_items: + item = confnode_menu.Append(wx.ID_ANY, text, helpstr) + self.Bind(wx.EVT_MENU, callback, item) else: - for name, XSDClass, help in confnode.CTNChildrenTypes: + for name, XSDClass, helpstr in confnode.CTNChildrenTypes: if not hasattr(XSDClass, 'CTNMaxCount') or not confnode.Children.get(name) \ or len(confnode.Children[name]) < XSDClass.CTNMaxCount: - new_id = wx.NewId() - confnode_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=_("Add") + " " + name) - self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name, confnode), id=new_id) - new_id = wx.NewId() - AppendMenu(confnode_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete")) - self.Bind(wx.EVT_MENU, self.GetDeleteMenuFunction(confnode), id=new_id) + item = confnode_menu.Append(wx.ID_ANY, _("Add") + " " + name, helpstr) + self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name, confnode), item) + item = confnode_menu.Append(wx.ID_ANY, _("Delete")) + self.Bind(wx.EVT_MENU, self.GetDeleteMenuFunction(confnode), item) self.PopupMenu(confnode_menu) confnode_menu.Destroy() diff -r f88eef34a523 -r eed31489c909 controls/LocationCellEditor.py --- a/controls/LocationCellEditor.py Wed Apr 03 06:31:34 2019 +0000 +++ b/controls/LocationCellEditor.py Sun Apr 07 16:23:49 2019 +0200 @@ -60,6 +60,7 @@ self.Controller = None self.VarType = None self.Default = False + self.VariableName = None def __del__(self): self.Controller = None @@ -75,11 +76,16 @@ def SetValue(self, value): self.Default = value + self.VariableName = None + self.VarType = None self.Location.SetValue(value) def GetValue(self): return self.Location.GetValue() + def GetName(self): + return self.VariableName + def OnSize(self, event): self.Layout() @@ -118,8 +124,13 @@ location = "%M" + location self.Location.SetValue(location) + self.VariableName = infos["var_name"] self.VarType = infos["IEC_type"] + # when user selected something, end editing immediately + # so that changes over multiple colums appear + wx.CallAfter(self.Parent.Parent.CloseEditControl) + self.Location.SetFocus() def OnLocationChar(self, event): @@ -171,8 +182,22 @@ loc = self.CellControl.GetValue() changed = loc != old_loc if changed: + name = self.CellControl.GetName() + if name is not None: + message = self.Table.Parent.CheckVariableName(name, row) + if message is not None: + wx.CallAfter(self.Table.Parent.ShowErrorMessage, message) + return None + old_name = self.Table.GetValueByName(row, 'Name') + self.Table.SetValueByName(row, 'Name', name) + self.Table.Parent.OnVariableNameChange(old_name, name) self.Table.SetValueByName(row, 'Location', loc) - self.Table.SetValueByName(row, 'Type', self.CellControl.GetVarType()) + var_type = self.CellControl.GetVarType() + if var_type is not None: + self.Table.SetValueByName(row, 'Type', var_type) + else: + wx.CallAfter(self.Table.Parent.ShowErrorMessage, + _("Selected location is identical to previous one")) self.CellControl.Disable() return changed diff -r f88eef34a523 -r eed31489c909 controls/VariablePanel.py --- a/controls/VariablePanel.py Wed Apr 03 06:31:34 2019 +0000 +++ b/controls/VariablePanel.py Sun Apr 07 16:23:49 2019 +0200 @@ -34,6 +34,7 @@ from six import string_types from six.moves import xrange + from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS, DefaultType from plcopen.VariableInfoCollector import _VariableInfos from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD, ERROR_HIGHLIGHT @@ -150,6 +151,7 @@ return value def SetValue(self, row, col, value): + print("SetValue",row, col, value) if col < len(self.colnames): colname = self.GetColLabelValue(col, False) if colname == "Name": @@ -788,6 +790,27 @@ dialog.ShowModal() dialog.Destroy() + def OnVariableNameChange(self, old_name, new_name): + """ propagate renaming of variable to the rest of the project """ + if old_name != "": + self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_name, new_name) + self.Controler.BufferProject() + wx.CallAfter(self.ParentWindow.RefreshView, False) + self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) + + def CheckVariableName(self, value, row): + if not TestIdentifier(value): + message = _("\"%s\" is not a valid identifier!") % value + elif value.upper() in IEC_KEYWORDS: + message = _("\"%s\" is a keyword. It can't be used!") % value + elif value.upper() in self.PouNames: + message = _("A POU named \"%s\" already exists!") % value + elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]: + message = _("A variable with \"%s\" as name already exists in this pou!") % value + else: + return None + return message + def OnVariablesGridCellChange(self, event): row, col = event.GetRow(), event.GetCol() colname = self.Table.GetColLabelValue(col, False) @@ -795,22 +818,11 @@ message = None if colname == "Name" and value != "": - if not TestIdentifier(value): - message = _("\"%s\" is not a valid identifier!") % value - elif value.upper() in IEC_KEYWORDS: - message = _("\"%s\" is a keyword. It can't be used!") % value - elif value.upper() in self.PouNames: - message = _("A POU named \"%s\" already exists!") % value - elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]: - message = _("A variable with \"%s\" as name already exists in this pou!") % value - else: + message = self.CheckVariableName(value, row) + if message is None: self.SaveValues(False) old_value = self.Table.GetOldValue() - if old_value != "": - self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value) - self.Controler.BufferProject() - wx.CallAfter(self.ParentWindow.RefreshView, False) - self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) + self.OnVariableNameChange(old_value, value) else: self.SaveValues() if colname == "Class": diff -r f88eef34a523 -r eed31489c909 dialogs/BrowseLocationsDialog.py --- a/dialogs/BrowseLocationsDialog.py Wed Apr 03 06:31:34 2019 +0000 +++ b/dialogs/BrowseLocationsDialog.py Sun Apr 07 16:23:49 2019 +0200 @@ -71,7 +71,7 @@ self.DIRFILTERCHOICE_OPTIONS = dict( [(_(option), filter) for option, filter in GetDirFilterChoiceOptions()]) - main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10) + main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10) main_sizer.AddGrowableCol(0) main_sizer.AddGrowableRow(1) @@ -91,6 +91,15 @@ main_sizer.AddWindow(self.LocationsTree, border=20, flag=wx.LEFT | wx.RIGHT | wx.GROW) + self.RenameCheckBox = wx.CheckBox(self, label=_("Rename variable to signal name")) + self.Config = wx.ConfigBase.Get() + default_checked = self.Config.Read("RenameVariableOnLocationChange") == "True" + self.RenameCheckBox.SetValue(default_checked) + self.do_rename = default_checked + + main_sizer.AddWindow(self.RenameCheckBox, border=20, + flag=wx.LEFT | wx.RIGHT | wx.GROW) + button_gridsizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0) button_gridsizer.AddGrowableCol(1) button_gridsizer.AddGrowableCol(3) @@ -217,9 +226,14 @@ def GetValues(self): selected = self.LocationsTree.GetSelection() - return self.LocationsTree.GetPyData(selected) + infos = self.LocationsTree.GetPyData(selected) + if not self.do_rename: + infos["var_name"] = None + return infos def OnOK(self, event): + self.do_rename = self.RenameCheckBox.IsChecked() + self.Config.Write("RenameVariableOnLocationChange", str(self.do_rename)) selected = self.LocationsTree.GetSelection() var_infos = None if selected.IsOk(): diff -r f88eef34a523 -r eed31489c909 dialogs/LDPowerRailDialog.py --- a/dialogs/LDPowerRailDialog.py Wed Apr 03 06:31:34 2019 +0000 +++ b/dialogs/LDPowerRailDialog.py Sun Apr 07 16:23:49 2019 +0200 @@ -155,7 +155,7 @@ self.RefreshPreview() event.Skip() - def RefreshPreview(self): + def DrawPreview(self): """ Refresh preview panel of graphic element Override BlockPreviewDialog function @@ -166,5 +166,4 @@ self.GetPowerRailType(), connectors=self.PinNumber.GetValue()) - # Call BlockPreviewDialog function - BlockPreviewDialog.RefreshPreview(self) + return BlockPreviewDialog.DrawPreview(self) diff -r f88eef34a523 -r eed31489c909 editors/Viewer.py --- a/editors/Viewer.py Wed Apr 03 06:31:34 2019 +0000 +++ b/editors/Viewer.py Sun Apr 07 16:23:49 2019 +0200 @@ -553,7 +553,6 @@ # Add Block Pin Menu items to the given menu def AddBlockPinMenuItems(self, menu, connector): - # Create menu items no_modifier = self.AppendItem(menu, _(u'No modifier'), self.OnNoModifierMenu, kind=wx.ITEM_RADIO) negated = self.AppendItem(menu, _(u'Negated'), self.OnNegatedMenu, kind=wx.ITEM_RADIO) rising_edge = self.AppendItem(menu, _(u'Rising Edge'), self.OnRisingEdgeMenu, kind=wx.ITEM_RADIO) @@ -575,7 +574,6 @@ # Add Alignment Menu items to the given menu def AddAlignmentMenuItems(self, menu): - # Create menu items self.AppendItem(menu, _(u'Left'), self.OnAlignLeftMenu) self.AppendItem(menu, _(u'Center'), self.OnAlignCenterMenu) self.AppendItem(menu, _(u'Right'), self.OnAlignRightMenu) @@ -586,98 +584,81 @@ # Add Wire Menu items to the given menu def AddWireMenuItems(self, menu, delete=False, replace=False): - [ - ID_ADD_SEGMENT, ID_DELETE_SEGMENT, ID_REPLACE_WIRE, - ] = [wx.NewId() for dummy in xrange(3)] - - # Create menu items - self.AddMenuItems(menu, [ - (ID_ADD_SEGMENT, wx.ITEM_NORMAL, _(u'Add Wire Segment'), '', self.OnAddSegmentMenu), - (ID_DELETE_SEGMENT, wx.ITEM_NORMAL, _(u'Delete Wire Segment'), '', self.OnDeleteSegmentMenu), - (ID_REPLACE_WIRE, wx.ITEM_NORMAL, _(u'Replace Wire by connections'), '', self.OnReplaceWireMenu)]) - - menu.Enable(ID_DELETE_SEGMENT, delete) - menu.Enable(ID_REPLACE_WIRE, replace) + self.AppendItem(menu, _(u'Add Wire Segment'), self.OnAddSegmentMenu) + delete_segment = self.AppendItem(menu, _(u'Delete Wire Segment'), + self.OnDeleteSegmentMenu) + replace_wire = self.AppendItem(menu, _(u'Replace Wire by connections'), + self.OnReplaceWireMenu) + + delete_segment.Enable(delete) + replace_wire.Enable(replace) # Add Divergence Menu items to the given menu def AddDivergenceMenuItems(self, menu, delete=False): - [ID_ADD_BRANCH, ID_DELETE_BRANCH] = [wx.NewId() for dummy in xrange(2)] - - # Create menu items - self.AddMenuItems(menu, [ - (ID_ADD_BRANCH, wx.ITEM_NORMAL, _(u'Add Divergence Branch'), '', self.OnAddBranchMenu), - (ID_DELETE_BRANCH, wx.ITEM_NORMAL, _(u'Delete Divergence Branch'), '', self.OnDeleteBranchMenu)]) - - menu.Enable(ID_DELETE_BRANCH, delete) + add_branch = self.AppendItem(menu, _(u'Add Divergence Branch'), + self.OnAddBranchMenu) + delete_branch = self.AppendItem(menu, _(u'Delete Divergence Branch'), + self.OnDeleteBranchMenu) + + delete_branch.Enable(delete) # Add Add Menu items to the given menu def AddAddMenuItems(self, menu): - [ID_ADD_BLOCK, ID_ADD_VARIABLE, ID_ADD_CONNECTION, - ID_ADD_COMMENT] = [wx.NewId() for dummy in xrange(4)] - - # Create menu items - self.AddMenuItems(menu, [ - (ID_ADD_BLOCK, wx.ITEM_NORMAL, _(u'Block'), '', self.GetAddMenuCallBack(self.AddNewBlock)), - (ID_ADD_VARIABLE, wx.ITEM_NORMAL, _(u'Variable'), '', self.GetAddMenuCallBack(self.AddNewVariable)), - (ID_ADD_CONNECTION, wx.ITEM_NORMAL, _(u'Connection'), '', self.GetAddMenuCallBack(self.AddNewConnection)), - None]) + self.AppendItem(menu, _(u'Block'), + self.GetAddMenuCallBack(self.AddNewBlock)) + self.AppendItem(menu, _(u'Variable'), + self.GetAddMenuCallBack(self.AddNewVariable)) + self.AppendItem(menu, _(u'Connection'), + self.GetAddMenuCallBack(self.AddNewConnection)) + menu.AppendSeparator() if self.CurrentLanguage != "FBD": - [ - ID_ADD_POWER_RAIL, ID_ADD_CONTACT, ID_ADD_COIL, - ] = [wx.NewId() for dummy in xrange(3)] - - # Create menu items - self.AddMenuItems(menu, [ - (ID_ADD_POWER_RAIL, wx.ITEM_NORMAL, _(u'Power Rail'), '', self.GetAddMenuCallBack(self.AddNewPowerRail)), - (ID_ADD_CONTACT, wx.ITEM_NORMAL, _(u'Contact'), '', self.GetAddMenuCallBack(self.AddNewContact))]) + self.AppendItem(menu, _(u'Power Rail'), + self.GetAddMenuCallBack(self.AddNewPowerRail)) + self.AppendItem(menu, _(u'Contact'), + self.GetAddMenuCallBack(self.AddNewContact)) if self.CurrentLanguage != "SFC": - self.AddMenuItems(menu, [ - (ID_ADD_COIL, wx.ITEM_NORMAL, _(u'Coil'), '', self.GetAddMenuCallBack(self.AddNewCoil))]) + self.AppendItem(menu, _(u'Coil'), + self.GetAddMenuCallBack(self.AddNewCoil)) menu.AppendSeparator() if self.CurrentLanguage == "SFC": - [ - ID_ADD_INITIAL_STEP, ID_ADD_STEP, ID_ADD_TRANSITION, - ID_ADD_ACTION_BLOCK, ID_ADD_DIVERGENCE, ID_ADD_JUMP, - ] = [wx.NewId() for dummy in xrange(6)] - - # Create menu items - self.AddMenuItems(menu, [ - (ID_ADD_INITIAL_STEP, wx.ITEM_NORMAL, _(u'Initial Step'), '', self.GetAddMenuCallBack(self.AddNewStep, True)), - (ID_ADD_STEP, wx.ITEM_NORMAL, _(u'Step'), '', self.GetAddMenuCallBack(self.AddNewStep)), - (ID_ADD_TRANSITION, wx.ITEM_NORMAL, _(u'Transition'), '', self.GetAddMenuCallBack(self.AddNewTransition)), - (ID_ADD_ACTION_BLOCK, wx.ITEM_NORMAL, _(u'Action Block'), '', self.GetAddMenuCallBack(self.AddNewActionBlock)), - (ID_ADD_DIVERGENCE, wx.ITEM_NORMAL, _(u'Divergence'), '', self.GetAddMenuCallBack(self.AddNewDivergence)), - (ID_ADD_JUMP, wx.ITEM_NORMAL, _(u'Jump'), '', self.GetAddMenuCallBack(self.AddNewJump)), - None]) - - self.AddMenuItems(menu, [ - (ID_ADD_COMMENT, wx.ITEM_NORMAL, _(u'Comment'), '', self.GetAddMenuCallBack(self.AddNewComment))]) + self.AppendItem(menu, _(u'Initial Step'), + self.GetAddMenuCallBack(self.AddNewStep, True)) + self.AppendItem(menu, (u'Step'), + self.GetAddMenuCallBack(self.AddNewStep)) + self.AppendItem(menu, (u'Transition'), + self.GetAddMenuCallBack(self.AddNewTransition)) + self.AppendItem(menu, (u'Action Block'), + self.GetAddMenuCallBack(self.AddNewActionBlock)) + self.AppendItem(menu, (u'Divergence'), + self.GetAddMenuCallBack(self.AddNewDivergence)) + self.AppendItem(menu, (u'Jump'), + self.GetAddMenuCallBack(self.AddNewJump)) + menu.AppendSeparator() + + self.AppendItem(menu, _(u'Comment'), + self.GetAddMenuCallBack(self.AddNewComment)) # Add Default Menu items to the given menu def AddDefaultMenuItems(self, menu, edit=False, block=False): if block: - [ID_EDIT_BLOCK, ID_DELETE, ID_ADJUST_BLOCK_SIZE] = [wx.NewId() for dummy in xrange(3)] - - # Create menu items - self.AddMenuItems(menu, [ - (ID_EDIT_BLOCK, wx.ITEM_NORMAL, _(u'Edit Block'), '', self.OnEditBlockMenu), - (ID_ADJUST_BLOCK_SIZE, wx.ITEM_NORMAL, _(u'Adjust Block Size'), '', self.OnAdjustBlockSizeMenu), - (ID_DELETE, wx.ITEM_NORMAL, _(u'Delete'), '', self.OnDeleteMenu)]) - - menu.Enable(ID_EDIT_BLOCK, edit) + edit_block = self.AppendItem(menu, _(u'Edit Block'), + self.OnEditBlockMenu) + self.AppendItem(menu, _(u'Adjust Block Size'), + self.OnAdjustBlockSizeMenu) + self.AppendItem(menu, _(u'Delete'), self.OnDeleteMenu) + + edit_block.Enable(edit) else: - [ID_CLEAR_EXEC_ORDER, ID_RESET_EXEC_ORDER] = [wx.NewId() for dummy in xrange(2)] - - # Create menu items if self.CurrentLanguage == 'FBD': - self.AddMenuItems(menu, [ - (ID_CLEAR_EXEC_ORDER, wx.ITEM_NORMAL, _(u'Clear Execution Order'), '', self.OnClearExecutionOrderMenu), - (ID_RESET_EXEC_ORDER, wx.ITEM_NORMAL, _(u'Reset Execution Order'), '', self.OnResetExecutionOrderMenu)]) + self.AppendItem(menu, _(u'Clear Execution Order'), + self.OnClearExecutionOrderMenu) + self.AppendItem(menu, _(u'Reset Execution Order'), + self.OnResetExecutionOrderMenu) menu.AppendSeparator() add_menu = wx.Menu(title='') @@ -686,17 +667,13 @@ menu.AppendSeparator() - [ID_CUT, ID_COPY, ID_PASTE] = [wx.NewId() for dummy in xrange(3)] - - # Create menu items - self.AddMenuItems(menu, [ - (ID_CUT, wx.ITEM_NORMAL, _(u'Cut'), '', self.GetClipboardCallBack(self.Cut)), - (ID_COPY, wx.ITEM_NORMAL, _(u'Copy'), '', self.GetClipboardCallBack(self.Copy)), - (ID_PASTE, wx.ITEM_NORMAL, _(u'Paste'), '', self.GetAddMenuCallBack(self.Paste))]) - - menu.Enable(ID_CUT, block) - menu.Enable(ID_COPY, block) - menu.Enable(ID_PASTE, self.ParentWindow.GetCopyBuffer() is not None) + cut = self.AppendItem(menu, _(u'Cut'), self.GetClipboardCallBack(self.Cut)) + copy = self.AppendItem(menu, _(u'Copy'), self.GetClipboardCallBack(self.Copy)) + paste = self.AppendItem(menu, _(u'Paste'), self.GetAddMenuCallBack(self.Paste)) + + cut.Enable(block) + copy.Enable(block) + paste.Enable(self.ParentWindow.GetCopyBuffer() is not None) def _init_Editor(self, prnt): self.Editor = wx.ScrolledWindow(prnt, name="Viewer", @@ -1657,11 +1634,11 @@ for type_label, type in [(_("Input"), INPUT), (_("Output"), OUTPUT), (_("InOut"), INOUT)]: - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_RADIO, text=type_label) - self.Bind(wx.EVT_MENU, self.GetChangeVariableTypeMenuFunction(type), id=new_id) + item = self.AppendItem(menu, type_label, + self.GetChangeVariableTypeMenuFunction(type), + kind=wx.ITEM_RADIO) if type == variable_type: - menu.Check(new_id, True) + item.Check(True) menu.AppendSeparator() self.AddDefaultMenuItems(menu, block=True) self.Editor.PopupMenu(menu) @@ -1672,11 +1649,11 @@ connection_type = self.SelectedElement.GetType() for type_label, type in [(_("Connector"), CONNECTOR), (_("Continuation"), CONTINUATION)]: - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_RADIO, text=type_label) - self.Bind(wx.EVT_MENU, self.GetChangeConnectionTypeMenuFunction(type), id=new_id) - if type == connection_type: - menu.Check(new_id, True) + item = self.AppendItem(menu, type_label, + self.GetChangeConnectionTypeMenuFunction(type), + kind=wx.ITEM_RADIO) + if type == variable_type: + item.Check(True) menu.AppendSeparator() self.AddDefaultMenuItems(menu, block=True) self.Editor.PopupMenu(menu) @@ -2158,9 +2135,8 @@ # Popup contextual menu menu = wx.Menu() - self.AddMenuItems(menu, - [(wx.NewId(), wx.ITEM_NORMAL, text, '', callback) - for text, callback in items]) + for text, callback in items : + self.AppendItem(menu, text, callback) self.PopupMenu(menu) self.SelectedElement.StartConnected.HighlightParentBlock(False)