diff --git a/data/preferences.ui b/data/preferences.ui index a53d382..6b4aee0 100644 --- a/data/preferences.ui +++ b/data/preferences.ui @@ -311,6 +311,19 @@ True vertical + + True + True + + + + + False + False + 0 + + + True True @@ -322,7 +335,7 @@ - 0 + 1 @@ -335,7 +348,7 @@ False False 5 - 1 + 2 diff --git a/kupfer/ui/preferences.py b/kupfer/ui/preferences.py index ff50932..5f484d6 100644 --- a/kupfer/ui/preferences.py +++ b/kupfer/ui/preferences.py @@ -10,7 +10,8 @@ from xdg import DesktopEntry as desktop from kupfer import config, pretty, utils, icons, version -from kupfer.core import settings, plugins +from kupfer import scheduler, kupferstring +from kupfer.core import settings, plugins, relevance from kupfer.ui import keybindings class PreferencesWindowController (pretty.OutputMixin): @@ -41,6 +42,7 @@ class PreferencesWindowController (pretty.OutputMixin): self.buttonremovedirectory = builder.get_object("buttonremovedirectory") checkautostart = builder.get_object("checkautostart") checkstatusicon = builder.get_object("checkstatusicon") + self.entry_plugins_filter = builder.get_object('entry_plugins_filter') setctl = settings.GetSettingsController() self.entrykeybinding.set_text(setctl.get_keybinding()) @@ -88,17 +90,10 @@ class PreferencesWindowController (pretty.OutputMixin): #self.table.append_column(icon_col) self.table.append_column(col) + self.plugin_list_timer = scheduler.Timer() self.plugin_info = utils.locale_sort(plugins.get_plugin_info(), key= lambda rec: rec["localized_name"]) - for info in self.plugin_info: - plugin_id = info["name"] - if setctl.get_plugin_is_hidden(plugin_id): - continue - enabled = setctl.get_plugin_enabled(plugin_id) - name = info["localized_name"] - desc = info["description"] - text = u"%s" % name - self.store.append((plugin_id, enabled, "kupfer-object", text)) + self._refresh_plugin_list() self.output_debug("Standard Plugins: %d" % len(self.store)) self.table.show() self.pluglist_parent.add(self.table) @@ -230,6 +225,42 @@ class PreferencesWindowController (pretty.OutputMixin): pass def on_closebutton_clicked(self, widget): self.hide() + + def _refresh_plugin_list(self): + self.store.clear() + setctl = settings.GetSettingsController() + name_filter = kupferstring.tounicode(self.entry_plugins_filter.get_text()) + if name_filter: + self.plugin_list_timer.set_ms(300, self._show_focus_topmost_plugin) + else: + self.plugin_list_timer.invalidate() + + for info in self.plugin_info: + plugin_id = info["name"] + if setctl.get_plugin_is_hidden(plugin_id): + continue + enabled = setctl.get_plugin_enabled(plugin_id) + name = info["localized_name"] + desc = info["description"] + text = u"%s" % name + + if name_filter: + name_score = relevance.score(name.lower(), name_filter) + desc_score = relevance.score(desc.lower(), name_filter) + if name_score < 0.1 and desc_score < 0.9: + continue + + self.store.append((plugin_id, enabled, "kupfer-object", text)) + + def _show_focus_topmost_plugin(self): + try: + first_row = iter(self.store).next() + except StopIteration: + return + plugin_id = first_row[0] + self.show_focus_plugin(plugin_id) + + def on_checkplugin_toggled(self, cell, path): checkcol = self.columns.index("enabled") plugin_id = self._id_for_table_path(path) @@ -511,6 +542,9 @@ class PreferencesWindowController (pretty.OutputMixin): it = self.dir_store.get_iter(curpath) self.remove_directory_model(it, store=True) + def on_entry_plugins_filter_changed(self, widget): + self._refresh_plugin_list() + def dir_table_cursor_changed(self, table): curpath, curcol = table.get_cursor() if not curpath or not self.dir_store: