merged svghmi
authorEdouard Tisserant <edouard.tisserant@gmail.com>
Mon, 31 May 2021 10:10:00 +0200
branchsvghmi
changeset 3249 7b19c363ef9c
parent 3247 7282b40374b0 (current diff)
parent 3248 ea93c14342d1 (diff)
child 3250 22da8e0b07b8
merged
--- a/BeremizIDE.py	Mon May 31 10:08:02 2021 +0200
+++ b/BeremizIDE.py	Mon May 31 10:10:00 2021 +0200
@@ -81,7 +81,6 @@
     LIBRARYTREE,\
     PAGETITLES,\
     IDEFrame, \
-    AppendMenu,\
     EncodeFileSystemPath, \
     DecodeFileSystemPath
 
@@ -92,6 +91,8 @@
 def Bpath(*args):
     return os.path.join(beremiz_dir, *args)
 
+def AppendMenu(parent, help, id, kind, text):
+    return parent.Append(help=help, id=id, kind=kind, text=text)
 
 MAX_RECENT_PROJECTS = 9
 
--- a/Beremiz_service.py	Mon May 31 10:08:02 2021 +0200
+++ b/Beremiz_service.py	Mon May 31 10:10:00 2021 +0200
@@ -546,24 +546,35 @@
         except Exception:
             LogMessageAndException(_("WAMP client startup failed. "))
 
-pyro_thread_started = Lock()
-pyro_thread_started.acquire()
-pyro_thread = Thread(target=pyroserver.PyroLoop,
-                     kwargs=dict(when_ready=pyro_thread_started.release),
-                     name="PyroThread")
-pyro_thread.start()
-
-# Wait for pyro thread to be effective
-pyro_thread_started.acquire()
-
-pyroserver.PrintServerInfo()
-
-# Beremiz IDE detects LOCAL:// runtime is ready by looking
-# for self.workdir in the daemon's stdout.
-sys.stdout.write(_("Current working directory :") + WorkingDir + "\n")
-sys.stdout.flush()
-
-if havetwisted or havewx:
+def FirstWorkerJob():
+    """
+    RPC through pyro/wamp/UI may lead to delegation to Worker,
+    then this function ensures that Worker is already
+    created when pyro starts
+    """
+    global pyro_thread, pyroserver, ui_thread, reactor, twisted_reactor_thread_id
+
+    pyro_thread_started = Lock()
+    pyro_thread_started.acquire()
+    pyro_thread = Thread(target=pyroserver.PyroLoop,
+                         kwargs=dict(when_ready=pyro_thread_started.release),
+                         name="PyroThread")
+
+    pyro_thread.start()
+
+    # Wait for pyro thread to be effective
+    pyro_thread_started.acquire()
+
+    pyroserver.PrintServerInfo()
+
+    # Beremiz IDE detects LOCAL:// runtime is ready by looking
+    # for self.workdir in the daemon's stdout.
+    sys.stdout.write(_("Current working directory :") + WorkingDir + "\n")
+    sys.stdout.flush()
+
+    if not (havetwisted or havewx):
+        return
+
     ui_thread_started = Lock()
     ui_thread_started.acquire()
     if havetwisted:
@@ -592,9 +603,10 @@
     ui_thread_started.acquire()
     print("UI thread started successfully.")
 
+    runtime.GetPLCObjectSingleton().AutoLoad(autostart)
+
 try:
-    runtime.MainWorker.runloop(
-        runtime.GetPLCObjectSingleton().AutoLoad, autostart)
+    runtime.MainWorker.runloop(FirstWorkerJob)
 except KeyboardInterrupt:
     pass
 
--- a/IDEFrame.py	Mon May 31 10:08:02 2021 +0200
+++ b/IDEFrame.py	Mon May 31 10:10:00 2021 +0200
@@ -114,8 +114,8 @@
     return text(path, sys.getfilesystemencoding())
 
 
