11 |
11 |
12 import os |
12 import os |
13 import shutil |
13 import shutil |
14 |
14 |
15 from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QFileInfo, QFile, \ |
15 from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QFileInfo, QFile, \ |
16 QIODevice, QObject |
16 QIODevice, QObject, QUuid |
17 from PyQt5.QtGui import QCursor |
17 from PyQt5.QtGui import QCursor |
18 from PyQt5.QtWidgets import QMenu, QApplication, QDialog, QToolBar |
18 from PyQt5.QtWidgets import QMenu, QApplication, QDialog, QToolBar |
19 |
19 |
20 from Globals import recentNameMultiProject |
20 from Globals import recentNameMultiProject |
21 |
21 |
22 from E5Gui.E5Action import E5Action, createActionGroup |
22 from E5Gui.E5Action import E5Action, createActionGroup |
23 from E5Gui import E5FileDialog, E5MessageBox |
23 from E5Gui import E5FileDialog, E5MessageBox, E5PathPickerDialog |
|
24 from E5Gui.E5PathPickerDialog import E5PathPickerModes |
24 |
25 |
25 import UI.PixmapCache |
26 import UI.PixmapCache |
26 |
27 |
27 import Preferences |
28 import Preferences |
28 import Utilities |
29 import Utilities |
351 if category not in self.categories: |
352 if category not in self.categories: |
352 self.categories.append(category) |
353 self.categories.append(category) |
353 self.projectAdded.emit(project) |
354 self.projectAdded.emit(project) |
354 self.setDirty(True) |
355 self.setDirty(True) |
355 |
356 |
|
357 def copyProject(self, uid): |
|
358 """ |
|
359 Public method to copy the project with given UID on disk. |
|
360 |
|
361 @param uid UID of the project to copy |
|
362 @type str |
|
363 """ |
|
364 if uid in self.__projects: |
|
365 startdir = self.ppath |
|
366 if not startdir: |
|
367 startdir = Preferences.getMultiProject("Workspace") |
|
368 srcProject = self.__projects[uid] |
|
369 srcProjectDirectory = os.path.dirname(srcProject["file"]) |
|
370 dstProjectDirectory, ok = E5PathPickerDialog.getPath( |
|
371 self.parent(), |
|
372 self.tr("Copy Project"), |
|
373 self.tr("Enter directory for the new project (must not exist" |
|
374 " already):"), |
|
375 mode=E5PathPickerModes.DirectoryMode, |
|
376 path=srcProjectDirectory, |
|
377 defaultDirectory=startdir, |
|
378 ) |
|
379 if ok and dstProjectDirectory and \ |
|
380 not os.path.exists(dstProjectDirectory): |
|
381 try: |
|
382 shutil.copytree(srcProjectDirectory, dstProjectDirectory) |
|
383 except shutil.Error: |
|
384 E5MessageBox.critical( |
|
385 self.parent(), |
|
386 self.tr("Copy Project"), |
|
387 self.tr("<p>The source project <b>{0}</b> could not" |
|
388 " be copied to its destination <b>{1}</b>." |
|
389 "</p>").format(srcProjectDirectory, |
|
390 dstProjectDirectory)) |
|
391 return |
|
392 |
|
393 dstUid = QUuid.createUuid().toString() |
|
394 dstProject = { |
|
395 'name': self.tr("{0} - Copy").format(srcProject["name"]), |
|
396 'file': os.path.join(dstProjectDirectory, |
|
397 os.path.basename(srcProject["file"])), |
|
398 'master': False, |
|
399 'description': srcProject["description"], |
|
400 'category': srcProject["category"], |
|
401 'uid': dstUid, |
|
402 } |
|
403 self.__projects[dstUid] = dstProject |
|
404 self.projectAdded.emit(dstProject) |
|
405 self.setDirty(True) |
|
406 |
356 def changeProjectProperties(self, pro): |
407 def changeProjectProperties(self, pro): |
357 """ |
408 """ |
358 Public method to change the data of a project entry. |
409 Public method to change the data of a project entry. |
359 |
410 |
360 @param pro dictionary with the project data (string) |
411 @param pro dictionary with the project data (string) |