root/gaphor/tags/gaphor-0.3.0/gaphor/UML/diagram.py

Revision 241, 3.0 kB (checked in by arjanmol, 5 years ago)

*** empty log message ***

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 # vim: sw=4
2 '''diagram.py
3 This module contains a model elements (!) Diagram which is the abstract
4 representation of a UML diagram. Diagrams can be visualized and edited.'''
5
6 __author__ = 'Arjan Molenaar'
7 __version__ = '$revision$'
8 __date__ = '$date$'
9
10 import gobject
11 import diacanvas
12 import gaphor.misc.uniqueid as uniqueid
13 from uml2 import Namespace, PackageableElement
14
15 class DiagramCanvas(diacanvas.Canvas):
16     """Some additions to diacanvas.Canvas class.
17     Esp. load and save functionallity.
18     """
19     # Most of those properties come from diacanvas.Canvas
20     _savable_canvas_properties = [ 'extents', 'static_extents',
21             'snap_to_grid', 'grid_int_x', 'grid_int_y', 'grid_ofs_x',
22             'grid_ofs_y', 'grid_color', 'grid_bg' ]
23
24     def __init__(self, diagram):
25         self.__gobject_init__()
26         self._diagram = diagram
27
28     diagram = property(lambda d: d._diagram)
29
30     def save(self, save_func):
31         for prop in DiagramCanvas._savable_canvas_properties:
32             save_func(prop, self.get_property(prop))
33         save_func('root_affine', self.root.get_property('affine'))
34         # Save child items:
35         for item in self.root.children:
36             save_func(None, item)
37
38     def load(self, name, value):
39         self.set_property ("allow_undo", False)
40
41         # First create the canvas:
42         if name == 'root_affine':
43             self.root.set_property('affine', eval(value))
44         else:
45             self.set_property (name, eval(value))
46
47         self.update_now ()
48
49     def postload(self):
50         self.update_now ()
51
52         # setting allow-undo to 1 here will cause update info from later
53         # created elements to be put on the undo stack.
54         self.clear_undo()
55         self.clear_redo()
56         self.set_property ("allow_undo", True)
57
58 gobject.type_register(DiagramCanvas)
59
60
61 class Diagram(Namespace, PackageableElement):
62     """Diagrams may contain model elements and can be owned by a Package.
63     """
64
65     def __init__(self, id=None, factory=None):
66         super(Diagram, self).__init__(id, factory)
67         self.canvas = DiagramCanvas(self)
68         self.canvas.set_undo_stack_depth(10)
69         self.canvas.set_property ("allow_undo", 1)
70
71     def save(self, save_func):
72         super(Diagram, self).save(save_func)
73         save_func('canvas', self.canvas)
74
75     def create(self, type):
76         """Create a new canvas item on the canvas. It is created with
77         a unique ID and it is attached to the diagram's root item.
78         """
79         assert issubclass(type, diacanvas.CanvasItem)
80         obj = type(uniqueid.generate_id())
81         #obj.set_property('parent', self.canvas.root)
82         self.canvas.root.add(obj)
83         return obj
84
85     def unlink(self):
86         self.canvas.set_property('allow_undo', False)
87         self.canvas.clear_undo()
88         self.canvas.clear_redo()
89         def dispose(item):
90             try:
91                 for i in item.groupable_iter():
92                     dispose(i)
93             except AttributeError:
94                 pass
95             try:
96                 item.unlink()
97             except:
98                 pass
99             # Clear all references on a C-level
100             item.dispose()
101
102         #for i in self.canvas.root.children:
103         #    dispose(i)
104
105         Namespace.unlink(self)
Note: See TracBrowser for help on using the browser.