21 |
21 |
22 import Utilities.ModuleParser |
22 import Utilities.ModuleParser |
23 import Utilities |
23 import Utilities |
24 import Preferences |
24 import Preferences |
25 |
25 |
|
26 |
26 class PackageDiagram(UMLDialog): |
27 class PackageDiagram(UMLDialog): |
27 """ |
28 """ |
28 Class implementing a dialog showing a UML like class diagram of a package. |
29 Class implementing a dialog showing a UML like class diagram of a package. |
29 """ |
30 """ |
30 def __init__(self, package, parent = None, name = None, noAttrs = False): |
31 def __init__(self, package, parent=None, name=None, noAttrs=False): |
31 """ |
32 """ |
32 Constructor |
33 Constructor |
33 |
34 |
34 @param package name of a python package to be shown (string) |
35 @param package name of a python package to be shown (string) |
35 @param parent parent widget of the view (QWidget) |
36 @param parent parent widget of the view (QWidget) |
82 QApplication.processEvents() |
83 QApplication.processEvents() |
83 for module in modules: |
84 for module in modules: |
84 progress.setValue(prog) |
85 progress.setValue(prog) |
85 QApplication.processEvents() |
86 QApplication.processEvents() |
86 prog += 1 |
87 prog += 1 |
87 try: |
88 try: |
88 mod = Utilities.ModuleParser.readModule(module) |
89 mod = Utilities.ModuleParser.readModule(module) |
89 except ImportError: |
90 except ImportError: |
90 continue |
91 continue |
91 else: |
92 else: |
92 name = mod.name |
93 name = mod.name |
158 if className not in nodes: |
159 if className not in nodes: |
159 nodes.append(className) |
160 nodes.append(className) |
160 else: |
161 else: |
161 if className in module.classes: |
162 if className in module.classes: |
162 # this is a local class (defined in this module) |
163 # this is a local class (defined in this module) |
163 self.__addLocalClass(className, module.classes[className], |
164 self.__addLocalClass(className, module.classes[className], |
164 0, 0) |
165 0, 0) |
165 elif className in module.modules: |
166 elif className in module.modules: |
166 # this is a local module (defined in this module) |
167 # this is a local module (defined in this module) |
167 self.__addLocalClass(className, module.modules[className], |
168 self.__addLocalClass(className, module.modules[className], |
168 0, 0, True) |
169 0, 0, True) |
169 else: |
170 else: |
170 self.__addExternalClass(className, 0, 0) |
171 self.__addExternalClass(className, 0, 0) |
171 nodes.append(className) |
172 nodes.append(className) |
172 |
173 |
180 del todo[0] |
181 del todo[0] |
181 |
182 |
182 self.__arrangeClasses(nodes, routes[:]) |
183 self.__arrangeClasses(nodes, routes[:]) |
183 self.__createAssociations(routes) |
184 self.__createAssociations(routes) |
184 |
185 |
185 def __arrangeClasses(self, nodes, routes, whiteSpaceFactor = 1.2): |
186 def __arrangeClasses(self, nodes, routes, whiteSpaceFactor=1.2): |
186 """ |
187 """ |
187 Private method to arrange the shapes on the canvas. |
188 Private method to arrange the shapes on the canvas. |
188 |
189 |
189 The algorithm is borrowed from Boa Constructor. |
190 The algorithm is borrowed from Boa Constructor. |
190 """ |
191 """ |
246 cw.setPos(x, y) |
247 cw.setPos(x, y) |
247 rect = cw.sceneBoundingRect() |
248 rect = cw.sceneBoundingRect() |
248 x = x + rect.width() + whiteSpace |
249 x = x + rect.width() + whiteSpace |
249 y = y + currentHeight + verticalWhiteSpace |
250 y = y + currentHeight + verticalWhiteSpace |
250 |
251 |
251 def __addLocalClass(self, className, _class, x, y, isRbModule = False): |
252 def __addLocalClass(self, className, _class, x, y, isRbModule=False): |
252 """ |
253 """ |
253 Private method to add a class defined in the module. |
254 Private method to add a class defined in the module. |
254 |
255 |
255 @param className name of the class to be as a dictionary key (string) |
256 @param className name of the class to be as a dictionary key (string) |
256 @param _class class to be shown (ModuleParser.Class) |
257 @param _class class to be shown (ModuleParser.Class) |
262 attrs = sorted(_class.attributes.keys()) |
263 attrs = sorted(_class.attributes.keys()) |
263 name = _class.name |
264 name = _class.name |
264 if isRbModule: |
265 if isRbModule: |
265 name = "{0} (Module)".format(name) |
266 name = "{0} (Module)".format(name) |
266 cl = ClassModel(name, meths[:], attrs[:]) |
267 cl = ClassModel(name, meths[:], attrs[:]) |
267 cw = ClassItem(cl, False, x, y, noAttrs = self.noAttrs, scene = self.scene) |
268 cw = ClassItem(cl, False, x, y, noAttrs=self.noAttrs, scene=self.scene) |
268 self.allClasses[className] = cw |
269 self.allClasses[className] = cw |
269 |
270 |
270 def __addExternalClass(self, _class, x, y): |
271 def __addExternalClass(self, _class, x, y): |
271 """ |
272 """ |
272 Private method to add a class defined outside the module. |
273 Private method to add a class defined outside the module. |
277 @param _class class to be shown (string) |
278 @param _class class to be shown (string) |
278 @param x x-coordinate (float) |
279 @param x x-coordinate (float) |
279 @param y y-coordinate (float) |
280 @param y y-coordinate (float) |
280 """ |
281 """ |
281 cl = ClassModel(_class) |
282 cl = ClassModel(_class) |
282 cw = ClassItem(cl, True, x, y, noAttrs = self.noAttrs, scene = self.scene) |
283 cw = ClassItem(cl, True, x, y, noAttrs=self.noAttrs, scene=self.scene) |
283 self.allClasses[_class] = cw |
284 self.allClasses[_class] = cw |
284 |
285 |
285 def __createAssociations(self, routes): |
286 def __createAssociations(self, routes): |
286 """ |
287 """ |
287 Private method to generate the associations between the class shapes. |
288 Private method to generate the associations between the class shapes. |