The attached patch adds a simple search dialog to bzr-gtk. "bzr viz" will 
jump to the selected revision in the search dialog.

Cheers,

Jelmer

-- 
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: lp:bzr-gtk
# testament_sha1: b21558d9eb1efd42c71ab8e896c4021d9f4f51be
# timestamp: 2008-07-01 17:28:38 +0200
# base_revision_id: [EMAIL PROTECTED]
# 
# Begin patch
=== added file 'search.py'
--- search.py	1970-01-01 00:00:00 +0000
+++ search.py	2008-07-01 15:28:30 +0000
@@ -0,0 +1,88 @@
+# Copyright (C) 2008 by Jelmer Vernooij <[EMAIL PROTECTED]>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+try:
+    import pygtk
+    pygtk.require("2.0")
+except:
+    pass
+
+import gobject, gtk
+from bzrlib.plugins.search import index as _mod_index
+
+
+class SearchDialog(gtk.Dialog):
+    """Search dialog."""
+    def __init__(self, branch, parent=None):
+        gtk.Dialog.__init__(self, title="Search Revisions",
+                                  parent=parent,
+                                  flags=gtk.DIALOG_MODAL,
+                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
+                                           gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
+    
+        # Get arguments
+        self.branch = branch
+
+        self.index = _mod_index.open_index_url(branch.base)
+
+        self.searchbar = gtk.HBox()
+        self.searchentry = gtk.Entry()
+        self.searchentry.connect('activate', self._searchentry_activate)
+        # TODO: Completion using the bzr-search suggests functionality
+        self.searchbar.add(self.searchentry)
+        self.vbox.pack_start(self.searchbar, expand=False, fill=False)
+
+        self.results_model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
+        self.results_treeview = gtk.TreeView(self.results_model)
+
+        documentname_column = gtk.TreeViewColumn("Document", gtk.CellRendererText(), text=0)
+        self.results_treeview.append_column(documentname_column)
+
+        summary_column = gtk.TreeViewColumn("Summary", gtk.CellRendererText(), text=1)
+        self.results_treeview.append_column(summary_column)
+
+        results_scrolledwindow = gtk.ScrolledWindow()
+        results_scrolledwindow.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+        results_scrolledwindow.add(self.results_treeview)
+
+        self.vbox.pack_start(results_scrolledwindow, expand=True, fill=True)
+
+        self.set_default_size(600, 400)
+        # Show the dialog
+        self.show_all()
+
+    def get_revision(self):
+        (path, focus) = self.results_treeview.get_cursor()
+        if path is None:
+            return None
+        iter = self.results_model.get_iter(path)
+        return self.results_model.get_value(iter, 2)
+
+    def _searchentry_activate(self, entry):
+        self.results_model.clear()
+        self.index._branch.lock_read()
+        try:
+            query = [(query_item,) for query_item in self.searchentry.get_text().split(" ")]
+            for result in self.index.search(query):
+                if isinstance(result, _mod_index.FileTextHit):
+                    revid = result.text_key[-1]
+                elif isinstance(result, _mod_index.RevisionHit):
+                    revid = result.revision_key[0]
+                else:
+                    raise AssertionError()
+                self.results_model.append([result.document_name(), result.summary(), revid])
+        finally:
+            self.index._branch.unlock()

=== modified file 'viz/branchwin.py'
--- viz/branchwin.py	2008-06-29 19:34:29 +0000
+++ viz/branchwin.py	2008-07-01 14:52:31 +0000
@@ -234,10 +234,16 @@
         except ImportError:
             mutter("Didn't find search plugin")
         else:
+            branch_menu.add(gtk.SeparatorMenuItem())
+
             branch_index_menuitem = gtk.MenuItem("_Index")
             branch_index_menuitem.connect('activate', self._branch_index_cb)
             branch_menu.add(branch_index_menuitem)
 
+            branch_search_menuitem = gtk.MenuItem("_Search")
+            branch_search_menuitem.connect('activate', self._branch_search_cb)
+            branch_menu.add(branch_search_menuitem)
+
         help_menu = gtk.Menu()
         help_menuitem = gtk.MenuItem("_Help")
         help_menuitem.set_submenu(help_menu)
@@ -470,6 +476,15 @@
         from bzrlib.plugins.search import index as _mod_index
         _mod_index.index_url(self.branch.base)
 
+    def _branch_search_cb(self, w):
+        from bzrlib.plugins.gtk.search import SearchDialog
+        dialog = SearchDialog(self.branch)
+        
+        if dialog.run() == gtk.RESPONSE_OK:
+            self.set_revision(dialog.get_revision())
+
+        dialog.destroy()
+
     def _about_dialog_cb(self, w):
         from bzrlib.plugins.gtk.about import AboutDialog
 

# Begin bundle
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
kLuLaco=

Attachment: signature.asc
Description: Digital signature

-- 
bzr-gtk mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.canonical.com/mailman/listinfo/bzr-gtk

Reply via email to