-def AppendMenu(parent, help, id, kind, text):
-    parent.Append(help=help, id=id, kind=kind, text=text)
+def AppendMenu(parent, help, kind, text, id=wx.ID_ANY):
+    return parent.Append(help=help, kind=kind, text=text, id=id)
 
 
 [
@@ -444,10 +444,9 @@
         zoommenu = wx.Menu(title='')
         parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
         for idx, value in enumerate(ZOOM_FACTORS):
-            new_id = wx.NewId()
-            AppendMenu(zoommenu, help='', id=new_id,
+            new_item = AppendMenu(zoommenu, help='',
                        kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
-            self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
+            self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), new_item)
 
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENUSWITCHPERSPECTIVE,
@@ -1906,56 +1905,49 @@
 
             if name == "Data Types":
                 menu = wx.Menu(title='')
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add DataType"))
-                self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id)
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add DataType"))
+                self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, new_item)
 
             elif name in ["Functions", "Function Blocks", "Programs", "Project"]:
                 menu = wx.Menu(title='')
 
                 if name != "Project":
-                    new_id = wx.NewId()
-                    AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add POU"))
-                    self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions": "function", "Function Blocks": "functionBlock", "Programs": "program"}[name]), id=new_id)
-
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Paste POU"))
-                self.Bind(wx.EVT_MENU, self.OnPastePou, id=new_id)
+                    new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add POU"))
+                    self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions": "function", "Function Blocks": "functionBlock", "Programs": "program"}[name]), new_item)
+
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Paste POU"))
+                self.Bind(wx.EVT_MENU, self.OnPastePou, new_item)
                 if self.GetCopyBuffer() is None:
-                    menu.Enable(new_id, False)
+                    menu.Enable(new_item, False)
 
             elif name == "Configurations":
                 menu = wx.Menu(title='')
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Configuration"))
-                self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id)
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add Configuration"))
+                self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, new_item)
 
             elif name == "Transitions":
                 menu = wx.Menu(title='')
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add Transition"))
                 parent = self.ProjectTree.GetItemParent(item)
                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
                 while parent_type != ITEM_POU:
                     parent = self.ProjectTree.GetItemParent(parent)
                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
-                self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
+                self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), new_item)
 
             elif name == "Actions":
                 menu = wx.Menu(title='')
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add Action"))
                 parent = self.ProjectTree.GetItemParent(item)
                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
                 while parent_type != ITEM_POU:
                     parent = self.ProjectTree.GetItemParent(parent)
                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
-                self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
+                self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), new_item)
 
             elif name == "Resources":
                 menu = wx.Menu(title='')
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add Resource"))
                 parent = self.ProjectTree.GetItemParent(item)
                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
                 while parent_type not in [ITEM_CONFIGURATION, ITEM_PROJECT]:
@@ -1969,52 +1961,44 @@
                 else:
                     parent_name = self.ProjectTree.GetItemText(parent)
                 if parent_name is not None:
-                    self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id)
+                    self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), new_item)
 
         else:
             if item_infos["type"] == ITEM_POU:
                 menu = wx.Menu(title='')
                 if self.Controler.GetPouBodyType(name) == "SFC":
-                    new_id = wx.NewId()
-                    AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
-                    self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
-                    new_id = wx.NewId()
-                    AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
-                    self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id)
+                    new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add Transition"))
+                    self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), new_item)
+                    new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add Action"))
+                    self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), new_item)
                     menu.AppendSeparator()
 
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Copy POU"))
-                self.Bind(wx.EVT_MENU, self.OnCopyPou, id=new_id)
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Copy POU"))
+                self.Bind(wx.EVT_MENU, self.OnCopyPou, new_item)
 
                 pou_type = self.Controler.GetPouType(name)
                 if pou_type in ["function", "functionBlock"]:
                     change_menu = wx.Menu(title='')
                     if pou_type == "function":
-                        new_id = wx.NewId()
-                        AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Function Block"))
-                        self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "functionBlock"), id=new_id)
-                    new_id = wx.NewId()
-                    AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Program"))
-                    self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), id=new_id)
+                        new_item = AppendMenu(change_menu, help='', kind=wx.ITEM_NORMAL, text=_("Function Block"))
+                        self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "functionBlock"), new_item)
+                    new_item = AppendMenu(change_menu, help='', kind=wx.ITEM_NORMAL, text=_("Program"))
+                    self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), new_item)
                     menu.AppendMenu(wx.NewId(), _("Duplicate as..."), change_menu)
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename"))
-                self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Rename"))
+                self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, new_item)
 
             elif item_infos["type"] == ITEM_CONFIGURATION:
                 menu = wx.Menu(title='')
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
-                self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Add Resource"))
+                self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), new_item)
 
             elif item_infos["type"] in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
                 menu = wx.Menu(title='')
 
             if menu is not None:
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
-                self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
+                new_item = AppendMenu(menu, help='', kind=wx.ITEM_NORMAL, text=_("Delete"))
+                self.Bind(wx.EVT_MENU, self.OnDeleteMenu, new_item)
 
         if menu is not None:
             self.FindFocus().PopupMenu(menu)
