Graphics/UMLDialog.py

branch
Py2 comp.
changeset 3057
10516539f238
parent 2525
8b507a9a2d40
parent 2997
7f0ef975da9e
child 3058
0a02c433f52d
equal deleted inserted replaced
3056:9986ec0e559a 3057:10516539f238
29 ImportsDiagram = 2 29 ImportsDiagram = 2
30 ApplicationDiagram = 3 30 ApplicationDiagram = 3
31 31
32 FileVersions = ["1.0"] 32 FileVersions = ["1.0"]
33 33
34 def __init__(self, diagramType, project, path="", parent=None, initBuilder=True, 34 def __init__(self, diagramType, project, path="", parent=None,
35 **kwargs): 35 initBuilder=True, **kwargs):
36 """ 36 """
37 Constructor 37 Constructor
38 38
39 @param diagramType type of the diagram (one of ApplicationDiagram, ClassDiagram, 39 @param diagramType type of the diagram (one of ApplicationDiagram,
40 ImportsDiagram, NoDiagram, PackageDiagram) 40 ClassDiagram, ImportsDiagram, NoDiagram, PackageDiagram)
41 @param project reference to the project object (Project) 41 @param project reference to the project object (Project)
42 @param path file or directory path to build the diagram from (string) 42 @param path file or directory path to build the diagram from (string)
43 @param parent parent widget of the dialog (QWidget) 43 @param parent parent widget of the dialog (QWidget)
44 @keyparam initBuilder flag indicating to initialize the diagram builder (boolean) 44 @keyparam initBuilder flag indicating to initialize the diagram
45 @param kwargs diagram specific data 45 builder (boolean)
46 @keyparam kwargs diagram specific data
46 """ 47 """
47 super(UMLDialog, self).__init__(parent) 48 super(UMLDialog, self).__init__(parent)
48 self.setObjectName("UMLDialog") 49 self.setObjectName("UMLDialog")
49 50
50 self.__diagramType = diagramType 51 self.__diagramType = diagramType
51 self.__project = project 52 self.__project = project
52 53
53 from .UMLGraphicsView import UMLGraphicsView 54 from .UMLGraphicsView import UMLGraphicsView
54 self.scene = QGraphicsScene(0.0, 0.0, 800.0, 600.0) 55 self.scene = QGraphicsScene(0.0, 0.0, 800.0, 600.0)
55 self.umlView = UMLGraphicsView(self.scene, parent=self) 56 self.umlView = UMLGraphicsView(self.scene, parent=self)
56 self.builder = self.__diagramBuilder(self.__diagramType, path, **kwargs) 57 self.builder = self.__diagramBuilder(
58 self.__diagramType, path, **kwargs)
57 if self.builder and initBuilder: 59 if self.builder and initBuilder:
58 self.builder.initialize() 60 self.builder.initialize()
59 61
60 self.__fileName = "" 62 self.__fileName = ""
61 63
103 self.printAct.triggered[()].connect(self.umlView.printDiagram) 105 self.printAct.triggered[()].connect(self.umlView.printDiagram)
104 106
105 self.printPreviewAct = \ 107 self.printPreviewAct = \
106 QAction(UI.PixmapCache.getIcon("printPreview.png"), 108 QAction(UI.PixmapCache.getIcon("printPreview.png"),
107 self.trUtf8("Print Preview"), self) 109 self.trUtf8("Print Preview"), self)
108 self.printPreviewAct.triggered[()].connect(self.umlView.printPreviewDiagram) 110 self.printPreviewAct.triggered[()].connect(
111 self.umlView.printPreviewDiagram)
109 112
110 def __initToolBars(self): 113 def __initToolBars(self):
111 """ 114 """
112 Private slot to initialize the toolbars. 115 Private slot to initialize the toolbars.
113 """ 116 """
153 def __diagramBuilder(self, diagramType, path, **kwargs): 156 def __diagramBuilder(self, diagramType, path, **kwargs):
154 """ 157 """
155 Private method to instantiate a diagram builder object. 158 Private method to instantiate a diagram builder object.
156 159
157 @param diagramType type of the diagram 160 @param diagramType type of the diagram
158 (one of ApplicationDiagram, ClassDiagram, ImportsDiagram, PackageDiagram) 161 (one of ApplicationDiagram, ClassDiagram, ImportsDiagram,
162 PackageDiagram)
159 @param path file or directory path to build the diagram from (string) 163 @param path file or directory path to build the diagram from (string)
160 @param kwargs diagram specific data 164 @keyparam kwargs diagram specific data
165 @return reference to the instantiated diagram builder
166 @exception ValueError raised to indicate an illegal diagram type
161 """ 167 """
162 if diagramType == UMLDialog.ClassDiagram: 168 if diagramType == UMLDialog.ClassDiagram:
163 from .UMLClassDiagramBuilder import UMLClassDiagramBuilder 169 from .UMLClassDiagramBuilder import UMLClassDiagramBuilder
164 return UMLClassDiagramBuilder(self, self.umlView, self.__project, path, 170 return UMLClassDiagramBuilder(
165 **kwargs) 171 self, self.umlView, self.__project, path, **kwargs)
166 elif diagramType == UMLDialog.PackageDiagram: 172 elif diagramType == UMLDialog.PackageDiagram:
167 from .PackageDiagramBuilder import PackageDiagramBuilder 173 from .PackageDiagramBuilder import PackageDiagramBuilder
168 return PackageDiagramBuilder(self, self.umlView, self.__project, path, 174 return PackageDiagramBuilder(
169 **kwargs) 175 self, self.umlView, self.__project, path, **kwargs)
170 elif diagramType == UMLDialog.ImportsDiagram: 176 elif diagramType == UMLDialog.ImportsDiagram:
171 from .ImportsDiagramBuilder import ImportsDiagramBuilder 177 from .ImportsDiagramBuilder import ImportsDiagramBuilder
172 return ImportsDiagramBuilder(self, self.umlView, self.__project, path, 178 return ImportsDiagramBuilder(
173 **kwargs) 179 self, self.umlView, self.__project, path, **kwargs)
174 elif diagramType == UMLDialog.ApplicationDiagram: 180 elif diagramType == UMLDialog.ApplicationDiagram:
175 from .ApplicationDiagramBuilder import ApplicationDiagramBuilder 181 from .ApplicationDiagramBuilder import ApplicationDiagramBuilder
176 return ApplicationDiagramBuilder(self, self.umlView, self.__project, 182 return ApplicationDiagramBuilder(
177 **kwargs) 183 self, self.umlView, self.__project, **kwargs)
178 elif diagramType == UMLDialog.NoDiagram: 184 elif diagramType == UMLDialog.NoDiagram:
179 return None 185 return None
180 else: 186 else:
181 raise ValueError( 187 raise ValueError(self.trUtf8(
182 self.trUtf8("Illegal diagram type '{0}' given.").format(diagramType)) 188 "Illegal diagram type '{0}' given.").format(diagramType))
183 189
184 def __diagramTypeString(self): 190 def __diagramTypeString(self):
185 """ 191 """
186 Private method to generate a readable string for the diagram type. 192 Private method to generate a readable string for the diagram type.
187 193
237 243
238 lines = [ 244 lines = [
239 "version: 1.0", 245 "version: 1.0",
240 "diagram_type: {0} ({1})".format(self.__diagramType, 246 "diagram_type: {0} ({1})".format(self.__diagramType,
241 self.__diagramTypeString()), 247 self.__diagramTypeString()),
242 "scene_size: {0};{1}".format(self.scene.width(), self.scene.height()), 248 "scene_size: {0};{1}".format(self.scene.width(),
249 self.scene.height()),
243 ] 250 ]
244 persistenceData = self.builder.getPersistenceData() 251 persistenceData = self.builder.getPersistenceData()
245 if persistenceData: 252 if persistenceData:
246 lines.append("builder_data: {0}".format(persistenceData)) 253 lines.append("builder_data: {0}".format(persistenceData))
247 lines.extend(self.umlView.getPersistenceData()) 254 lines.extend(self.umlView.getPersistenceData())
251 f.write("\n".join(lines)) 258 f.write("\n".join(lines))
252 f.close() 259 f.close()
253 except (IOError, OSError) as err: 260 except (IOError, OSError) as err:
254 E5MessageBox.critical(self, 261 E5MessageBox.critical(self,
255 self.trUtf8("Save Diagram"), 262 self.trUtf8("Save Diagram"),
256 self.trUtf8("""<p>The file <b>{0}</b> could not be saved.</p>""" 263 self.trUtf8(
257 """<p>Reason: {1}</p>""").format(filename, str(err))) 264 """<p>The file <b>{0}</b> could not be saved.</p>"""
265 """<p>Reason: {1}</p>""").format(filename, str(err)))
258 return 266 return
259 267
260 self.__fileName = filename 268 self.__fileName = filename
261 269
262 def load(self): 270 def load(self):
279 data = f.read() 287 data = f.read()
280 f.close() 288 f.close()
281 except (IOError, OSError) as err: 289 except (IOError, OSError) as err:
282 E5MessageBox.critical(self, 290 E5MessageBox.critical(self,
283 self.trUtf8("Load Diagram"), 291 self.trUtf8("Load Diagram"),
284 self.trUtf8("""<p>The file <b>{0}</b> could not be read.</p>""" 292 self.trUtf8(
285 """<p>Reason: {1}</p>""").format(filename, str(err))) 293 """<p>The file <b>{0}</b> could not be read.</p>"""
294 """<p>Reason: {1}</p>""").format(filename, str(err)))
286 return False 295 return False
287 296
288 lines = data.splitlines() 297 lines = data.splitlines()
289 if len(lines) < 3: 298 if len(lines) < 3:
290 self.__showInvalidDataMessage(filename) 299 self.__showInvalidDataMessage(filename)
292 301
293 try: 302 try:
294 # step 1: check version 303 # step 1: check version
295 linenum = 0 304 linenum = 0
296 key, value = lines[linenum].split(": ", 1) 305 key, value = lines[linenum].split(": ", 1)
297 if key.strip() != "version" or value.strip() not in UMLDialog.FileVersions: 306 if key.strip() != "version" or \
307 value.strip() not in UMLDialog.FileVersions:
298 self.__showInvalidDataMessage(filename, linenum) 308 self.__showInvalidDataMessage(filename, linenum)
299 return False 309 return False
300 else: 310 else:
301 version = value 311 version = value
302 312
336 self.__showInvalidDataMessage(filename, linenum) 346 self.__showInvalidDataMessage(filename, linenum)
337 return False 347 return False
338 linenum += 1 348 linenum += 1
339 349
340 # step 5: extract the graphics items 350 # step 5: extract the graphics items
341 ok, vlinenum = self.umlView.parsePersistenceData(version, lines[linenum:]) 351 ok, vlinenum = self.umlView.parsePersistenceData(
352 version, lines[linenum:])
342 if not ok: 353 if not ok:
343 self.__showInvalidDataMessage(filename, linenum + vlinenum) 354 self.__showInvalidDataMessage(filename, linenum + vlinenum)
344 return False 355 return False
345 356
346 except IndexError: 357 except IndexError:

eric ide

mercurial