From 34e21640d285862e9692f060ebecf7bd02ec0cc1 Mon Sep 17 00:00:00 2001 From: gryf Date: Mon, 2 Oct 2023 15:21:53 +0200 Subject: [PATCH] Make search box filtering the data on tree view. --- gtkpass.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/gtkpass.py b/gtkpass.py index 36e644c..6833608 100755 --- a/gtkpass.py +++ b/gtkpass.py @@ -51,6 +51,7 @@ class GTKPass(Gtk.Window): # search box self.search = Gtk.SearchEntry() self.search.set_placeholder_text("Search password") + self.search.connect("changed", self.refresh) lbox.pack_start(child=self.search, expand=False, fill=False, padding=0) # treeview with filtering @@ -113,6 +114,32 @@ class GTKPass(Gtk.Window): self.tree_store.set_value(iter, 2, Pango.Weight.NORMAL) self.tree_store.set_value(iter, 0, make_visible) + def make_path_visible(self, model, iter): + while iter: + self.tree_store.set_value(iter, 0, True) + iter = model.iter_parent(iter) + + def make_subtree_visible(self, model, iter): + for i in range(model.iter_n_children(iter)): + subtree = model.iter_nth_child(iter, i) + if model.get_value(subtree, 0): + continue + self.tree_store.set_value(subtree, 0, True) + self.make_subtree_visible(model, subtree) + + def show_matches(self, model, path, iter, query, + show_subtrees_of_matches): + text = model.get_value(iter, 1).lower() + if query in text: + # Highlight direct match with bold + self.tree_store.set_value(iter, 2, Pango.Weight.BOLD) + # Propagate visibility change up + self.make_path_visible(model, iter) + if show_subtrees_of_matches: + # Propagate visibility change down + self.make_subtree_visible(model, iter) + return + class Leaf: """A simple class to hold Leaf data"""