10 import contextlib |
10 import contextlib |
11 import os |
11 import os |
12 import pathlib |
12 import pathlib |
13 import shutil |
13 import shutil |
14 |
14 |
15 from PyQt6.QtCore import QFile, QIODevice, QObject, QUuid, pyqtSignal, pyqtSlot |
15 from PyQt6.QtCore import QObject, QUuid, pyqtSignal, pyqtSlot |
16 from PyQt6.QtWidgets import QDialog, QMenu, QToolBar |
16 from PyQt6.QtWidgets import QDialog, QMenu, QToolBar |
17 |
17 |
18 from eric7 import Preferences |
18 from eric7 import Preferences |
19 from eric7.EricGui import EricPixmapCache |
19 from eric7.EricGui import EricPixmapCache |
20 from eric7.EricGui.EricAction import EricAction, createActionGroup |
20 from eric7.EricGui.EricAction import EricAction, createActionGroup |
21 from eric7.EricGui.EricOverrideCursor import EricOverrideCursor |
21 from eric7.EricGui.EricOverrideCursor import EricOverrideCursor |
22 from eric7.EricWidgets import EricFileDialog, EricMessageBox, EricPathPickerDialog |
22 from eric7.EricWidgets import EricFileDialog, EricMessageBox, EricPathPickerDialog |
23 from eric7.EricWidgets.EricPathPickerDialog import EricPathPickerModes |
23 from eric7.EricWidgets.EricPathPickerDialog import EricPathPickerModes |
24 from eric7.EricXML.MultiProjectReader import MultiProjectReader |
|
25 from eric7.Globals import recentNameMultiProject |
24 from eric7.Globals import recentNameMultiProject |
26 from eric7.SystemUtilities import FileSystemUtilities, OSUtilities |
25 from eric7.SystemUtilities import FileSystemUtilities, OSUtilities |
27 |
26 |
28 from .MultiProjectFile import MultiProjectFile |
27 from .MultiProjectFile import MultiProjectFile |
29 from .MultiProjectProjectMeta import MultiProjectProjectMeta |
28 from .MultiProjectProjectMeta import MultiProjectProjectMeta |
199 """ |
198 """ |
200 return [c for c in self.categories if c] |
199 return [c for c in self.categories if c] |
201 |
200 |
202 def __readMultiProject(self, fn): |
201 def __readMultiProject(self, fn): |
203 """ |
202 """ |
204 Private method to read in a multi project (.emj, .e4m, .e5m) file. |
203 Private method to read in a multi project (.emj) file. |
205 |
204 |
206 @param fn filename of the multi project file to be read |
205 @param fn filename of the multi project file to be read |
207 @type str |
206 @type str |
208 @return flag indicating success |
207 @return flag indicating success |
209 @rtype bool |
208 @rtype bool |
210 """ |
209 """ |
211 if os.path.splitext(fn)[1] == ".emj": |
210 with EricOverrideCursor(): |
212 # new JSON based format |
211 res = self.__multiProjectFile.readFile(fn) |
213 with EricOverrideCursor(): |
|
214 res = self.__multiProjectFile.readFile(fn) |
|
215 else: |
|
216 # old XML based format |
|
217 f = QFile(fn) |
|
218 if f.open(QIODevice.OpenModeFlag.ReadOnly): |
|
219 with EricOverrideCursor(): |
|
220 reader = MultiProjectReader(f, self) |
|
221 reader.readXML() |
|
222 f.close() |
|
223 res = not reader.hasError() |
|
224 else: |
|
225 EricMessageBox.critical( |
|
226 self.ui, |
|
227 self.tr("Read Multi Project File"), |
|
228 self.tr( |
|
229 "<p>The multi project file <b>{0}</b> could not be read.</p>" |
|
230 ).format(fn), |
|
231 ) |
|
232 res = False |
|
233 |
212 |
234 if res: |
213 if res: |
235 self.pfile = os.path.abspath(fn) |
214 self.pfile = os.path.abspath(fn) |
236 self.ppath = os.path.abspath(os.path.dirname(fn)) |
215 self.ppath = os.path.abspath(os.path.dirname(fn)) |
237 |
216 |
517 if fn is None: |
496 if fn is None: |
518 fn = EricFileDialog.getOpenFileName( |
497 fn = EricFileDialog.getOpenFileName( |
519 self.parent(), |
498 self.parent(), |
520 self.tr("Open Multi Project"), |
499 self.tr("Open Multi Project"), |
521 Preferences.getMultiProject("Workspace") or OSUtilities.getHomeDir(), |
500 Preferences.getMultiProject("Workspace") or OSUtilities.getHomeDir(), |
522 self.tr( |
501 self.tr("Multi Project Files (*.emj)"), |
523 "Multi Project Files (*.emj);;" |
|
524 "XML Multi Project Files (*.e5m *.e4m)" |
|
525 ), |
|
526 ) |
502 ) |
527 |
503 |
528 if fn == "": |
504 if fn == "": |
529 fn = None |
505 fn = None |
530 |
506 |
551 @return flag indicating success |
527 @return flag indicating success |
552 @rtype bool |
528 @rtype bool |
553 """ |
529 """ |
554 if self.isDirty(): |
530 if self.isDirty(): |
555 if len(self.pfile) > 0: |
531 if len(self.pfile) > 0: |
556 if self.pfile.endswith((".e4m", ".e5m")): |
|
557 self.pfile = self.pfile.replace(".e4m", ".emj").replace( |
|
558 ".e5m", ".emj" |
|
559 ) |
|
560 self.__syncRecent() |
|
561 ok = self.__writeMultiProject() |
532 ok = self.__writeMultiProject() |
562 else: |
533 else: |
563 ok = self.saveMultiProjectAs() |
534 ok = self.saveMultiProjectAs() |
564 else: |
535 else: |
565 ok = True |
536 ok = True |