Package visgraph :: Package renderers :: Module gtkrend
[hide private]
[frames] | no frames]

Source Code for Module visgraph.renderers.gtkrend

  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   
17 -class GtkVisGraphOverview(gtk.DrawingArea):
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
35 - def scroll_destroy_cb(self, widget):
36 self.destroy()
37
38 - def expose_event_cb(self, layout, event):
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 #self.modify_fg(gtk.STATE_NORMAL, color) 71 self.window.draw_rectangle(gc, False, drawx, drawy, sizex, sizey)
72 73 #c = self.window.cairo_create() 74 #c.set_source_rgb(color.red / float(65535), color.green / float(65535), color.blue / float(65535)) 75 #c.rectangle(drawx, drawy, sizex, sizey)# event.area.x, event.area.y, event.area.width, event.area.height) 76 #c.set_line_width(0.5) 77 #c.stroke() 78
79 - def button_press_event(self, widget, event):
80 if self._vg_scrollwin: 81 rect = self.get_allocation() 82 xper = event.x / float(rect.width) 83 yper = event.y / float(rect.height) 84 85 hadj = self._vg_scrollwin.get_hadjustment() 86 vadj = self._vg_scrollwin.get_vadjustment() 87 88 hvis = hadj.page_size 89 vvis = vadj.page_size 90 91 hadj.value = min(max((hadj.upper * xper) - (hvis / 2), 0), hadj.upper - hvis) 92 vadj.value = min(max((vadj.upper * yper) - (vvis / 2), 0), vadj.upper - vvis) 93 94 self._vg_scrollwin.set_hadjustment(hadj) 95 self._vg_scrollwin.set_vadjustment(vadj)
96 97 #FIXME use cairo to draw!
98 -class GtkVisGraphRenderer(gtk.Layout, vg_render.GraphRenderer):
99
100 - def __init__(self, graph):
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
114 - def beginRender(self, width, height):
115 vg_render.GraphRenderer.beginRender(self, width, height) 116 self._vg_lines = [] 117 self.set_size(width, height)
118
119 - def renderNode(self, nid, ninfo, xpos, ypos):
120 widget = ninfo.get('widget') 121 # FIXME honor color, etc...? 122 if widget != None: 123 self.move(widget, xpos, ypos)
124
125 - def renderEdge(self, eid, einfo, points):
126 # FIXME deal with colors etc... 127 self._vg_lines.append(points)
128
129 - def setNodeSizes(self, graph):
130 131 for nid, ninfo in graph.getNodes(): 132 133 # Skip "ghost" nodes... 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 # Put them all at 0,0 for now... 145 self.put(widget, 0, 0) 146 147 # Get them all to render... 148 self.show_all() 149 vw_main.doiterations() 150 151 # Now that we have rendered them... 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
160 - def button_press_event(self, widget, event):
161 print 'CLICK %d %d' % (event.x, event.y)
162
163 - def expose_event_cb(self, layout, event):
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