--- a/PLCOpenEditor.py	Mon May 31 10:08:02 2021 +0200
+++ b/PLCOpenEditor.py	Mon May 31 10:10:00 2021 +0200
@@ -140,9 +140,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)
+        menu_entry = parent.Append(help='', id=wx.ID_ANY, kind=wx.ITEM_NORMAL, text=_(u'Community support'))
+        self.Bind(wx.EVT_MENU, handler, menu_entry)
 
         AppendMenu(parent, help='', id=wx.ID_ABOUT,
                    kind=wx.ITEM_NORMAL, text=_(u'About'))
--- a/controls/DiscoveryPanel.py	Mon May 31 10:08:02 2021 +0200
+++ b/controls/DiscoveryPanel.py	Mon May 31 10:10:00 2021 +0200
@@ -35,9 +35,9 @@
 
 
 class AutoWidthListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
-    def __init__(self, parent, id, name, pos=wx.DefaultPosition,
+    def __init__(self, parent, name, pos=wx.DefaultPosition,
                  size=wx.DefaultSize, style=0):
-        wx.ListCtrl.__init__(self, parent, id, pos, size, style, name=name)
+        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, pos, size, style, name=name)
         listmix.ListCtrlAutoWidthMixin.__init__(self)
 
 
@@ -73,9 +73,7 @@
 
     def _init_list_ctrl(self):
         # Set up list control
-        listID = wx.NewId()
         self.ServicesList = AutoWidthListCtrl(
-            id=listID,
             name='ServicesList', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 0),
             style=wx.LC_REPORT | wx.LC_EDIT_LABELS | wx.LC_SORT_ASCENDING | wx.LC_SINGLE_SEL)
         self.ServicesList.InsertColumn(0, _('NAME'))
@@ -87,8 +85,8 @@
         self.ServicesList.SetColumnWidth(2, 150)
         self.ServicesList.SetColumnWidth(3, 150)
         self.ServicesList.SetInitialSize(wx.Size(-1, 300))
