eric6/Graphics/UMLDialog.py

changeset 8295
3f5e8b0a338e
parent 8291
3d79b1e5bf3c
child 8400
b3eefd7e58d1
equal deleted inserted replaced
8294:cb4e5bbf3a2c 8295:3f5e8b0a338e
33 33
34 class UMLDialog(E5MainWindow): 34 class UMLDialog(E5MainWindow):
35 """ 35 """
36 Class implementing a dialog showing UML like diagrams. 36 Class implementing a dialog showing UML like diagrams.
37 """ 37 """
38 FileVersions = ("1.0") 38 FileVersions = ("1.0", )
39 JsonFileVersions = ("1.0", )
39 40
40 UMLDialogType2String = { 41 UMLDialogType2String = {
41 UMLDialogType.CLASS_DIAGRAM: 42 UMLDialogType.CLASS_DIAGRAM:
42 QCoreApplication.translate("UMLDialog", "Class Diagram"), 43 QCoreApplication.translate("UMLDialog", "Class Diagram"),
43 UMLDialogType.PACKAGE_DIAGRAM: 44 UMLDialogType.PACKAGE_DIAGRAM:
272 273
273 if res: 274 if res:
274 # save the file name only in case of success 275 # save the file name only in case of success
275 self.__fileName = filename 276 self.__fileName = filename
276 277
277 # TODO: add loading of file in JSON format
278 # TODO: eric7: delete the current one 278 # TODO: eric7: delete the current one
279 def load(self, filename=""): 279 def load(self, filename=""):
280 """ 280 """
281 Public method to load a diagram from a file. 281 Public method to load a diagram from a file.
282 282
288 if not filename: 288 if not filename:
289 filename = E5FileDialog.getOpenFileName( 289 filename = E5FileDialog.getOpenFileName(
290 self, 290 self,
291 self.tr("Load Diagram"), 291 self.tr("Load Diagram"),
292 "", 292 "",
293 self.tr("Eric Graphics File (*.e5g);;All Files (*)")) 293 self.tr("Eric Graphics File (*.egj);;"
294 "Eric Text Graphics File (*.e5g);;"
295 "All Files (*)"))
294 if not filename: 296 if not filename:
295 # Canceled by user 297 # Canceled by user
296 return False 298 return False
297 299
298 if filename.endswith(".e5g"): 300 return (
299 return self.__readLineBasedGraphicsFile(filename) 301 self.__readLineBasedGraphicsFile(filename)
300 else: 302 if filename.endswith(".e5g") else
301 return False 303 # JSON format is the default
304 self.__readJsonGraphicsFile(filename)
305 )
302 306
303 ####################################################################### 307 #######################################################################
304 ## Methods to read and write eric graphics files of the old line 308 ## Methods to read and write eric graphics files of the old line
305 ## based file format. 309 ## based file format.
306 ####################################################################### 310 #######################################################################
490 E5MessageBox.critical( 494 E5MessageBox.critical(
491 self, 495 self,
492 self.tr("Save Diagram"), 496 self.tr("Save Diagram"),
493 self.tr( 497 self.tr(
494 """<p>The file <b>{0}</b> could not be saved.</p>""" 498 """<p>The file <b>{0}</b> could not be saved.</p>"""
495 """<p>Reason: {1}</p>""").format(filename, str(err))) 499 """<p>Reason: {1}</p>""").format(filename, str(err))
496 return False 500 )
501 return False
502
503 def __readJsonGraphicsFile(self, filename):
504 """
505 Private method to read an eric graphics file using the JSON based
506 file format.
507
508 @param filename name of the file to be read
509 @type str
510 @return flag indicating a successful read
511 @rtype bool
512 """
513 try:
514 with open(filename, "r") as f:
515 jsonString = f.read()
516 data = json.loads(jsonString)
517 except (OSError, json.JSONDecodeError) as err:
518 E5MessageBox.critical(
519 None,
520 self.tr("Load Diagram"),
521 self.tr(
522 """<p>The file <b>{0}</b> could not be read.</p>"""
523 """<p>Reason: {1}</p>""").format(filename, str(err))
524 )
525 return False
526
527 try:
528 # step 1: check version
529 if data["version"] in UMLDialog.JsonFileVersions:
530 version = data["version"]
531 else:
532 self.__showInvalidDataMessage(filename)
533 return False
534
535 # step 2: set diagram type
536 try:
537 self.__diagramType = UMLDialogType(data["type"])
538 except ValueError:
539 self.__showInvalidDataMessage(filename)
540 return False
541 self.scene.clear()
542 self.builder = self.__diagramBuilder(self.__diagramType, "")
543
544 # step 3: set scene size
545 self.umlView.setSceneSize(data["width"], data["height"])
546
547 # step 4: extract builder data if available
548 ok, msg = self.builder.fromDict(version, data["builder"])
549 if not ok:
550 if msg:
551 res = E5MessageBox.warning(
552 self,
553 self.tr("Load Diagram"),
554 msg,
555 E5MessageBox.StandardButtons(
556 E5MessageBox.Abort |
557 E5MessageBox.Ignore),
558 E5MessageBox.Abort)
559 if res == E5MessageBox.Abort:
560 return False
561 else:
562 self.umlView.setLayoutActionsEnabled(False)
563 else:
564 self.__showInvalidDataMessage(filename)
565 return False
566
567 # step 5: extract the graphics items
568 ok = self.umlView.fromDict(version, data["view"])
569 if not ok:
570 self.__showInvalidDataMessage(filename)
571 return False
572 except KeyError:
573 self.__showInvalidDataMessage(filename)
574 return False
575
576 # everything worked fine, so remember the file name and set the
577 # window title
578 self.setWindowTitle(self.__getDiagramTitel(self.__diagramType))
579 self.__fileName = filename
580
581 return True

eric ide

mercurial