--- 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:
+ for name, text, helpstr, children in items: 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)
- AppendMenu(menu, help=help, id=new_id,
- kind=wx.ITEM_NORMAL, text=text)
- self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name),
+ 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 @@
wx.OK | wx.ICON_INFORMATION)
- 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 @@
- 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)
- item.SetItemLabel(text)
- self.Disconnect(id, id, wx.EVT_BUTTON._getEvtType())
- 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):
- 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) self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show()
@@ -984,20 +971,17 @@
menu_items = confnode.GetContextualMenuItems()
if menu_items is not None:
- for text, help, callback in menu_items:
- 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) - 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:
- 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)
- 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)
--- 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.VariableName = None @@ -75,11 +76,16 @@
def SetValue(self, value):
+ self.VariableName = None self.Location.SetValue(value)
return self.Location.GetValue()
+ return self.VariableName @@ -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) def OnLocationChar(self, event):
@@ -171,8 +182,22 @@
loc = self.CellControl.GetValue()
+ name = self.CellControl.GetName() + message = self.Table.Parent.CheckVariableName(name, row) + if message is not None: + wx.CallAfter(self.Table.Parent.ShowErrorMessage, message) + 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) + wx.CallAfter(self.Table.Parent.ShowErrorMessage, + _("Selected location is identical to previous one")) self.CellControl.Disable()
--- 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 @@
def SetValue(self, row, col, value):
+ print("SetValue",row, col, value) if col < len(self.colnames):
colname = self.GetColLabelValue(col, False)
@@ -788,6 +790,27 @@
+ def OnVariableNameChange(self, old_name, new_name): + """ propagate renaming of variable to the rest of the project """ + 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 def OnVariablesGridCellChange(self, event):
row, col = event.GetRow(), event.GetCol()
colname = self.Table.GetColLabelValue(col, False)
@@ -795,22 +818,11 @@
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
+ message = self.CheckVariableName(value, row) old_value = self.Table.GetOldValue()
- 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) --- 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 @@
selected = self.LocationsTree.GetSelection()
- return self.LocationsTree.GetPyData(selected)
+ infos = self.LocationsTree.GetPyData(selected) + infos["var_name"] = None + self.do_rename = self.RenameCheckBox.IsChecked() + self.Config.Write("RenameVariableOnLocationChange", str(self.do_rename)) selected = self.LocationsTree.GetSelection()
--- 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):
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):
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)]
- 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)]
- 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'), + 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)]
- 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)),
+ 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)) if self.CurrentLanguage != "FBD":
- ID_ADD_POWER_RAIL, ID_ADD_CONTACT, ID_ADD_COIL,
- ] = [wx.NewId() for dummy in xrange(3)]
- 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)) 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)]
- 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)),
- 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)) + 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):
- [ID_EDIT_BLOCK, ID_DELETE, ID_ADJUST_BLOCK_SIZE] = [wx.NewId() for dummy in xrange(3)]
- 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.AppendItem(menu, _(u'Adjust Block Size'), + self.OnAdjustBlockSizeMenu) + self.AppendItem(menu, _(u'Delete'), self.OnDeleteMenu) + edit_block.Enable(edit) - [ID_CLEAR_EXEC_ORDER, ID_RESET_EXEC_ORDER] = [wx.NewId() for dummy in xrange(2)]
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) add_menu = wx.Menu(title='')
@@ -686,17 +667,13 @@
- [ID_CUT, ID_COPY, ID_PASTE] = [wx.NewId() for dummy in xrange(3)]
- 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)) + 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),
- 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), if type == variable_type:
- menu.Check(new_id, True)
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)]:
- 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), + if type == variable_type: self.AddDefaultMenuItems(menu, block=True)
self.Editor.PopupMenu(menu)
@@ -2158,9 +2135,8 @@
- 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.SelectedElement.StartConnected.HighlightParentBlock(False)