-        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, id=listID)
-        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, id=listID)
+        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.ServicesList)
+        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.ServicesList)
 
     def _init_ctrls(self, prnt):
         self.staticText1 = wx.StaticText(
--- a/controls/LogViewer.py	Mon May 31 10:08:02 2021 +0200
+++ b/controls/LogViewer.py	Mon May 31 10:10:00 2021 +0200
@@ -711,9 +711,8 @@
         if message is not None:
             menu = wx.Menu(title='')
 
-            new_id = wx.NewId()
-            menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Copy"))
-            self.Bind(wx.EVT_MENU, self.GetCopyMessageToClipboardFunction(message), id=new_id)
+            menu_entry = menu.Append(help='', id=wx.ID_ANY, kind=wx.ITEM_NORMAL, text=_("Copy"))
+            self.Bind(wx.EVT_MENU, self.GetCopyMessageToClipboardFunction(message), menu_entry)
 
             self.MessagePanel.PopupMenu(menu)
             menu.Destroy()
--- a/controls/SearchResultPanel.py	Mon May 31 10:08:02 2021 +0200
+++ b/controls/SearchResultPanel.py	Mon May 31 10:10:00 2021 +0200
@@ -49,13 +49,6 @@
 #                            Search Result Panel
 # -------------------------------------------------------------------------------
 
-
-[
-    ID_SEARCHRESULTPANEL, ID_SEARCHRESULTPANELHEADERLABEL,
-    ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON,
-] = [wx.NewId() for _init_ctrls in range(4)]
-
-
 class SearchResultPanel(wx.Panel):
 
     def _init_coll_MainSizer_Items(self, parent):
@@ -84,18 +77,15 @@
         self.SetSizer(self.MainSizer)
 
     def _init_ctrls(self, prnt):
-        self.HeaderLabel = wx.StaticText(id=ID_SEARCHRESULTPANELHEADERLABEL,
-                                         name='HeaderLabel', parent=self,
+        self.HeaderLabel = wx.StaticText(name='HeaderLabel', parent=self,
                                          pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
 
         search_results_tree_style = CT.TR_HAS_BUTTONS | CT.TR_NO_LINES | CT.TR_HAS_VARIABLE_ROW_HEIGHT
-        self.SearchResultsTree = CT.CustomTreeCtrl(id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE,
-                                                   name="SearchResultsTree", parent=self,
+        self.SearchResultsTree = CT.CustomTreeCtrl(name="SearchResultsTree", parent=self,
                                                    pos=wx.Point(0, 0), style=search_results_tree_style)
-        if wx.VERSION >= (2, 8, 11):
-            self.SearchResultsTree.SetAGWWindowStyleFlag(search_results_tree_style)
+        self.SearchResultsTree.SetAGWWindowStyleFlag(search_results_tree_style)
         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnSearchResultsTreeItemActivated,
-                  id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE)
+                  self.SearchResultsTree)
 
         self.ResetButton = wx.lib.buttons.GenBitmapButton(
             self, bitmap=GetBitmap("reset"),
@@ -106,7 +96,7 @@
         self._init_sizers()
 
     def __init__(self, parent, window):
-        wx.Panel.__init__(self, id=ID_SEARCHRESULTPANEL,
+        wx.Panel.__init__(self,
                           name='SearchResultPanel', parent=parent,
                           pos=wx.Point(0, 0),
                           size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
--- a/docutil/dochtml.py	Mon May 31 10:08:02 2021 +0200
+++ b/docutil/dochtml.py	Mon May 31 10:10:00 2021 +0200
@@ -41,7 +41,6 @@
         window.Show()
 
 
-[ID_HTMLFRAME, ID_HTMLFRAMEHTMLCONTENT] = [wx.NewId() for _init_ctrls in range(2)]
 EVT_HTML_URL_CLICK = wx.NewId()
 
 
@@ -72,13 +71,12 @@
         self.SetIcon(prnt.icon)
         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
 
-        self.HtmlContent = UrlClickHtmlWindow(id=ID_HTMLFRAMEHTMLCONTENT,
-                                              name='HtmlContent', parent=self, pos=wx.Point(0, 0),
+        self.HtmlContent = UrlClickHtmlWindow(name='HtmlContent', parent=self, pos=wx.Point(0, 0),
                                               size=wx.Size(-1, -1), style=wx.html.HW_SCROLLBAR_AUTO | wx.html.HW_NO_SELECTION)
         self.HtmlContent.Bind(HtmlWindowUrlClick, self.OnLinkClick)
 
     def __init__(self, parent, opened):
-        wx.Frame.__init__(self, id=ID_HTMLFRAME, name='HtmlFrame',
+        wx.Frame.__init__(self, name='HtmlFrame',
                           parent=parent, pos=wx.Point(320, 231),
                           size=wx.Size(853, 616),
                           style=wx.DEFAULT_FRAME_STYLE, title='')
--- a/editors/CodeFileEditor.py	Mon May 31 10:08:02 2021 +0200
+++ b/editors/CodeFileEditor.py	Mon May 31 10:10:00 2021 +0200
@@ -826,16 +826,14 @@
             type_menu = wx.Menu(title='')
             base_menu = wx.Menu(title='')
             for base_type in self.Controler.GetBaseTypes():
-                new_id = wx.NewId()
-                base_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
-                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
-            type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu)
+                new_entry = base_menu.Append(help='', id=wx.ID_ANY, kind=wx.ITEM_NORMAL, text=base_type)
+                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), new_entry)
+            type_menu.AppendMenu(wx.ID_ANY, "Base Types", base_menu)
             datatype_menu = wx.Menu(title='')
             for datatype in self.Controler.GetDataTypes():
-                new_id = wx.NewId()
-                datatype_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
-                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
-            type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu)
+                new_entry = datatype_menu.Append(help='', id=wx.ID_ANY, kind=wx.ITEM_NORMAL, text=datatype)
+                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), new_entry)
+            type_menu.AppendMenu(wx.ID_ANY, "User Data Types", datatype_menu)
             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
 
             self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize())
--- a/editors/DataTypeEditor.py	Mon May 31 10:08:02 2021 +0200
+++ b/editors/DataTypeEditor.py	Mon May 31 10:10:00 2021 +0200
@@ -46,8 +46,8 @@
 DIMENSION_MODEL = re.compile(r"([0-9]+)\.\.([0-9]+)$")
 
 
