eric6/MultiProject/MultiProject.py

branch
jsonfiles
changeset 8006
c4110b8b5931
parent 7923
91e843545d9a
child 8049
af58c1d47e5e
--- 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))
         

eric ide

mercurial