1
2 '''
3 Render a graph full of gtk widgets and draw some lines!
4 '''
5
6 import gtk
7 import gtk.gdk as gdk
8
9 import vwidget.main as vw_main
10
11 import visgraph.renderers as vg_render
12 import visgraph.drawing.bezier as vw_bezier
13 import visgraph.drawing.catmullrom as vw_catmullrom
14
15 zero_zero = (0,0)
16
18
19 - def __init__(self, graph, layout, scrollwin=None, ):
20 gtk.DrawingArea.__init__(self)
21 self._vg_graph = graph
22 self._vg_layout = layout
23 self._vg_scrollwin = scrollwin
24
25 self.connect('expose-event', self.expose_event_cb)
26 self.connect('button_press_event', self.button_press_event)
27 self.set_events( self.get_events() | gtk.gdk.BUTTON_PRESS_MASK)
28
29 self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color())
30 self.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(green=65535))
31
32 if scrollwin != None:
33 scrollwin.connect('destroy', self.scroll_destroy_cb)
34
37
39
40 style = self.get_style()
41 gc = style.fg_gc[gtk.STATE_NORMAL]
42
43 rect = self.get_allocation()
44
45 owidth = rect.width
46 oheight = rect.height
47
48 lwidth, lheight = self._vg_layout.getLayoutSize()
49
50 for nid, ninfo in self._vg_graph.getNodes():
51
52 nwidth, nheight = ninfo.get('size', zero_zero)
53 if nwidth == 0:
54 continue
55
56 xpos, ypos = ninfo.get('position', zero_zero)
57
58 drawx = ((xpos * owidth) / lwidth)
59 drawy = (ypos * oheight) / lheight
60
61 sizex = owidth * nwidth / lwidth
62 sizey = oheight * nheight / lheight
63
64 colorstr = ninfo.get('color')
65 if colorstr == None:
66 colorstr = '#0f0'
67
68 color = gtk.gdk.color_parse(colorstr)
69
70
71 self.window.draw_rectangle(gc, False, drawx, drawy, sizex, sizey)
72
73
74
75
76
77
78
96
97
99
101 gtk.Layout.__init__(self)
102 vg_render.GraphRenderer.__init__(self, graph)
103
104 self._vg_lines = []
105
106 self.connect('expose-event', self.expose_event_cb)
107 self.connect('button_press_event', self.button_press_event)
108
109 self.set_events( self.get_events() | gtk.gdk.BUTTON_PRESS_MASK)
110
111 self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color())
112 self.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(green=65535))
113
118
120 widget = ninfo.get('widget')
121
122 if widget != None:
123 self.move(widget, xpos, ypos)
124
126
127 self._vg_lines.append(points)
128
130
131 for nid, ninfo in graph.getNodes():
132
133
134 if ninfo.get('ghost'):
135 continue
136
137 widget = ninfo.get('widget')
138 if widget == None:
139 widget = gtk.Label(str(nid))
140 widget.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color())
141 widget.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color(green=65535))
142 ninfo['widget'] = widget
143
144
145 self.put(widget, 0, 0)
146
147
148 self.show_all()
149 vw_main.doiterations()
150
151
152 for nid, ninfo in graph.getNodes():
153 widget = ninfo.get('widget')
154 if widget == None:
155 continue
156
157 size = widget.size_request()
158 ninfo['size'] = size
159
162
164
165 style = self.get_style()
166
167 gc = style.fg_gc[gtk.STATE_NORMAL]
168
169 for points in self._vg_lines:
170 self.bin_window.draw_lines(gc, points)
171