-def AppendMenu(parent, help, id, kind, text):
-    parent.Append(help=help, id=id, kind=kind, text=text)
+def AppendMenu(parent, help, kind, text):
+    return parent.Append(help=help, id=wx.ID_ANY, kind=kind, text=text)
 
 
 def GetElementsTableColnames():
@@ -633,31 +633,18 @@
 
             base_menu = wx.Menu(title='')
             for base_type in self.Controler.GetBaseTypes():
-                new_id = wx.NewId()
-                AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
-                self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(base_type), id=new_id)
-            type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
+                new_entry = AppendMenu(base_menu, help='', kind=wx.ITEM_NORMAL, text=base_type)
+                self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(base_type), new_entry)
+            type_menu.AppendMenu(wx.ID_ANY, _("Base Types"), base_menu)
 
             datatype_menu = wx.Menu(title='')
             for datatype in self.Controler.GetDataTypes(self.TagName, False):
-                new_id = wx.NewId()
-                AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
-                self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(datatype), id=new_id)
-            type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
-
-            new_id = wx.NewId()
-            AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
-            self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id)
-
-#            functionblock_menu = wx.Menu(title='')
-#            bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
-#            pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
-#            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
-#                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
-#                    new_id = wx.NewId()
-#                    AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
-#                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
-#                type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
+                new_entry = AppendMenu(datatype_menu, help='', kind=wx.ITEM_NORMAL, text=datatype)
+                self.Bind(wx.EVT_MENU, self.GetElementTypeFunction(datatype), new_entry)
+            type_menu.AppendMenu(wx.ID_ANY, _("User Data Types"), datatype_menu)
+
+            new_entry = AppendMenu(type_menu, help='', kind=wx.ITEM_NORMAL, text=_("Array"))
+            self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, new_entry)
 
             rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col))
             self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
--- a/editors/ResourceEditor.py	Mon May 31 10:08:02 2021 +0200
+++ b/editors/ResourceEditor.py	Mon May 31 10:10:00 2021 +0200
@@ -43,14 +43,8 @@
 # -------------------------------------------------------------------------------
 
 
-[
-    ID_CONFIGURATIONEDITOR,
-] = [wx.NewId() for _init_ctrls in range(1)]
-
-
 class ConfigurationEditor(EditorPanel):
 
-    ID = ID_CONFIGURATIONEDITOR
     VARIABLE_PANEL_TYPE = "config"
 
     def GetBufferState(self):
--- a/editors/TextViewer.py	Mon May 31 10:08:02 2021 +0200
+++ b/editors/TextViewer.py	Mon May 31 10:10:00 2021 +0200
@@ -55,10 +55,6 @@
  STC_PLC_EMPTY] = range(11)
 [SPACE, WORD, NUMBER, STRING, WSTRING, COMMENT, PRAGMA, DPRAGMA] = range(8)
 
-[
-    ID_TEXTVIEWER, ID_TEXTVIEWERTEXTCTRL,
-] = [wx.NewId() for _init_ctrls in range(2)]
-
 re_texts = {}
 re_texts["letter"] = "[A-Za-z]"
 re_texts["digit"] = "[0-9]"
@@ -79,11 +75,8 @@
 
 class TextViewer(EditorPanel):
 
-    ID = ID_TEXTVIEWER
-
     def _init_Editor(self, prnt):
-        self.Editor = CustomStyledTextCtrl(id=ID_TEXTVIEWERTEXTCTRL,
-                                           parent=prnt, name="TextViewer", size=wx.Size(0, 0), style=0)
+        self.Editor = CustomStyledTextCtrl(parent=prnt, name="TextViewer", size=wx.Size(0, 0), style=0)
         self.Editor.ParentWindow = self
 
         self.Editor.CmdKeyAssign(ord('+'), wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_ZOOMIN)
@@ -140,14 +133,14 @@
                                     wx.stc.STC_MOD_BEFOREDELETE |
                                     wx.stc.STC_PERFORMED_USER)
 
-        self.Bind(wx.stc.EVT_STC_STYLENEEDED, self.OnStyleNeeded, id=ID_TEXTVIEWERTEXTCTRL)
+        self.Bind(wx.stc.EVT_STC_STYLENEEDED, self.OnStyleNeeded, self.Editor)
         self.Editor.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnMarginClick)
         self.Editor.Bind(wx.stc.EVT_STC_UPDATEUI, self.OnUpdateUI)
         self.Editor.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
         if self.Controler is not None:
             self.Editor.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
