src/eric7/MultiProject/MultiProjectBrowser.py

branch
eric7
changeset 10410
da82156f44e9
parent 9971
773ad1f1ed22
child 10412
883e4bc9bd07
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):

eric ide

mercurial