--- a/MultiProject/MultiProjectBrowser.py Sat Jan 12 12:40:14 2019 +0100 +++ b/MultiProject/MultiProjectBrowser.py Sat Jan 12 18:25:04 2019 +0100 @@ -9,10 +9,14 @@ 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 @@ -291,6 +295,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. @@ -330,7 +393,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()