-            self.Bind(wx.stc.EVT_STC_DO_DROP, self.OnDoDrop, id=ID_TEXTVIEWERTEXTCTRL)
-            self.Bind(wx.stc.EVT_STC_MODIFIED, self.OnModification, id=ID_TEXTVIEWERTEXTCTRL)
+            self.Bind(wx.stc.EVT_STC_DO_DROP, self.OnDoDrop, self.Editor)
+            self.Bind(wx.stc.EVT_STC_MODIFIED, self.OnModification, self.Editor)
 
     def __init__(self, parent, tagname, window, controler, debug=False, instancepath=""):
         if tagname != "" and controler is not None:
--- a/editors/Viewer.py	Mon May 31 10:08:02 2021 +0200
+++ b/editors/Viewer.py	Mon May 31 10:10:00 2021 +0200
@@ -67,10 +67,6 @@
                    wx.StockCursor(wx.CURSOR_SIZENS)]
 
 
-def AppendMenu(parent, help, id, kind, text):
-    parent.Append(help=help, id=id, kind=kind, text=text)
-
-
 if wx.Platform == '__WXMSW__':
     faces = {
         'times': 'Times New Roman',
@@ -238,25 +234,6 @@
 # -------------------------------------------------------------------------------
 
 
-# ID Constants for alignment menu items
-[
-    ID_VIEWERALIGNMENTMENUITEMS0, ID_VIEWERALIGNMENTMENUITEMS1,
-    ID_VIEWERALIGNMENTMENUITEMS2, ID_VIEWERALIGNMENTMENUITEMS4,
-    ID_VIEWERALIGNMENTMENUITEMS5, ID_VIEWERALIGNMENTMENUITEMS6,
-] = [wx.NewId() for _init_coll_AlignmentMenu_Items in range(6)]
-
-# ID Constants for contextual menu items
-[
-    ID_VIEWERCONTEXTUALMENUITEMS0, ID_VIEWERCONTEXTUALMENUITEMS1,
-    ID_VIEWERCONTEXTUALMENUITEMS2, ID_VIEWERCONTEXTUALMENUITEMS3,
-    ID_VIEWERCONTEXTUALMENUITEMS5, ID_VIEWERCONTEXTUALMENUITEMS6,
-    ID_VIEWERCONTEXTUALMENUITEMS8, ID_VIEWERCONTEXTUALMENUITEMS9,
-    ID_VIEWERCONTEXTUALMENUITEMS11, ID_VIEWERCONTEXTUALMENUITEMS12,
-    ID_VIEWERCONTEXTUALMENUITEMS14, ID_VIEWERCONTEXTUALMENUITEMS16,
-    ID_VIEWERCONTEXTUALMENUITEMS17,
-] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(13)]
-
-
 class ViewerDropTarget(wx.TextDropTarget):
 
     def __init__(self, parent):
@@ -535,17 +512,6 @@
     manipulating graphic elements
     """
 
-    # Add list of menu items to the given menu
-    def AddMenuItems(self, menu, items):
-        for item in items:
-            if item is None:
-                menu.AppendSeparator()
-            else:
-                id, kind, text, help, callback = item
-                AppendMenu(menu, help=help, id=id, kind=kind, text=text)
-                # Link menu event to corresponding called functions
-                self.Bind(wx.EVT_MENU, callback, id=id)
-
     def AppendItem(self, menu, text, callback, *args, **kwargs):
         item = menu.Append(wx.ID_ANY, text, *args, **kwargs)
         self.Bind(wx.EVT_MENU, callback, item)
--- a/etherlab/ConfigEditor.py	Mon May 31 10:08:02 2021 +0200
+++ b/etherlab/ConfigEditor.py	Mon May 31 10:10:00 2021 +0200
@@ -33,13 +33,6 @@
 [ETHERCAT_VENDOR, ETHERCAT_GROUP, ETHERCAT_DEVICE] = range(3)
 
 
-def AppendMenu(parent, help, id, kind, text):
-    if wx.VERSION >= (2, 6, 0):
-        parent.Append(help=help, id=id, kind=kind, text=text)
-    else:
-        parent.Append(helpString=help, id=id, kind=kind, item=text)
-
-
 def GetVariablesTableColnames(position=False):
     _ = NoTranslate
     colname = ["#"]