eric6/Graphics/UMLDialog.py

changeset 8295
3f5e8b0a338e
parent 8291
3d79b1e5bf3c
child 8400
b3eefd7e58d1
--- a/eric6/Graphics/UMLDialog.py	Thu May 06 19:46:00 2021 +0200
+++ b/eric6/Graphics/UMLDialog.py	Sat May 08 18:34:08 2021 +0200
@@ -35,7 +35,8 @@
     """
     Class implementing a dialog showing UML like diagrams.
     """
-    FileVersions = ("1.0")
+    FileVersions = ("1.0", )
+    JsonFileVersions = ("1.0", )
     
     UMLDialogType2String = {
         UMLDialogType.CLASS_DIAGRAM:
@@ -274,7 +275,6 @@
             # save the file name only in case of success
             self.__fileName = filename
     
-    # TODO: add loading of file in JSON format
     # TODO: eric7: delete the current one
     def load(self, filename=""):
         """
@@ -290,15 +290,19 @@
                 self,
                 self.tr("Load Diagram"),
                 "",
-                self.tr("Eric Graphics File (*.e5g);;All Files (*)"))
+                self.tr("Eric Graphics File (*.egj);;"
+                        "Eric Text Graphics File (*.e5g);;"
+                        "All Files (*)"))
             if not filename:
                 # Canceled by user
                 return False
         
-        if filename.endswith(".e5g"):
-            return self.__readLineBasedGraphicsFile(filename)
-        else:
-            return False
+        return (
+            self.__readLineBasedGraphicsFile(filename)
+            if filename.endswith(".e5g") else
+            # JSON format is the default
+            self.__readJsonGraphicsFile(filename)
+        )
     
     #######################################################################
     ## Methods to read and write eric graphics files of the old line
@@ -492,5 +496,86 @@
                 self.tr("Save Diagram"),
                 self.tr(
                     """<p>The file <b>{0}</b> could not be saved.</p>"""
-                    """<p>Reason: {1}</p>""").format(filename, str(err)))
+                    """<p>Reason: {1}</p>""").format(filename, str(err))
+            )
+            return False
+    
+    def __readJsonGraphicsFile(self, filename):
+        """
+        Private method to read an eric graphics file using the JSON based
+        file format.
+        
+        @param filename name of the file to be read
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            data = json.loads(jsonString)
+        except (OSError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Load Diagram"),
+                self.tr(
+                    """<p>The file <b>{0}</b> could not be read.</p>"""
+                    """<p>Reason: {1}</p>""").format(filename, str(err))
+            )
             return False
+        
+        try:
+            # step 1: check version
+            if data["version"] in UMLDialog.JsonFileVersions:
+                version = data["version"]
+            else:
+                self.__showInvalidDataMessage(filename)
+                return False
+            
+            # step 2: set diagram type
+            try:
+                self.__diagramType = UMLDialogType(data["type"])
+            except ValueError:
+                self.__showInvalidDataMessage(filename)
+                return False
+            self.scene.clear()
+            self.builder = self.__diagramBuilder(self.__diagramType, "")
+            
+            # step 3: set scene size
+            self.umlView.setSceneSize(data["width"], data["height"])
+            
+            # step 4: extract builder data if available
+            ok, msg = self.builder.fromDict(version, data["builder"])
+            if not ok:
+                if msg:
+                    res = E5MessageBox.warning(
+                        self,
+                        self.tr("Load Diagram"),
+                        msg,
+                        E5MessageBox.StandardButtons(
+                            E5MessageBox.Abort |
+                            E5MessageBox.Ignore),
+                        E5MessageBox.Abort)
+                    if res == E5MessageBox.Abort:
+                        return False
+                    else:
+                        self.umlView.setLayoutActionsEnabled(False)
+                else:
+                    self.__showInvalidDataMessage(filename)
+                    return False
+            
+            # step 5: extract the graphics items
+            ok = self.umlView.fromDict(version, data["view"])
+            if not ok:
+                self.__showInvalidDataMessage(filename)
+                return False
+        except KeyError:
+            self.__showInvalidDataMessage(filename)
+            return False
+        
+        # everything worked fine, so remember the file name and set the
+        # window title
+        self.setWindowTitle(self.__getDiagramTitel(self.__diagramType))
+        self.__fileName = filename
+        
+        return True

eric ide

mercurial