15 from PyQt6.QtGui import QAction |
15 from PyQt6.QtGui import QAction |
16 from PyQt6.QtWidgets import QGraphicsScene, QToolBar |
16 from PyQt6.QtWidgets import QGraphicsScene, QToolBar |
17 |
17 |
18 from eric7.EricGui import EricPixmapCache |
18 from eric7.EricGui import EricPixmapCache |
19 from eric7.EricWidgets import EricFileDialog, EricMessageBox |
19 from eric7.EricWidgets import EricFileDialog, EricMessageBox |
|
20 from eric7.EricWidgets.EricApplication import ericApp |
20 from eric7.EricWidgets.EricMainWindow import EricMainWindow |
21 from eric7.EricWidgets.EricMainWindow import EricMainWindow |
|
22 from eric7.RemoteServerInterface import EricServerFileDialog |
|
23 from eric7.SystemUtilities import FileSystemUtilities |
21 |
24 |
22 from .ApplicationDiagramBuilder import ApplicationDiagramBuilder |
25 from .ApplicationDiagramBuilder import ApplicationDiagramBuilder |
23 from .ImportsDiagramBuilder import ImportsDiagramBuilder |
26 from .ImportsDiagramBuilder import ImportsDiagramBuilder |
24 from .PackageDiagramBuilder import PackageDiagramBuilder |
27 from .PackageDiagramBuilder import PackageDiagramBuilder |
25 from .UMLClassDiagramBuilder import UMLClassDiagramBuilder |
28 from .UMLClassDiagramBuilder import UMLClassDiagramBuilder |
84 super().__init__(parent) |
87 super().__init__(parent) |
85 self.setObjectName("UMLDialog") |
88 self.setObjectName("UMLDialog") |
86 |
89 |
87 self.__project = project |
90 self.__project = project |
88 self.__diagramType = diagramType |
91 self.__diagramType = diagramType |
|
92 self.__remotefsInterface = ( |
|
93 ericApp().getObject("EricServer").getServiceInterface("FileSystem") |
|
94 ) |
89 |
95 |
90 self.scene = QGraphicsScene(0.0, 0.0, 800.0, 600.0) |
96 self.scene = QGraphicsScene(0.0, 0.0, 800.0, 600.0) |
91 self.umlView = UMLGraphicsView(self.scene, parent=self) |
97 self.umlView = UMLGraphicsView(self.scene, parent=self) |
92 self.builder = self.__diagramBuilder(self.__diagramType, path, **kwargs) |
98 self.builder = self.__diagramBuilder(self.__diagramType, path, **kwargs) |
93 if self.builder and initBuilder: |
99 if self.builder and initBuilder: |
241 |
247 |
242 @param filename name of the file to write to |
248 @param filename name of the file to write to |
243 @type str |
249 @type str |
244 """ |
250 """ |
245 if not filename: |
251 if not filename: |
246 fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( |
252 if FileSystemUtilities.isRemoteFileName(self.__project.getProjectPath()): |
247 self, |
253 fname, selectedFilter = EricServerFileDialog.getSaveFileNameAndFilter( |
248 self.tr("Save Diagram"), |
254 self, |
249 "", |
255 self.tr("Save Diagram"), |
250 self.tr("Eric Graphics File (*.egj);;All Files (*)"), |
256 self.__project.getProjectPath(), |
251 "", |
257 self.tr("Eric Graphics File (*.egj);;All Files (*)"), |
252 EricFileDialog.DontConfirmOverwrite, |
258 "", |
253 ) |
259 ) |
254 if not fname: |
260 if not fname: |
255 return |
261 return |
256 |
262 |
257 fpath = pathlib.Path(fname) |
263 ext = self.__remotefsInterface.splitext(fname)[1] |
258 if not fpath.suffix: |
264 if not ext: |
259 ex = selectedFilter.split("(*")[1].split(")")[0] |
265 ex = selectedFilter.split("(*")[1].split(")")[0] |
260 if ex: |
266 if ex: |
261 fpath = fpath.with_suffix(ex) |
267 fname += ex |
262 if fpath.exists(): |
268 filename = fname |
|
269 fileExists = self.__remotefsInterface.exists(filename) |
|
270 else: |
|
271 fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( |
|
272 self, |
|
273 self.tr("Save Diagram"), |
|
274 self.__project.getProjectPath(), |
|
275 self.tr("Eric Graphics File (*.egj);;All Files (*)"), |
|
276 "", |
|
277 EricFileDialog.DontConfirmOverwrite, |
|
278 ) |
|
279 if not fname: |
|
280 return |
|
281 |
|
282 fpath = pathlib.Path(fname) |
|
283 if not fpath.suffix: |
|
284 ex = selectedFilter.split("(*")[1].split(")")[0] |
|
285 if ex: |
|
286 fpath = fpath.with_suffix(ex) |
|
287 fileExists = fpath.exists() |
|
288 filename = str(fpath) |
|
289 |
|
290 if fileExists: |
263 res = EricMessageBox.yesNo( |
291 res = EricMessageBox.yesNo( |
264 self, |
292 self, |
265 self.tr("Save Diagram"), |
293 self.tr("Save Diagram"), |
266 self.tr( |
294 self.tr( |
267 "<p>The file <b>{0}</b> already exists. Overwrite it?</p>" |
295 "<p>The file <b>{0}</b> exists already. Overwrite it?</p>" |
268 ).format(fpath), |
296 ).format(filename), |
269 icon=EricMessageBox.Warning, |
297 icon=EricMessageBox.Warning, |
270 ) |
298 ) |
271 if not res: |
299 if not res: |
272 return |
300 return |
273 filename = str(fpath) |
301 ##filename = str(fpath) |
274 |
302 |
275 res = self.__writeJsonGraphicsFile(filename) |
303 res = self.__writeJsonGraphicsFile(filename) |
276 |
304 |
277 if res: |
305 if res: |
278 # save the file name only in case of success |
306 # save the file name only in case of success |
287 @type str |
315 @type str |
288 @return flag indicating success |
316 @return flag indicating success |
289 @rtype bool |
317 @rtype bool |
290 """ |
318 """ |
291 if not filename: |
319 if not filename: |
292 filename = EricFileDialog.getOpenFileName( |
320 if FileSystemUtilities.isRemoteFileName(self.__project.getProjectPath()): |
293 self, |
321 filename = EricServerFileDialog.getOpenFileName( |
294 self.tr("Load Diagram"), |
322 self, |
295 "", |
323 self.tr("Load Diagram"), |
296 self.tr("Eric Graphics File (*.egj);;All Files (*)"), |
324 self.__project.getProjectPath(), |
297 ) |
325 self.tr("Eric Graphics File (*.egj);;All Files (*)"), |
|
326 ) |
|
327 else: |
|
328 filename = EricFileDialog.getOpenFileName( |
|
329 self, |
|
330 self.tr("Load Diagram"), |
|
331 self.__project.getProjectPath(), |
|
332 self.tr("Eric Graphics File (*.egj);;All Files (*)"), |
|
333 ) |
298 if not filename: |
334 if not filename: |
299 # Canceled by user |
335 # Canceled by user |
300 return False |
336 return False |
301 |
337 |
302 return self.__readJsonGraphicsFile(filename) |
338 return self.__readJsonGraphicsFile(filename) |
341 "view": self.umlView.toDict(), |
377 "view": self.umlView.toDict(), |
342 } |
378 } |
343 |
379 |
344 try: |
380 try: |
345 jsonString = json.dumps(data, indent=2) |
381 jsonString = json.dumps(data, indent=2) |
346 with open(filename, "w") as f: |
382 if FileSystemUtilities.isRemoteFileName(filename): |
347 f.write(jsonString) |
383 self.__remotefsInterface.writeFile(filename, jsonString.encode("utf-8")) |
|
384 else: |
|
385 with open(filename, "w") as f: |
|
386 f.write(jsonString) |
348 return True |
387 return True |
349 except (OSError, TypeError) as err: |
388 except (OSError, TypeError) as err: |
350 EricMessageBox.critical( |
389 EricMessageBox.critical( |
351 self, |
390 self, |
352 self.tr("Save Diagram"), |
391 self.tr("Save Diagram"), |
366 @type str |
405 @type str |
367 @return flag indicating a successful read |
406 @return flag indicating a successful read |
368 @rtype bool |
407 @rtype bool |
369 """ |
408 """ |
370 try: |
409 try: |
371 with open(filename, "r") as f: |
410 if FileSystemUtilities.isRemoteFileName(filename): |
372 jsonString = f.read() |
411 bdata = self.__remotefsInterface.readFile(filename) |
|
412 jsonString = bdata.decode("utf-8") |
|
413 else: |
|
414 with open(filename, "r") as f: |
|
415 jsonString = f.read() |
373 data = json.loads(jsonString) |
416 data = json.loads(jsonString) |
374 except (OSError, json.JSONDecodeError) as err: |
417 except (OSError, json.JSONDecodeError) as err: |
375 EricMessageBox.critical( |
418 EricMessageBox.critical( |
376 None, |
419 None, |
377 self.tr("Load Diagram"), |
420 self.tr("Load Diagram"), |