diff -r 8d888f38bf89 -r da82156f44e9 src/eric7/MultiProject/MultiProjectBrowser.py --- a/src/eric7/MultiProject/MultiProjectBrowser.py Fri Dec 15 14:07:43 2023 +0100 +++ b/src/eric7/MultiProject/MultiProjectBrowser.py Fri Dec 15 15:28:54 2023 +0100 @@ -17,6 +17,8 @@ from eric7.EricWidgets import EricMessageBox from eric7.EricWidgets.EricApplication import ericApp +from .MultiProjectProjectMeta import MultiProjectProjectMeta + class MultiProjectBrowser(QTreeWidget): """ @@ -100,7 +102,8 @@ """ Private slot to handle the addition of a project to the multi project. - @param project reference to the project data dictionary + @param project reference to the project metadata + @type MultiProjectProjectMeta """ self.__addProject(project) self.sortItems(0, Qt.SortOrder.AscendingOrder) @@ -109,7 +112,8 @@ """ Private slot to handle the removal of a project from the multi project. - @param project reference to the project data dictionary + @param project reference to the project metadata + @type MultiProjectProjectMeta """ itm = self.__findProjectItem(project) if itm: @@ -125,12 +129,12 @@ """ Private slot to handle the change of a project of the multi project. - @param project reference to the project data dictionary + @param project reference to the project metadata """ itm = self.__findProjectItem(project) if itm: parent = itm.parent() - if parent.text(0) != project["category"]: + if parent.text(0) != project.category: self.__projectRemoved(project) self.__addProject(project) else: @@ -143,14 +147,11 @@ Private slot to handle the opening of a project. """ projectfile = self.project.getProjectFile() - project = { - "name": "", - "file": projectfile, - "master": False, - "description": "", - "category": "", - "uid": "", - } + project = MultiProjectProjectMeta( + name="", + file=projectfile, + uid="", + ) itm = self.__findProjectItem(project) if itm: font = itm.font(0) @@ -173,19 +174,27 @@ """ Private slot to show the context menu. - @param coord the position of the mouse pointer (QPoint) + @param coord the position of the mouse pointer + @type QPoint """ itm = self.itemAt(coord) if itm is None or itm.parent() is None: + self.__clearRemovedBackAct.setEnabled( + self.multiProject.hasRemovedProjects() + ) self.__backMenu.popup(self.mapToGlobal(coord)) else: + self.__clearRemovedAct.setEnabled( + self.multiProject.hasRemovedProjects() + ) self.__menu.popup(self.mapToGlobal(coord)) def __openItem(self, itm=None): """ Private slot to open a project. - @param itm reference to the project item to be opened (QTreeWidgetItem) + @param itm reference to the project item to be opened + @type QTreeWidgetItem """ if itm is None: itm = self.currentItem() @@ -207,9 +216,11 @@ """ Private method to find the item for a category. - @param category category to search for (string) + @param category category to search for + @type str @return reference to the category item or None, if there is - no such item (QTreeWidgetItem or None) + no such item + @rtype QTreeWidgetItem or None """ if category == "": category = self.tr("Not categorized") @@ -224,12 +235,13 @@ """ Private method to add a project to the list. - @param project reference to the project data dictionary + @param project reference to the project metadata + @type MultiProjectProjectMeta """ - parent = self.__findCategoryItem(project["category"]) + parent = self.__findCategoryItem(project.category) if parent is None: - if project["category"]: - parent = QTreeWidgetItem(self, [project["category"]]) + if project.category: + parent = QTreeWidgetItem(self, [project.category]) else: parent = QTreeWidgetItem(self, [self.tr("Not categorized")]) parent.setExpanded(True) @@ -240,30 +252,40 @@ """ Private method to set the data of a project item. - @param itm reference to the item to be set (QTreeWidgetItem) - @param project reference to the project data dictionary + @param itm reference to the item to be set + @type QTreeWidgetItem + @param project reference to the project metadata + @type MultiProjectProjectMeta """ - itm.setText(0, project["name"]) - if project["master"]: + itm.setText(0, project.name) + if project.master: itm.setIcon(0, EricPixmapCache.getIcon("mainProject")) else: itm.setIcon(0, EricPixmapCache.getIcon("empty")) - itm.setToolTip(0, project["file"]) - itm.setData(0, MultiProjectBrowser.ProjectFileNameRole, project["file"]) - itm.setData(0, MultiProjectBrowser.ProjectUidRole, project["uid"]) + itm.setToolTip(0, project.file) + itm.setData(0, MultiProjectBrowser.ProjectFileNameRole, project.file) + itm.setData(0, MultiProjectBrowser.ProjectUidRole, project.uid) + + if project.removed: + itm.setText(0, self.tr("{0} (removed)").format(itm.text(0))) + font = itm.font(0) + font.setItalic(True) + itm.setFont(0, font) def __findProjectItem(self, project): """ Private method to search a specific project item. - @param project reference to the project data dictionary - @return reference to the item (QTreeWidgetItem) or None + @param project reference to the project metadata + @type MultiProjectProjectMeta + @return reference to the item or None + @rtype QTreeWidgetItem """ - if project["uid"]: - compareData = project["uid"] + if project.uid: + compareData = project.uid compareRole = MultiProjectBrowser.ProjectUidRole else: - compareData = project["file"] + compareData = project.file compareRole = MultiProjectBrowser.ProjectFileNameRole for topIndex in range(self.topLevelItemCount()): @@ -364,28 +386,15 @@ if uid: project = self.multiProject.getProject(uid) if project is not None: + # TODO: change the dialog dlg = AddProjectDialog( self, project=project, categories=self.multiProject.getCategories(), ) if dlg.exec() == QDialog.DialogCode.Accepted: - ( - name, - filename, - isMain, - description, - category, - uid, - ) = dlg.getData() - project = { - "name": name, - "file": filename, - "master": isMain, - "description": description, - "category": category, - "uid": uid, - } + # TODO: move the metadata creation to the dialog + project = dlg.getProjectMetadata() self.multiProject.changeProjectProperties(project) def __addNewProject(self): @@ -429,11 +438,19 @@ self.__menu.addAction(self.tr("Add Project..."), self.__addNewProject) self.__menu.addAction(self.tr("Copy Project..."), self.__copyProject) self.__menu.addSeparator() + self.__clearRemovedAct = self.__menu.addAction( + self.tr("Clear Out"), self.multiProject.clearRemovedProjects + ) + self.__menu.addSeparator() self.__menu.addAction(self.tr("Configure..."), self.__configure) self.__backMenu = QMenu(self) self.__backMenu.addAction(self.tr("Add Project..."), self.__addNewProject) self.__backMenu.addSeparator() + self.__clearRemovedBackAct = self.__backMenu.addAction( + self.tr("Clear Out"), self.multiProject.clearRemovedProjects + ) + self.__backMenu.addSeparator() self.__backMenu.addAction(self.tr("Configure..."), self.__configure) def __configure(self):