--- a/eric6/MultiProject/MultiProject.py Mon Jan 25 14:10:07 2021 +0100 +++ b/eric6/MultiProject/MultiProject.py Mon Jan 25 20:07:51 2021 +0100 @@ -27,6 +27,8 @@ import Preferences import Utilities +from .MultiProjectFile import MultiProjectFile + class MultiProject(QObject): """ @@ -75,6 +77,8 @@ self.__initData() + self.__multiProjectFile = MultiProjectFile(self) + self.recent = [] self.__loadRecent() @@ -217,43 +221,49 @@ def __readMultiProject(self, fn): """ - Private method to read in a multi project (.e4m, .e5m) file. + Private method to read in a multi project (.emj, .e4m, .e5m) file. @param fn filename of the multi project file to be read (string) @return flag indicating success """ - f = QFile(fn) - if f.open(QIODevice.ReadOnly): + if os.path.splitext(fn)[1] == ".emj": + # new JSON based format with E5OverrideCursor(): - from E5XML.MultiProjectReader import MultiProjectReader - reader = MultiProjectReader(f, self) - reader.readXML() - f.close() - if reader.hasError(): - return False + res = self.__multiProjectFile.readFile(fn) else: - E5MessageBox.critical( - self.ui, - self.tr("Read multiproject file"), - self.tr( - "<p>The multiproject file <b>{0}</b> could not be" - " read.</p>").format(fn)) - return False - - self.pfile = os.path.abspath(fn) - self.ppath = os.path.abspath(os.path.dirname(fn)) + # old XML based format + f = QFile(fn) + if f.open(QIODevice.ReadOnly): + with E5OverrideCursor(): + from E5XML.MultiProjectReader import MultiProjectReader + reader = MultiProjectReader(f, self) + reader.readXML() + f.close() + res = not reader.hasError() + else: + E5MessageBox.critical( + self.ui, + self.tr("Read Multi Project File"), + self.tr( + "<p>The multi project file <b>{0}</b> could not be" + " read.</p>").format(fn)) + res = False - self.__extractCategories() - - # insert filename into list of recently opened multi projects - self.__syncRecent() + if res: + self.pfile = os.path.abspath(fn) + self.ppath = os.path.abspath(os.path.dirname(fn)) + + self.__extractCategories() + + # insert filename into list of recently opened multi projects + self.__syncRecent() + + self.name = os.path.splitext(os.path.basename(fn))[0] + + # check, if the files of the multi project still exist + self.__checkFilesExist() - self.name = os.path.splitext(os.path.basename(fn))[0] - - # check, if the files of the multi project still exist - self.__checkFilesExist() - - return True + return res def __writeMultiProject(self, fn=None): """ @@ -269,22 +279,27 @@ if fn is None: fn = self.pfile - f = QFile(fn) - if f.open(QIODevice.WriteOnly): - from E5XML.MultiProjectWriter import MultiProjectWriter - MultiProjectWriter( - f, - self, os.path.splitext(os.path.basename(fn))[0] - ).writeXML() - res = True + if os.path.splitext(fn)[1] == ".emj": + # new JSON based format + res = self.__multiProjectFile.writeFile(fn) else: - E5MessageBox.critical( - self.ui, - self.tr("Save multiproject file"), - self.tr( - "<p>The multiproject file <b>{0}</b> could not be " - "written.</p>").format(fn)) - res = False + # old XML based format + f = QFile(fn) + if f.open(QIODevice.WriteOnly): + from E5XML.MultiProjectWriter import MultiProjectWriter + MultiProjectWriter( + f, + self, os.path.splitext(os.path.basename(fn))[0] + ).writeXML() + res = True + else: + E5MessageBox.critical( + self.ui, + self.tr("Save Multi Project File"), + self.tr( + "<p>The multi project file <b>{0}</b> could not be " + "written.</p>").format(fn)) + res = False if res: self.pfile = os.path.abspath(fn) @@ -531,9 +546,11 @@ Public slot to open a multi project. @param fn optional filename of the multi project file to be - read (string) + read + @type str @param openMaster flag indicating, that the master project - should be opened depending on the configuration (boolean) + should be opened depending on the configuration + @rtype bool """ if not self.checkDirty(): return @@ -541,10 +558,11 @@ if fn is None: fn = E5FileDialog.getOpenFileName( self.parent(), - self.tr("Open multiproject"), + self.tr("Open Multi Project"), Preferences.getMultiProject("Workspace") or Utilities.getHomeDir(), - self.tr("Multiproject Files (*.e5m *.e4m)")) + self.tr("Multi Project Files (*.emj);;" + "XML Multi Project Files (*.e5m *.e4m)")) if fn == "": fn = None @@ -572,12 +590,15 @@ """ Public slot to save the current multi project. - @return flag indicating success (boolean) + @return flag indicating success + @rtype bool """ if self.isDirty(): if len(self.pfile) > 0: - if self.pfile.endswith(".e4m"): - self.pfile = self.pfile.replace(".e4m", ".e5m") + if self.pfile.endswith((".e4m", ".e5m")): + self.pfile = (self.pfile + .replace(".e4m", ".emj") + .replace(".e5m", ".emj")) self.__syncRecent() ok = self.__writeMultiProject() else: @@ -590,9 +611,10 @@ """ Public slot to save the current multi project to a different file. - @return flag indicating success (boolean) + @return flag indicating success + @rtype bool """ - defaultFilter = self.tr("Multiproject Files (*.e5m)") + defaultFilter = self.tr("Multi Project Files (*.emj)") if self.ppath: defaultPath = self.ppath else: @@ -604,7 +626,8 @@ self.parent(), self.tr("Save multiproject as"), defaultPath, - self.tr("Multiproject Files (*.e5m)"), + self.tr("Multi Project Files (*.emj);;" + "XML Multi Project Files (*.e5m)"), defaultFilter, E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))