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 |