|
...
|
...
|
@@ -44,6 +44,8 @@ import pangocairo
|
|
44
|
44
|
# - http://mirageiv.berlios.de/
|
|
45
|
45
|
# - http://comix.sourceforge.net/
|
|
46
|
46
|
|
|
|
47
|
+def filterlist(l, expr):
|
|
|
48
|
+ return map(lambda i: l[i], filter(lambda i: isinstance(l[i], expr), range(len(l))))
|
|
47
|
49
|
|
|
48
|
50
|
class Pen:
|
|
49
|
51
|
"""Store pen attributes."""
|
|
...
|
...
|
@@ -1292,6 +1294,22 @@ class DragAction(object):
|
|
1292
|
1294
|
self.startmousey = self.prevmousey = event.y
|
|
1293
|
1295
|
self.start()
|
|
1294
|
1296
|
|
|
|
1297
|
+ dot_widget = self.dot_widget
|
|
|
1298
|
+ item = dot_widget.get_url(event.x, event.y)
|
|
|
1299
|
+ if item is None:
|
|
|
1300
|
+ item = dot_widget.get_jump(event.x, event.y)
|
|
|
1301
|
+
|
|
|
1302
|
+ if item is not None and isinstance(item.item, Node):
|
|
|
1303
|
+ src = filterlist(item.item.shapes, TextShape)
|
|
|
1304
|
+ print "# src", src[0].t
|
|
|
1305
|
+ for edge in dot_widget.graph.edges:
|
|
|
1306
|
+ if edge.src == item.item:
|
|
|
1307
|
+ dst = filterlist(edge.dst.shapes, TextShape)
|
|
|
1308
|
+ print "dst", dst[0].t
|
|
|
1309
|
+ #dstitem = dot_widget.get_jump(edge.dst.x, edge.dst.y);
|
|
|
1310
|
+ #dot_widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2))
|
|
|
1311
|
+ #dot_widget.set_highlight(dstitem.highlight)
|
|
|
1312
|
+
|
|
1295
|
1313
|
def on_motion_notify(self, event):
|
|
1296
|
1314
|
if event.is_hint:
|
|
1297
|
1315
|
x, y, state = event.window.get_pointer()
|
|
...
|
...
|
@@ -1766,6 +1784,16 @@ class DotWidget(gtk.DrawingArea):
|
|
1766
|
1784
|
self.animation = ZoomToAnimation(self, x, y)
|
|
1767
|
1785
|
self.animation.start()
|
|
1768
|
1786
|
|
|
|
1787
|
+ def graph2window(self, x, y):
|
|
|
1788
|
+ rect = self.get_allocation()
|
|
|
1789
|
+ x -= self.x
|
|
|
1790
|
+ y -= self.y
|
|
|
1791
|
+ x *= self.zoom_ratio
|
|
|
1792
|
+ y *= self.zoom_ratio
|
|
|
1793
|
+ x += 0.5 * rect.width
|
|
|
1794
|
+ y += 0.5 * rect.height
|
|
|
1795
|
+ return x, y
|
|
|
1796
|
+
|
|
1769
|
1797
|
def window2graph(self, x, y):
|
|
1770
|
1798
|
rect = self.get_allocation()
|
|
1771
|
1799
|
x -= 0.5*rect.width
|
|
...
|
...
|
@@ -1854,8 +1882,41 @@ class DotWindow(gtk.Window):
|
|
1854
|
1882
|
|
|
1855
|
1883
|
self.set_focus(self.widget)
|
|
1856
|
1884
|
|
|
|
1885
|
+ # Add Find text search
|
|
|
1886
|
+ self.textentry = gtk.Entry(max=20)
|
|
|
1887
|
+ vbox.pack_start(self.textentry, False)
|
|
|
1888
|
+ self.textentry.set_activates_default(True)
|
|
|
1889
|
+ self.textentry.connect ("activate", self.textentry_activate, self.textentry);
|
|
|
1890
|
+
|
|
1857
|
1891
|
self.show_all()
|
|
1858
|
1892
|
|
|
|
1893
|
+ def textentry_activate(self, widget, entry):
|
|
|
1894
|
+ entry_text = entry.get_text()
|
|
|
1895
|
+ dot_widget = self.widget
|
|
|
1896
|
+ for node in dot_widget.graph.nodes:
|
|
|
1897
|
+ text = filterlist(node.shapes, TextShape)
|
|
|
1898
|
+ if re.match (entry_text, text[0].t):
|
|
|
1899
|
+ print "found:", entry_text ,"at", node, node.x, node.y
|
|
|
1900
|
+ press = gtk.gdk.Event(gtk.gdk.BUTTON_PRESS)
|
|
|
1901
|
+ release = gtk.gdk.Event(gtk.gdk.BUTTON_RELEASE)
|
|
|
1902
|
+ press.button = release.button = 1
|
|
|
1903
|
+ press.x, press.y, = dot_widget.graph2window(node.x, node.y)
|
|
|
1904
|
+ release.x, release.y, = dot_widget.graph2window(node.x, node.y)
|
|
|
1905
|
+
|
|
|
1906
|
+ dot_widget.on_area_button_press(None, press)
|
|
|
1907
|
+ dot_widget.on_area_button_release(None, release)
|
|
|
1908
|
+
|
|
|
1909
|
+ def update(self, filename):
|
|
|
1910
|
+ if not hasattr(self, "last_mtime"):
|
|
|
1911
|
+ self.last_mtime = None
|
|
|
1912
|
+
|
|
|
1913
|
+ current_mtime = os.stat(filename).st_mtime
|
|
|
1914
|
+ if current_mtime != self.last_mtime:
|
|
|
1915
|
+ self.last_mtime = current_mtime
|
|
|
1916
|
+ self.open_file(filename)
|
|
|
1917
|
+
|
|
|
1918
|
+ return True
|
|
|
1919
|
+
|
|
1859
|
1920
|
def set_filter(self, filter):
|
|
1860
|
1921
|
self.widget.set_filter(filter)
|
|
1861
|
1922
|
|