MultiProject/MultiProjectBrowser.py

branch
maintenance
changeset 6693
3629d88ae235
parent 6674
f7b68db81452
child 6836
93b8c77502e0
--- a/MultiProject/MultiProjectBrowser.py	Thu Jan 10 14:23:49 2019 +0100
+++ b/MultiProject/MultiProjectBrowser.py	Sat Feb 02 11:12:54 2019 +0100
@@ -9,14 +9,19 @@
 
 from __future__ import unicode_literals
 
+import os
+import glob
+
 from PyQt5.QtCore import Qt
 from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QDialog, QMenu
 
 from E5Gui.E5Application import e5App
+from E5Gui import E5MessageBox
 
 import UI.PixmapCache
 
 
+# TODO: add action to copy a project on disk
 class MultiProjectBrowser(QTreeWidget):
     """
     Class implementing the multi project browser.
@@ -291,6 +296,65 @@
             if uid:
                 self.multiProject.removeProject(uid)
     
+    def __deleteProject(self):
+        """
+        Private method to handle the Delete context menu entry.
+        """
+        itm = self.currentItem()
+        if itm is not None and itm.parent() is not None:
+            projectFile = itm.data(0, MultiProjectBrowser.ProjectFileNameRole)
+            projectPath = os.path.dirname(projectFile)
+            
+            if self.project.getProjectPath() == projectPath:
+                E5MessageBox.warning(
+                    self,
+                    self.tr("Delete Project"),
+                    self.tr("""The current project cannot be deleted."""
+                            """ Please close it first."""))
+            else:
+                projectFiles = glob.glob(os.path.join(projectPath, "*.e4p"))
+                if not projectFiles:
+                    # Oops, that should not happen; play it save
+                    res = False
+                elif len(projectFiles) == 1:
+                    res = E5MessageBox.yesNo(
+                        self,
+                        self.tr("Delete Project"),
+                        self.tr("""<p>Shall the project <b>{0}</b> (Path:"""
+                                """ {1}) really be deleted?</p>""").format(
+                            itm.text(0), projectPath))
+                else:
+                    res = E5MessageBox.yesNo(
+                        self,
+                        self.tr("Delete Project"),
+                        self.tr("""<p>Shall the project <b>{0}</b> (Path:"""
+                                """ {1}) really be deleted?</p>"""
+                                """<p><b>Warning:</b> It contains <b>{2}</b>"""
+                                """ sub-projects.</p>""").format(
+                            itm.text(0), projectPath, len(projectFiles)))
+                if res:
+                    for subprojectFile in projectFiles:
+                        # remove all sub-projects before deleting the directory
+                        if subprojectFile != projectFile:
+                            projectData = {
+                                'name': "",
+                                'file': subprojectFile,
+                                'master': False,
+                                'description': "",
+                                'category': "",
+                                'uid': "",
+                            }
+                            pitm = self.__findProjectItem(projectData)
+                            if pitm:
+                                uid = pitm.data(
+                                    0, MultiProjectBrowser.ProjectUidRole)
+                                if uid:
+                                    self.multiProject.removeProject(uid)
+                        
+                    uid = itm.data(0, MultiProjectBrowser.ProjectUidRole)
+                    if uid:
+                        self.multiProject.deleteProject(uid)
+    
     def __showProjectProperties(self):
         """
         Private method to show the data of a project entry.
@@ -322,7 +386,16 @@
         """
         Private method to add a new project entry.
         """
-        self.multiProject.addNewProject()
+        itm = self.currentItem()
+        if itm is not None:
+            if itm.parent() is None:
+                # current item is a category item
+                category = itm.text(0)
+            else:
+                category = itm.parent().text(0)
+        else:
+            category = ""
+        self.multiProject.addNewProject(category=category)
     
     def __createPopupMenu(self):
         """
@@ -330,7 +403,10 @@
         """
         self.__menu = QMenu(self)
         self.__menu.addAction(self.tr("Open"), self.__openItem)
-        self.__menu.addAction(self.tr("Remove"), self.__removeProject)
+        self.__menu.addAction(self.tr("Remove from Multi Project"),
+                              self.__removeProject)
+        self.__menu.addAction(self.tr("Delete from Disk"),
+                              self.__deleteProject)
         self.__menu.addAction(self.tr("Properties"),
                               self.__showProjectProperties)
         self.__menu.addSeparator()

eric ide

mercurial