diff -r 3216bf5f711d -r 629680fb0582 PLCOpenEditor.py --- a/PLCOpenEditor.py Sat May 19 12:40:53 2012 +0200 +++ b/PLCOpenEditor.py Mon May 21 09:59:44 2012 +0200 @@ -279,20 +279,13 @@ control.ProcessEvent(event) return ShortcutKeyFunction -def GetParentName(tree, item, parent_type): - parent_item = tree.GetItemParent(item) - parent_item_type = tree.GetPyData(parent_item) - while parent_item_type != parent_type: - parent_item = tree.GetItemParent(parent_item) - parent_item_type = tree.GetPyData(parent_item) - return tree.GetItemText(parent_item) - def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None): def DeleteElementFunction(self, selected): name = self.ProjectTree.GetItemText(selected) if check_function is None or not check_function(self.Controler, name): if parent_type is not None: - parent_name = GetParentName(self.ProjectTree, selected, parent_type) + item_infos = self.ProjectTree.GetPyData(selected) + parent_name = item_infos["tagname"].split("::")[1] remove_function(self.Controler, parent_name, name) else: remove_function(self.Controler, name) @@ -406,7 +399,7 @@ def _init_coll_FileMenu_Items(self, parent): pass - def _init_coll_AddMenu_Items(self, parent): + def _init_coll_AddMenu_Items(self, parent, add_config=True): AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE, kind=wx.ITEM_NORMAL, text=_(u'&Data Type')) AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION, @@ -415,8 +408,9 @@ kind=wx.ITEM_NORMAL, text=_(u'Function &Block')) AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM, kind=wx.ITEM_NORMAL, text=_(u'&Program')) - AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, - kind=wx.ITEM_NORMAL, text=_(u'&Configuration')) + if add_config: + AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, + kind=wx.ITEM_NORMAL, text=_(u'&Configuration')) def _init_coll_EditMenu_Items(self, parent): AppendMenu(parent, help='', id=wx.ID_UNDO, @@ -854,11 +848,12 @@ elif page_infos[0] == "editor": tagname = page_infos[1] page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname) - page_ref.RefreshView() - return notebook.GetPageIndex(page_ref) + if page_ref is not None: + page_ref.RefreshView() + return notebook.GetPageIndex(page_ref) elif page_infos[0] == "debug": instance_path = page_infos[1] - instance_infos = self.Controler.GetInstanceInfos(instance_path) + instance_infos = self.Controler.GetInstanceInfos(instance_path, self.EnableDebug) if instance_infos is not None: return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"])) return None @@ -1194,6 +1189,7 @@ def ResetView(self): self.DeleteAllPages() self.ProjectTree.DeleteAllItems() + self.ProjectTree.Enable(False) self.PouInstanceVariablesPanel.ResetView() self.LibraryPanel.ResetTree() self.LibraryPanel.SetControler(None) @@ -1387,8 +1383,7 @@ if window == self.ProjectTree or window is None: selected = self.ProjectTree.GetSelection() if selected.IsOk(): - type = self.ProjectTree.GetPyData(selected) - function = self.DeleteFunctions.get(type, None) + function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None) if function is not None: function(self, selected) self.CloseTabsWithoutModel() @@ -1484,6 +1479,10 @@ self.AUIManager.RestorePane(pane) self.AUIManager.Update() + def EnsureTabVisible(self, tab): + notebook = tab.GetParent() + notebook.SetSelection(notebook.GetPageIndex(tab)) + def OnPouSelectedChanging(self, event): if not self.Starting: selected = self.TabsOpened.GetSelection() @@ -1503,8 +1502,13 @@ wx.CallAfter(self.SelectProjectTreeItem, tagname) wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname) window.RefreshView() + self.EnsureTabVisible(self.LibraryPanel) else: instance_path = window.GetInstancePath() + if tagname == "": + instance_path = instance_path.rsplit(".", 1)[0] + tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug) + self.EnsureTabVisible(self.DebugVariablePanel) wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path) wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR) event.Skip() @@ -1581,15 +1585,20 @@ return self.GenerateProjectTreeBranch(root, infos["values"][0]) item_name = _(item_name) self.ProjectTree.SetItemText(root, item_name) - self.ProjectTree.SetPyData(root, infos["type"]) + self.ProjectTree.SetPyData(root, infos) highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK)) self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0]) self.ProjectTree.SetItemTextColour(root, highlight_colours[1]) if infos["type"] == ITEM_POU: self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])]) - else: + elif infos.has_key("icon") and infos["icon"] is not None: + icon_path = infos["icon"] + if not self.TreeImageDict.has_key(icon_path): + self.TreeImageDict[icon_path] = self.TreeImageList.Add(wx.Bitmap(icon_path)) + self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_path]) + elif self.TreeImageDict.has_key(infos["type"]): self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]]) - + if wx.VERSION >= (2, 6, 0): item, root_cookie = self.ProjectTree.GetFirstChild(root) else: @@ -1634,7 +1643,8 @@ else: item, root_cookie = self.ProjectTree.GetFirstChild(root, 0) while item.IsOk() and not found: - if (self.ProjectTree.GetItemText(item), self.ProjectTree.GetPyData(item)) == items[0]: + item_infos = self.ProjectTree.GetPyData(item) + if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]: if len(items) == 1: self.SelectedItem = item self.ProjectTree.SelectItem(item) @@ -1650,7 +1660,7 @@ def OnProjectTreeBeginDrag(self, event): if wx.Platform == '__WXMSW__': self.SelectedItem = event.GetItem() - if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem) == ITEM_POU: + if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem)["type"] == ITEM_POU: block_name = self.ProjectTree.GetItemText(self.SelectedItem) block_type = self.Controler.GetPouType(block_name) if block_type != "program": @@ -1662,7 +1672,7 @@ def OnProjectTreeItemBeginEdit(self, event): selected = event.GetItem() - if self.ProjectTree.GetPyData(selected) in ITEMS_UNEDITABLE: + if self.ProjectTree.GetPyData(selected)["type"] in ITEMS_UNEDITABLE: event.Veto() else: event.Skip() @@ -1679,10 +1689,10 @@ else: item = event.GetItem() old_name = self.ProjectTree.GetItemText(item) - itemtype = self.ProjectTree.GetPyData(item) - if itemtype == ITEM_PROJECT: + item_infos = self.ProjectTree.GetPyData(item) + if item_infos["type"] == ITEM_PROJECT: self.Controler.SetProjectProperties(name = new_name) - elif itemtype == ITEM_DATATYPE: + elif item_infos["type"] == ITEM_DATATYPE: if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]: message = _("\"%s\" data type already exists!")%new_name abort = True @@ -1691,7 +1701,7 @@ self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), self.Controler.ComputeDataTypeName(new_name)) self.RefreshPageTitles() - elif itemtype == ITEM_POU: + elif item_infos["type"] == ITEM_POU: if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]: message = _("\"%s\" pou already exists!")%new_name abort = True @@ -1706,29 +1716,29 @@ self.Controler.ComputePouName(new_name)) self.RefreshLibraryPanel() self.RefreshPageTitles() - elif itemtype == ITEM_TRANSITION: - pou_name = GetParentName(self.ProjectTree, item, ITEM_POU) + elif item_infos["type"] == ITEM_TRANSITION: if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: message = _("A POU named \"%s\" already exists!")%new_name elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: message = _("A variable with \"%s\" as name already exists in this pou!")%new_name else: - self.Controler.ChangePouTransitionName(pou_name, old_name, new_name) - self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), - self.Controler.ComputePouTransitionName(pou_name, new_name)) + words = item_infos["tagname"].split("::") + self.Controler.ChangePouTransitionName(words[1], old_name, new_name) + self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), + self.Controler.ComputePouTransitionName(words[1], new_name)) self.RefreshPageTitles() - elif itemtype == ITEM_ACTION: - pou_name = GetParentName(self.ProjectTree, item, ITEM_POU) + elif item_infos["type"] == ITEM_ACTION: if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]: message = _("A POU named \"%s\" already exists!")%new_name elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]: message = _("A variable with \"%s\" as name already exists in this pou!")%new_name else: - self.Controler.ChangePouActionName(pou_name, old_name, new_name) - self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), - self.Controler.ComputePouActionName(pou_name, new_name)) + words = item_infos["tagname"].split("::") + self.Controler.ChangePouActionName(words[1], old_name, new_name) + self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), + self.Controler.ComputePouActionName(words[1], new_name)) self.RefreshPageTitles() - elif itemtype == ITEM_CONFIGURATION: + elif item_infos["type"] == ITEM_CONFIGURATION: if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]: message = _("\"%s\" config already exists!")%new_name abort = True @@ -1747,8 +1757,7 @@ self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), self.Controler.ComputeConfigurationName(new_name)) self.RefreshPageTitles() - elif itemtype == ITEM_RESOURCE: - config_name = GetParentName(self.ProjectTree, item, ITEM_CONFIGURATION) + elif item_infos["type"] == ITEM_RESOURCE: if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]: message = _("\"%s\" config already exists!")%new_name abort = True @@ -1763,9 +1772,10 @@ abort = True messageDialog.Destroy() if not abort: - self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name) - self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(config_name, old_name), - self.Controler.ComputeConfigurationResourceName(config_name, new_name)) + words = item_infos["tagname"].split("::") + self.Controler.ChangeConfigurationResourceName(words[1], old_name, new_name) + self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(words[1], old_name), + self.Controler.ComputeConfigurationResourceName(words[1], new_name)) self.RefreshPageTitles() if message or abort: if message: @@ -1782,49 +1792,23 @@ def OnProjectTreeItemActivated(self, event): selected = event.GetItem() name = self.ProjectTree.GetItemText(selected) - data = self.ProjectTree.GetPyData(selected) - if data == ITEM_PROJECT: + item_infos = self.ProjectTree.GetPyData(selected) + if item_infos["type"] == ITEM_PROJECT: self.EditProjectSettings() - elif data == ITEM_DATATYPE: - self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name)) - elif data == ITEM_POU: - self.EditProjectElement(data, self.Controler.ComputePouName(name)) - elif data == ITEM_CONFIGURATION: - self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name)) - elif data == ITEM_RESOURCE: - config_name = GetParentName(self.ProjectTree, selected, ITEM_CONFIGURATION) - self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name)) - elif data in [ITEM_TRANSITION, ITEM_ACTION]: - pou_name = GetParentName(self.ProjectTree, selected, ITEM_POU) - if data == ITEM_TRANSITION: - tagname = self.Controler.ComputePouTransitionName(pou_name, name) - elif data == ITEM_ACTION: - tagname = self.Controler.ComputePouActionName(pou_name, name) - self.EditProjectElement(data, tagname) + elif item_infos["type"] in [ITEM_DATATYPE, ITEM_POU, + ITEM_CONFIGURATION, ITEM_RESOURCE, + ITEM_TRANSITION, ITEM_ACTION]: + self.EditProjectElement(item_infos["type"], item_infos["tagname"]) event.Skip() def ProjectTreeItemSelect(self, select_item): name = self.ProjectTree.GetItemText(select_item) - data = self.ProjectTree.GetPyData(select_item) - tagname = None - if data == ITEM_DATATYPE: - tagname = self.Controler.ComputeDataTypeName(name) - elif data == ITEM_POU: - tagname = self.Controler.ComputePouName(name) - elif data == ITEM_CONFIGURATION: - tagname = self.Controler.ComputeConfigurationName(name) - elif data == ITEM_RESOURCE: - config_name = GetParentName(self.ProjectTree, select_item, ITEM_CONFIGURATION) - tagname = self.Controler.ComputeConfigurationResourceName(config_name, name) - elif data in [ITEM_TRANSITION, ITEM_ACTION]: - pou_name = GetParentName(self.ProjectTree, select_item, ITEM_POU) - if data == ITEM_TRANSITION: - tagname = self.Controler.ComputePouTransitionName(pou_name, name) - elif data == ITEM_ACTION: - tagname = self.Controler.ComputePouActionName(pou_name, name) - if tagname is not None: - self.EditProjectElement(data, tagname, True) - self.PouInstanceVariablesPanel.SetPouType(tagname) + item_infos = self.ProjectTree.GetPyData(select_item) + if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU, + ITEM_CONFIGURATION, ITEM_RESOURCE, + ITEM_TRANSITION, ITEM_ACTION]: + self.EditProjectElement(item_infos["type"], item_infos["tagname"], True) + self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"]) def OnProjectTreeLeftUp(self, event): if self.SelectedItem is not None: @@ -1838,7 +1822,7 @@ event.Skip() def OnProjectTreeItemChanging(self, event): - if self.ProjectTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None: + if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None: self.SelectedItem = event.GetItem() event.Veto() else: @@ -1925,10 +1909,10 @@ self.ProjectTree.SelectItem(item) self.ProjectTreeItemSelect(item) name = self.ProjectTree.GetItemText(item) - type = self.ProjectTree.GetPyData(item) + item_infos = self.ProjectTree.GetPyData(item) menu = None - if type in ITEMS_UNEDITABLE: + if item_infos["type"] in ITEMS_UNEDITABLE: name = UNEDITABLE_NAMES_DICT[name] if name == "Data Types": @@ -1960,11 +1944,11 @@ menu = wx.Menu(title='') new_id = wx.NewId() AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition")) - parent = self.ProjectTree.GetItemParent(item) + parent = self.ProjectTree.GetItemParent(item)["type"] parent_type = self.ProjectTree.GetPyData(parent) while parent_type != ITEM_POU: parent = self.ProjectTree.GetItemParent(parent) - parent_type = self.ProjectTree.GetPyData(parent) + parent_type = self.ProjectTree.GetPyData(parent)["type"] self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id) elif name == "Actions": @@ -1972,10 +1956,10 @@ new_id = wx.NewId() AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action")) parent = self.ProjectTree.GetItemParent(item) - parent_type = self.ProjectTree.GetPyData(parent) + parent_type = self.ProjectTree.GetPyData(parent)["type"] while parent_type != ITEM_POU: parent = self.ProjectTree.GetItemParent(parent) - parent_type = self.ProjectTree.GetPyData(parent) + parent_type = self.ProjectTree.GetPyData(parent)["type"] self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id) elif name == "Resources": @@ -1983,14 +1967,18 @@ new_id = wx.NewId() AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource")) parent = self.ProjectTree.GetItemParent(item) - parent_type = self.ProjectTree.GetPyData(parent) - while parent_type != ITEM_CONFIGURATION: + parent_type = self.ProjectTree.GetPyData(parent)["type"] + while parent_type not in [ITEM_CONFIGURATION, ITEM_PROJECT]: parent = self.ProjectTree.GetItemParent(parent) - parent_type = self.ProjectTree.GetPyData(parent) - self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.ProjectTree.GetItemText(parent)), id=new_id) + parent_type = self.ProjectTree.GetPyData(parent)["type"] + if parent_type == ITEM_PROJECT: + parent_name = None + else: + parent_name = self.ProjectTree.GetItemText(parent) + self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id) else: - if type == ITEM_POU: + if item_infos["type"] == ITEM_POU: menu = wx.Menu(title='') if self.Controler.GetPouBodyType(name) == "SFC": new_id = wx.NewId() @@ -2020,13 +2008,13 @@ AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename")) self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id) - elif type == ITEM_CONFIGURATION: + 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) - elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]: + elif item_infos["type"] in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]: menu = wx.Menu(title='') if menu is not None: @@ -2129,7 +2117,7 @@ for idx in idxs: editor = self.TabsOpened.GetPage(idx) if editor.IsDebugging(): - instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath()) + instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath(), self.EnableDebug) if instance_infos is None: self.TabsOpened.DeletePage(idx) elif isinstance(editor, GraphicViewer): @@ -2141,6 +2129,7 @@ def AddDebugVariable(self, iec_path, force=False): if self.EnableDebug: self.DebugVariablePanel.InsertValue(iec_path, force=force) + self.EnsureTabVisible(self.DebugVariablePanel) #------------------------------------------------------------------------------- # Library Panel Management Function @@ -2441,7 +2430,7 @@ def GenerateChangePouTypeFunction(self, name, new_type): def OnChangePouTypeMenu(event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: + if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: self.Controler.ProjectChangePouType(name, new_type) self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE) return OnChangePouTypeMenu @@ -2479,7 +2468,7 @@ def OnRemoveDataTypeMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_DATATYPE: + if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE: name = self.ProjectTree.GetItemText(selected) if not self.Controler.DataTypeIsUsed(name): self.Controler.ProjectRemoveDataType(name) @@ -2493,12 +2482,12 @@ def OnRenamePouMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: + if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: wx.CallAfter(self.ProjectTree.EditLabel, selected) def OnRemovePouMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: + if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: name = self.ProjectTree.GetItemText(selected) if not self.Controler.PouIsUsed(name): self.Controler.ProjectRemovePou(name) @@ -2512,14 +2501,10 @@ def OnRemoveTransitionMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_TRANSITION: + item_infos = self.ProjectTree.GetPyData(selected) + if item_infos["type"] == ITEM_TRANSITION: transition = self.ProjectTree.GetItemText(selected) - item = self.ProjectTree.GetItemParent(selected) - item_type = self.ProjectTree.GetPyData(item) - while item_type != ITEM_POU: - item = self.ProjectTree.GetItemParent(item) - item_type = self.ProjectTree.GetPyData(item) - pou_name = self.ProjectTree.GetItemText(item) + pou_name = item_infos["tagname"].split("::")[1] self.Controler.ProjectRemovePouTransition(pou_name, transition) tagname = self.Controler.ComputePouTransitionName(pou_name, transition) idx = self.IsOpened(tagname) @@ -2529,14 +2514,10 @@ def OnRemoveActionMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_ACTION: + item_infos = self.ProjectTree.GetPyData(selected) + if item_infos["type"] == ITEM_ACTION: action = self.ProjectTree.GetItemText(selected) - item = self.ProjectTree.GetItemParent(selected) - item_type = self.ProjectTree.GetPyData(item) - while item_type != ITEM_POU: - item = self.ProjectTree.GetItemParent(item) - item_type = self.ProjectTree.GetPyData(item) - pou_name = self.ProjectTree.GetItemText(item) + pou_name = item_infos["tagname"].split("::")[1] self.Controler.ProjectRemovePouAction(pou_name, action) tagname = self.Controler.ComputePouActionName(pou_name, action) idx = self.IsOpened(tagname) @@ -2546,7 +2527,7 @@ def OnRemoveConfigurationMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: + if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFIGURATION: name = self.ProjectTree.GetItemText(selected) self.Controler.ProjectRemoveConfiguration(name) tagname = self.Controler.ComputeConfigurationName(name) @@ -2557,14 +2538,10 @@ def OnRemoveResourceMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_RESOURCE: + item_infos = self.ProjectTree.GetPyData(selected) + if item_infos["type"] == ITEM_RESOURCE: resource = self.ProjectTree.GetItemText(selected) - item = self.ProjectTree.GetItemParent(selected) - item_type = self.ProjectTree.GetPyData(item) - while item_type != ITEM_CONFIGURATION: - item = self.ProjectTree.GetItemParent(item) - item_type = self.ProjectTree.GetPyData(item) - config_name = self.ProjectTree.GetItemText(item) + config_name = item_infos["tagname"].split("::")[1] self.Controler.ProjectRemoveConfigurationResource(config_name, resource) tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected) idx = self.IsOpened(tagname) @@ -2711,11 +2688,13 @@ # Open the filepath if defined if fileOpen is not None and os.path.isfile(fileOpen): # Create a new controller - self.Controler = PLCControler() - result = self.Controler.OpenXMLFile(fileOpen) + controler = PLCControler() + result = controler.OpenXMLFile(fileOpen) if result is None: - self.LibraryPanel.SetControler(self.Controler) - self.PouInstanceVariablesPanel.SetController(self.Controler) + self.Controler = controler + self.LibraryPanel.SetControler(controler) + self.ProjectTree.Enable(True) + self.PouInstanceVariablesPanel.SetController(controler) self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) # Define PLCOpenEditor icon @@ -2826,11 +2805,13 @@ filepath = dialog.GetPath() if os.path.isfile(filepath): self.ResetView() - self.Controler = PLCControler() - result = self.Controler.OpenXMLFile(filepath) + controler = PLCControler() + result = controler.OpenXMLFile(filepath) if result is None: - self.LibraryPanel.SetControler(self.Controler) - self.PouInstanceVariablesPanel.SetController(self.Controler) + self.Controler = controler + self.LibraryPanel.SetControler(controler) + self.ProjectTree.Enable(True) + self.PouInstanceVariablesPanel.SetController(controler) self.LoadProjectOrganization() self._Refresh(PROJECTTREE, LIBRARYTREE) self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) @@ -4254,11 +4235,12 @@ items = [(idx, item) for idx, item in enumerate(self.Table.GetData())] items.reverse() for idx, item in items: - if self.GetDataType(item.GetVariable().upper()) is None: + iec_path = item.GetVariable().upper() + if self.GetDataType(iec_path) is None: self.RemoveDataConsumer(item) self.Table.RemoveItem(idx) else: - self.AddDataConsumer(iec_path.upper(), item) + self.AddDataConsumer(iec_path, item) self.Freeze() self.Table.ResetView(self.VariablesGrid) self.VariablesGrid.RefreshButtons()