Thu, 07 Jul 2022 11:23:56 +0200
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
8881
54e42bc2437a
Updated copyright for 2022.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8358
diff
changeset
|
3 | # Copyright (c) 2007 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | """ |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | Module implementing a dialog showing an imports diagram of the application. |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | """ |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | |
8943
23f9c7b9e18e
Implemented some performance improvements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8881
diff
changeset
|
10 | import glob |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11 | import os |
8943
23f9c7b9e18e
Implemented some performance improvements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8881
diff
changeset
|
12 | import time |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | |
8318
962bce857696
Replaced all imports of PyQt5 to PyQt6 and started to replace code using obsoleted methods and adapt to the PyQt6 enum usage.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
14 | from PyQt6.QtWidgets import QApplication, QInputDialog |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | |
8358
144a6b854f70
Sorted the eric specific extensions into packages named like the corresponding PyQt packages (i.e. EricCore,EricGui and EricWidgets).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8356
diff
changeset
|
16 | from EricWidgets import EricMessageBox |
144a6b854f70
Sorted the eric specific extensions into packages named like the corresponding PyQt packages (i.e. EricCore,EricGui and EricWidgets).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8356
diff
changeset
|
17 | from EricWidgets.EricProgressDialog import EricProgressDialog |
2034
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
18 | |
2031
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
19 | from .UMLDiagramBuilder import UMLDiagramBuilder |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21 | import Utilities |
1845
d481279d882b
Fixed an issue parsing sources in the various UML like diagrams.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1509
diff
changeset
|
22 | import Preferences |
d481279d882b
Fixed an issue parsing sources in the various UML like diagrams.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1509
diff
changeset
|
23 | |
945
8cd4d08fa9f6
Made code mostly PEP 8 compliant (except all whitespace and line length).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
791
diff
changeset
|
24 | |
2031
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
25 | class ApplicationDiagramBuilder(UMLDiagramBuilder): |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | """ |
2031
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
27 | Class implementing a builder for imports diagrams of the application. |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | """ |
2031
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
29 | def __init__(self, dialog, view, project, noModules=False): |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | """ |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | Constructor |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | |
8287
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
33 | @param dialog reference to the UML dialog |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
34 | @type UMLDialog |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
35 | @param view reference to the view object |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
36 | @type UMLGraphicsView |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
37 | @param project reference to the project object |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
38 | @type Project |
7900
72b88fb20261
Corrected the use of '@keyparam' in the source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7780
diff
changeset
|
39 | @param noModules flag indicating, that no module names should be |
8287
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
40 | shown |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
41 | @type bool |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | """ |
8218
7c09585bd960
Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8205
diff
changeset
|
43 | super().__init__(dialog, view, project) |
2031
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
44 | self.setObjectName("ApplicationDiagram") |
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
45 | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | self.noModules = noModules |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
48 | self.umlView.setDiagramName( |
3190
a9a94491c4fd
Changed the code to use QObject.tr() instead of QObject.trUtf8().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3160
diff
changeset
|
49 | self.tr("Application Diagram {0}").format( |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
50 | self.project.getProjectName())) |
2030
db11a2fe9bbc
Implemented functions to save the UML graphics to disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2027
diff
changeset
|
51 | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52 | def __buildModulesDict(self): |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | """ |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
54 | Private method to build a dictionary of modules contained in the |
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
55 | application. |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | |
8287
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
57 | @return dictionary of modules contained in the application |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
58 | @rtype dict |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59 | """ |
2402
304fcefd3b04
Continued implementing the delayed import.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2401
diff
changeset
|
60 | import Utilities.ModuleParser |
7254
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
61 | extensions = ( |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
62 | Preferences.getPython("Python3Extensions") + |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
63 | ['.rb'] |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
64 | ) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | moduleDict = {} |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | mods = self.project.pdata["SOURCES"] |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | modules = [] |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | for module in mods: |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
69 | modules.append(Utilities.normabsjoinpath( |
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
70 | self.project.ppath, module)) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | tot = len(modules) |
8356
68ec9c3d4de5
Renamed the modules and classes of the E5Gui package to have the prefix 'Eric' instead of 'E5'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8348
diff
changeset
|
72 | progress = EricProgressDialog( |
3190
a9a94491c4fd
Changed the code to use QObject.tr() instead of QObject.trUtf8().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3160
diff
changeset
|
73 | self.tr("Parsing modules..."), |
a9a94491c4fd
Changed the code to use QObject.tr() instead of QObject.trUtf8().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3160
diff
changeset
|
74 | None, 0, tot, self.tr("%v/%m Modules"), self.parent()) |
3478
beec1d9c1851
Correct window titles of progress dialogs.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3190
diff
changeset
|
75 | progress.setWindowTitle(self.tr("Application Diagram")) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | try: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | progress.show() |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | QApplication.processEvents() |
2401
4f428de32b69
Continued implementing the delayed import.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2334
diff
changeset
|
79 | |
8943
23f9c7b9e18e
Implemented some performance improvements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8881
diff
changeset
|
80 | now = time.monotonic() |
8220
006ee31b4835
Applied some more code simplifications suggested by the new Simplify checker (Y113: use enumerate()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8218
diff
changeset
|
81 | for prog, module in enumerate(modules): |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | progress.setValue(prog) |
8943
23f9c7b9e18e
Implemented some performance improvements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8881
diff
changeset
|
83 | if time.monotonic() - now > 0.01: |
23f9c7b9e18e
Implemented some performance improvements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8881
diff
changeset
|
84 | QApplication.processEvents() |
23f9c7b9e18e
Implemented some performance improvements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8881
diff
changeset
|
85 | now = time.monotonic() |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | if module.endswith("__init__.py"): |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | continue |
945
8cd4d08fa9f6
Made code mostly PEP 8 compliant (except all whitespace and line length).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
791
diff
changeset
|
88 | try: |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
89 | mod = Utilities.ModuleParser.readModule( |
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
90 | module, extensions=extensions, caching=False) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | except ImportError: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | continue |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | else: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | name = mod.name |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | moduleDict[name] = mod |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | finally: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | progress.setValue(tot) |
2334
fc69ad77e18a
Introduced a zoom widget in the status bar of several windows.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2302
diff
changeset
|
98 | progress.deleteLater() |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | return moduleDict |
8286 | 100 | |
101 | def __findApplicationRoot(self): | |
102 | """ | |
103 | Private method to find the application root path. | |
104 | ||
105 | @return application root path | |
106 | @rtype str | |
107 | """ | |
108 | candidates = [] | |
109 | path = self.project.getProjectPath() | |
110 | init = os.path.join(path, "__init__.py") | |
111 | if os.path.exists(init): | |
112 | # project is a package | |
113 | return path | |
114 | else: | |
9209
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
115 | # check, if any of the top directories is a package |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
116 | for entry in [e for e in os.listdir(path) if not e.startswith(".")]: |
8286 | 117 | fullpath = os.path.join(path, entry) |
118 | if os.path.isdir(fullpath): | |
119 | init = os.path.join(fullpath, "__init__.py") | |
120 | if os.path.exists(init): | |
121 | candidates.append(fullpath) | |
122 | ||
9209
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
123 | # check, if project uses the 'src' layout |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
124 | if os.path.exists(os.path.join(path, "src")): |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
125 | srcPath = os.path.join(path, "src") |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
126 | for entry in [e for e in os.listdir(srcPath) if not e.startswith(".")]: |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
127 | fullpath = os.path.join(srcPath, entry) |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
128 | if os.path.isdir(fullpath): |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
129 | init = os.path.join(fullpath, "__init__.py") |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
130 | if os.path.exists(init): |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
131 | candidates.append(fullpath) |
b99e7fd55fd3
Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8943
diff
changeset
|
132 | |
8286 | 133 | if len(candidates) == 1: |
134 | return candidates[0] | |
135 | elif len(candidates) > 1: | |
136 | root, ok = QInputDialog.getItem( | |
137 | None, | |
138 | self.tr("Application Diagram"), | |
139 | self.tr("Select the application directory:"), | |
140 | sorted(candidates), | |
141 | 0, True) | |
142 | if ok: | |
143 | return root | |
144 | else: | |
8356
68ec9c3d4de5
Renamed the modules and classes of the E5Gui package to have the prefix 'Eric' instead of 'E5'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8348
diff
changeset
|
145 | EricMessageBox.warning( |
8286 | 146 | None, |
147 | self.tr("Application Diagram"), | |
148 | self.tr("""No application package could be detected.""" | |
149 | """ Aborting...""")) | |
150 | return None | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151 | |
2031
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
152 | def buildDiagram(self): |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153 | """ |
2031
c36c2eb62a75
Refactored the UML graphics code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2030
diff
changeset
|
154 | Public method to build the packages shapes of the diagram. |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155 | """ |
8286 | 156 | rpath = self.__findApplicationRoot() |
157 | if rpath is None: | |
158 | # no root path detected | |
159 | return | |
160 | ||
161 | root = os.path.splitdrive(rpath)[1].replace(os.sep, '.')[1:] | |
162 | ||
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163 | packages = {} |
8286 | 164 | self.__shapes = {} |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165 | |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166 | modules = self.__buildModulesDict() |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167 | |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168 | # step 1: build a dictionary of packages |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
169 | for module in sorted(modules.keys()): |
8286 | 170 | if "." in module: |
171 | packageName, moduleName = module.rsplit(".", 1) | |
172 | else: | |
173 | packageName, moduleName = "", module | |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
174 | if packageName in packages: |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
175 | packages[packageName][0].append(moduleName) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176 | else: |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
177 | packages[packageName] = ([moduleName], []) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178 | |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179 | # step 2: assign modules to dictionaries and update import relationship |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
180 | for module in sorted(modules.keys()): |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
181 | package = module.rsplit(".", 1)[0] |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182 | impLst = [] |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
183 | for moduleImport in modules[module].imports: |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
184 | if moduleImport in modules: |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
185 | impLst.append(moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186 | else: |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
187 | if moduleImport.find('.') == -1: |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
188 | n = "{0}.{1}".format(modules[module].package, |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
189 | moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190 | if n in modules: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191 | impLst.append(n) |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192 | else: |
8286 | 193 | n = "{0}.{1}".format(root, moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194 | if n in modules: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195 | impLst.append(n) |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196 | elif n in packages: |
413
3d82e6eb3516
Did some more string format conversions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
248
diff
changeset
|
197 | n = "{0}.<<Dummy>>".format(n) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198 | impLst.append(n) |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199 | else: |
8286 | 200 | n = "{0}.{1}".format(root, moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201 | if n in modules: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202 | impLst.append(n) |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
203 | for moduleImport in list(modules[module].from_imports.keys()): |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
204 | if moduleImport.startswith('.'): |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
205 | dots = len(moduleImport) - len(moduleImport.lstrip('.')) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206 | if dots == 1: |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
207 | moduleImport = moduleImport[1:] |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208 | elif dots > 1: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209 | packagePath = os.path.dirname(modules[module].file) |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210 | hasInit = True |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211 | ppath = packagePath |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212 | while hasInit: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213 | ppath = os.path.dirname(ppath) |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
214 | hasInit = len(glob.glob(os.path.join( |
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
215 | ppath, '__init__.*'))) > 0 |
7254
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
216 | shortPackage = ( |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
217 | packagePath.replace(ppath, '') |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
218 | .replace(os.sep, '.')[1:] |
7254
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
219 | ) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220 | packageList = shortPackage.split('.')[1:] |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221 | packageListLen = len(packageList) |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
222 | moduleImport = '.'.join( |
3034
7ce719013078
Fixed various coding style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3022
diff
changeset
|
223 | packageList[:packageListLen - dots + 1] + |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
224 | [moduleImport[dots:]]) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225 | |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
226 | if moduleImport in modules: |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
227 | impLst.append(moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228 | else: |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
229 | if moduleImport.find('.') == -1: |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
230 | n = "{0}.{1}".format(modules[module].package, |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
231 | moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232 | if n in modules: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233 | impLst.append(n) |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234 | else: |
8286 | 235 | n = "{0}.{1}".format(root, moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236 | if n in modules: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237 | impLst.append(n) |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238 | elif n in packages: |
413
3d82e6eb3516
Did some more string format conversions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
248
diff
changeset
|
239 | n = "{0}.<<Dummy>>".format(n) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240 | impLst.append(n) |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241 | else: |
8286 | 242 | n = "{0}.{1}".format(root, moduleImport) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243 | if n in modules: |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244 | impLst.append(n) |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
245 | for moduleImport in impLst: |
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
246 | impPackage = moduleImport.rsplit(".", 1)[0] |
8286 | 247 | try: |
248 | if ( | |
249 | impPackage not in packages[package][1] and | |
250 | impPackage != package | |
251 | ): | |
252 | packages[package][1].append(impPackage) | |
253 | except KeyError: | |
254 | continue | |
255 | ||
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
256 | for package in sorted(packages.keys()): |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257 | if package: |
8286 | 258 | relPackage = package.replace(root, '') |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259 | if relPackage and relPackage[0] == '.': |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260 | relPackage = relPackage[1:] |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261 | else: |
3190
a9a94491c4fd
Changed the code to use QObject.tr() instead of QObject.trUtf8().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3160
diff
changeset
|
262 | relPackage = self.tr("<<Application>>") |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263 | else: |
3190
a9a94491c4fd
Changed the code to use QObject.tr() instead of QObject.trUtf8().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3160
diff
changeset
|
264 | relPackage = self.tr("<<Others>>") |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
265 | shape = self.__addPackage( |
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
266 | relPackage, packages[package][0], 0.0, 0.0) |
8286 | 267 | self.__shapes[package] = (shape, packages[package][1]) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268 | |
8286 | 269 | # build a list of routes |
270 | nodes = [] | |
271 | routes = [] | |
272 | for module in self.__shapes: | |
273 | nodes.append(module) | |
274 | for rel in self.__shapes[module][1]: | |
275 | route = (module, rel) | |
276 | if route not in routes: | |
277 | routes.append(route) | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
278 | |
8286 | 279 | self.__arrangeNodes(nodes, routes[:]) |
280 | self.__createAssociations(routes) | |
2027
144463496a54
A few fixes for issues with the graphics dialogs.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2026
diff
changeset
|
281 | self.umlView.autoAdjustSceneSize(limit=True) |
8286 | 282 | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
283 | def __addPackage(self, name, modules, x, y): |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
284 | """ |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
285 | Private method to add a package to the diagram. |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
286 | |
8287
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
287 | @param name package name to be shown |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
288 | @type str |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
289 | @param modules list of module names contained in the package |
8287
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
290 | @type list of str |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
291 | @param x x-coordinate |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
292 | @type float |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
293 | @param y y-coordinate |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
294 | @type float |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
295 | @return reference to the package item |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
296 | @rtype PackageItem |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
297 | """ |
2401
4f428de32b69
Continued implementing the delayed import.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2334
diff
changeset
|
298 | from .PackageItem import PackageItem, PackageModel |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
299 | modules.sort() |
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
300 | pm = PackageModel(name, modules) |
7529
2b8a0d8ba12a
UML Diagrams: added support for dark color scheme.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
301 | pw = PackageItem(pm, x, y, noModules=self.noModules, scene=self.scene, |
2b8a0d8ba12a
UML Diagrams: added support for dark color scheme.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
302 | colors=self.umlView.getDrawingColors()) |
2030
db11a2fe9bbc
Implemented functions to save the UML graphics to disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2027
diff
changeset
|
303 | pw.setId(self.umlView.getItemId()) |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
304 | return pw |
8286 | 305 | |
306 | def __arrangeNodes(self, nodes, routes, whiteSpaceFactor=1.2): | |
307 | """ | |
308 | Private method to arrange the shapes on the canvas. | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
309 | |
8286 | 310 | The algorithm is borrowed from Boa Constructor. |
311 | ||
312 | @param nodes list of nodes to arrange | |
313 | @type list of str | |
314 | @param routes list of routes | |
315 | @type list of tuple of (str, str) | |
316 | @param whiteSpaceFactor factor to increase whitespace between | |
317 | items | |
318 | @type float | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
319 | """ |
8286 | 320 | from . import GraphicsUtilities |
321 | generations = GraphicsUtilities.sort(nodes, routes) | |
322 | ||
323 | # calculate width and height of all elements | |
324 | sizes = [] | |
325 | for generation in generations: | |
326 | sizes.append([]) | |
327 | for child in generation: | |
328 | sizes[-1].append( | |
329 | self.__shapes[child][0].sceneBoundingRect()) | |
330 | ||
331 | # calculate total width and total height | |
332 | width = 0 | |
333 | height = 0 | |
334 | widths = [] | |
335 | heights = [] | |
336 | for generation in sizes: | |
337 | currentWidth = 0 | |
338 | currentHeight = 0 | |
339 | ||
340 | for rect in generation: | |
341 | if rect.height() > currentHeight: | |
342 | currentHeight = rect.height() | |
343 | currentWidth += rect.width() | |
344 | ||
345 | # update totals | |
346 | if currentWidth > width: | |
347 | width = currentWidth | |
348 | height += currentHeight | |
349 | ||
350 | # store generation info | |
351 | widths.append(currentWidth) | |
352 | heights.append(currentHeight) | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
353 | |
8286 | 354 | # add in some whitespace |
355 | width *= whiteSpaceFactor | |
356 | height = height * whiteSpaceFactor - 20 | |
357 | verticalWhiteSpace = 40.0 | |
358 | ||
359 | sceneRect = self.umlView.sceneRect() | |
360 | width += 50.0 | |
361 | height += 50.0 | |
362 | swidth = sceneRect.width() if width < sceneRect.width() else width | |
363 | sheight = sceneRect.height() if height < sceneRect.height() else height | |
364 | self.umlView.setSceneSize(swidth, sheight) | |
365 | ||
366 | # distribute each generation across the width and the | |
367 | # generations across height | |
368 | y = 10.0 | |
369 | for currentWidth, currentHeight, generation in ( | |
370 | zip(reversed(widths), reversed(heights), reversed(generations)) | |
371 | ): | |
372 | x = 10.0 | |
373 | # whiteSpace is the space between any two elements | |
374 | whiteSpace = ( | |
375 | (width - currentWidth - 20) / | |
376 | (len(generation) - 1.0 or 2.0) | |
377 | ) | |
378 | for name in generation: | |
379 | shape = self.__shapes[name][0] | |
380 | shape.setPos(x, y) | |
381 | rect = shape.sceneBoundingRect() | |
382 | x = x + rect.width() + whiteSpace | |
383 | y = y + currentHeight + verticalWhiteSpace | |
384 | ||
385 | def __createAssociations(self, routes): | |
386 | """ | |
387 | Private method to generate the associations between the module shapes. | |
388 | ||
389 | @param routes list of associations | |
390 | @type list of tuple of (str, str) | |
0
de9c2efb9d02
Started porting eric4 to Python3
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
391 | """ |
8270
6ba3564b7161
Modernized some more code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8220
diff
changeset
|
392 | from .AssociationItem import AssociationItem, AssociationType |
8286 | 393 | for route in routes: |
394 | assoc = AssociationItem( | |
395 | self.__shapes[route[0]][0], | |
396 | self.__shapes[route[1]][0], | |
397 | AssociationType.IMPORTS, | |
398 | colors=self.umlView.getDrawingColors()) | |
399 | self.scene.addItem(assoc) | |
2033
4b99609f6a87
Some more refactorings to prepare loading graphics diagrams from file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2031
diff
changeset
|
400 | |
2034
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
401 | def parsePersistenceData(self, version, data): |
2033
4b99609f6a87
Some more refactorings to prepare loading graphics diagrams from file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2031
diff
changeset
|
402 | """ |
4b99609f6a87
Some more refactorings to prepare loading graphics diagrams from file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2031
diff
changeset
|
403 | Public method to parse persisted data. |
4b99609f6a87
Some more refactorings to prepare loading graphics diagrams from file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2031
diff
changeset
|
404 | |
8287
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
405 | @param version version of the data |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
406 | @type str |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
407 | @param data persisted data to be parsed |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
408 | @type str |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
409 | @return flag indicating success |
30eb7bc13d63
Changed some source docu string to the new style.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8286
diff
changeset
|
410 | @rtype bool |
2033
4b99609f6a87
Some more refactorings to prepare loading graphics diagrams from file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2031
diff
changeset
|
411 | """ |
2034
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
412 | parts = data.split(", ") |
7254
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
413 | if ( |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
414 | len(parts) != 2 or |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
415 | not parts[0].startswith("project=") or |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
416 | not parts[1].startswith("no_modules=") |
f00d825fbdb3
Continued to resolve code style issue M841.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7229
diff
changeset
|
417 | ): |
2034
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
418 | return False |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
419 | |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
420 | projectFile = parts[0].split("=", 1)[1].strip() |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
421 | if projectFile != self.project.getProjectFile(): |
8356
68ec9c3d4de5
Renamed the modules and classes of the E5Gui package to have the prefix 'Eric' instead of 'E5'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8348
diff
changeset
|
422 | res = EricMessageBox.yesNo( |
3020
542e97d4ecb3
Fixed a bunch of visible indentation issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2992
diff
changeset
|
423 | None, |
3190
a9a94491c4fd
Changed the code to use QObject.tr() instead of QObject.trUtf8().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3160
diff
changeset
|
424 | self.tr("Load Diagram"), |
a9a94491c4fd
Changed the code to use QObject.tr() instead of QObject.trUtf8().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
3160
diff
changeset
|
425 | self.tr( |
2992
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
426 | """<p>The diagram belongs to the project <b>{0}</b>.""" |
dbdf27746da5
Continued to shorten the code lines to max. 79 characters.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2953
diff
changeset
|
427 | """ Shall this project be opened?</p>""").format( |
2034
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
428 | projectFile)) |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
429 | if res: |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
430 | self.project.openProject(projectFile) |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
431 | |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
432 | self.noModules = Utilities.toBool(parts[1].split("=", 1)[1].strip()) |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
433 | |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
434 | self.initialize() |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
435 | |
8de0fc1f7fef
Implemented functions to load UML graphics from disc.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
2033
diff
changeset
|
436 | return True |
8291 | 437 | |
438 | def toDict(self): | |
439 | """ | |
440 | Public method to collect data to be persisted. | |
441 | ||
442 | @return dictionary containing data to be persisted | |
443 | @rtype dict | |
444 | """ | |
445 | return { | |
446 | "project_name": self.project.getProjectName(), | |
447 | "no_modules": self.noModules, | |
448 | } | |
8295 | 449 | |
450 | def fromDict(self, version, data): | |
451 | """ | |
452 | Public method to populate the class with data persisted by 'toDict()'. | |
453 | ||
454 | @param version version of the data | |
455 | @type str | |
456 | @param data dictionary containing the persisted data | |
457 | @type dict | |
458 | @return tuple containing a flag indicating success and an info | |
459 | message in case the diagram belongs to a different project | |
460 | @rtype tuple of (bool, str) | |
461 | """ | |
462 | try: | |
463 | self.noModules = data["no_modules"] | |
464 | ||
465 | if data["project_name"] != self.project.getProjectName(): | |
466 | msg = self.tr( | |
467 | "<p>The diagram belongs to project <b>{0}</b>." | |
468 | " Please open it and try again.</p>" | |
469 | ).format(data["project_name"]) | |
470 | return False, msg | |
471 | except KeyError: | |
472 | return False, "" | |
473 | ||
474 | self.initialize() | |
475 | ||
476 | return True, "" |