Browse code

xdot: add support for text based node search

Salva authored on 03/03/2012 13:45:26 • José Fonseca committed on 12/05/2013 08:02:05
Showing 1 changed files

  • xdot.py index 61e4d8b..25fa77e 100755
... ...
@@ -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