--- 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