... | ... |
@@ -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 |
|