From 1b2e43e2c385e91d49005f63d09c0fea5a9e815f Mon Sep 17 00:00:00 2001 From: gryf Date: Tue, 10 Oct 2023 18:11:07 +0200 Subject: [PATCH] Remove recreate tree method. Removing and recreating tree isn't very efficient, so for operations like adding new directory or removing items from the store, only affected rows are changed (added or removed from the treestore). --- gtkpass.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/gtkpass.py b/gtkpass.py index d2095df..f605e18 100755 --- a/gtkpass.py +++ b/gtkpass.py @@ -163,12 +163,6 @@ class GTKPass(Gtk.Window): child.show() if set_visible else child.hide() self.textview.show() if set_visible else self.textview.hide() - def recreate_tree_store(self): - self.passs.gather_pass_tree() - self.tree_store.clear() - self.add_nodes(self.passs.data, None) - self.refresh() - def create_toolbar(self): toolbar = Gtk.Toolbar() @@ -329,10 +323,8 @@ class GTKPass(Gtk.Window): def on_new_dir(self, button): if self._selected is None: - print('none selected') path = '' else: - print(f'{self._selected} selected') path = self._selected dialog = NewDirDialog(self, path) @@ -340,7 +332,7 @@ class GTKPass(Gtk.Window): dirname = dialog.get_dirname() dialog.destroy() - if response != Gtk.ResponseType.OK: + if response != Gtk.ResponseType.OK or not dirname: return result, msg = self.passs.new_dir(os.path.join(path, dirname)) @@ -350,11 +342,22 @@ class GTKPass(Gtk.Window): message_type=Gtk.MessageType.INFO, buttons=Gtk.ButtonsType.CLOSE, text='There was an error') + dialog.format_secondary_text(msg) dialog.run() dialog.destroy() - self.recreate_tree_store() + selection = self.treeview.get_selection() + if not selection: + return + tree_model_filter, tree_paths = selection.get_selected_rows() + tree_store = tree_model_filter.get_model() + tree_iter = tree_store.get_iter(tree_paths[0]) + + self.tree_store.append(tree_iter, [True, dirname, + Pango.Weight.NORMAL, "folder", + os.path.join(path, dirname), False]) + def on_delete(self, button): if not self._selected: @@ -385,7 +388,16 @@ class GTKPass(Gtk.Window): dialog.format_secondary_text(msg) dialog.run() dialog.destroy() - self.recreate_tree_store() + self._selected = None + + # remove selected branch/leaf from store + selection = self.treeview.get_selection() + tree_model_filter, tree_paths = selection.get_selected_rows() + tree_store = tree_model_filter.get_model() + + for path in tree_paths: + tree_iter = tree_store.get_iter(path) + tree_store.remove(tree_iter) def on_key_press_event(self, widget, event): ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)