--- a/MultiProject/MultiProject.py Sun Mar 03 17:52:36 2019 +0100 +++ b/MultiProject/MultiProject.py Sun Mar 03 17:53:06 2019 +0100 @@ -13,14 +13,15 @@ import shutil from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QFileInfo, QFile, \ - QIODevice, QObject + QIODevice, QObject, QUuid from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import QMenu, QApplication, QDialog, QToolBar from Globals import recentNameMultiProject from E5Gui.E5Action import E5Action, createActionGroup -from E5Gui import E5FileDialog, E5MessageBox +from E5Gui import E5FileDialog, E5MessageBox, E5PathPickerDialog +from E5Gui.E5PathPickerDialog import E5PathPickerModes import UI.PixmapCache @@ -353,6 +354,56 @@ self.projectAdded.emit(project) self.setDirty(True) + def copyProject(self, uid): + """ + Public method to copy the project with given UID on disk. + + @param uid UID of the project to copy + @type str + """ + if uid in self.__projects: + startdir = self.ppath + if not startdir: + startdir = Preferences.getMultiProject("Workspace") + srcProject = self.__projects[uid] + srcProjectDirectory = os.path.dirname(srcProject["file"]) + dstProjectDirectory, ok = E5PathPickerDialog.getPath( + self.parent(), + self.tr("Copy Project"), + self.tr("Enter directory for the new project (must not exist" + " already):"), + mode=E5PathPickerModes.DirectoryMode, + path=srcProjectDirectory, + defaultDirectory=startdir, + ) + if ok and dstProjectDirectory and \ + not os.path.exists(dstProjectDirectory): + try: + shutil.copytree(srcProjectDirectory, dstProjectDirectory) + except shutil.Error: + E5MessageBox.critical( + self.parent(), + self.tr("Copy Project"), + self.tr("<p>The source project <b>{0}</b> could not" + " be copied to its destination <b>{1}</b>." + "</p>").format(srcProjectDirectory, + dstProjectDirectory)) + return + + dstUid = QUuid.createUuid().toString() + dstProject = { + 'name': self.tr("{0} - Copy").format(srcProject["name"]), + 'file': os.path.join(dstProjectDirectory, + os.path.basename(srcProject["file"])), + 'master': False, + 'description': srcProject["description"], + 'category': srcProject["category"], + 'uid': dstUid, + } + self.__projects[dstUid] = dstProject + self.projectAdded.emit(dstProject) + self.setDirty(True) + def changeProjectProperties(self, pro): """ Public method to change the data of a project entry.