From 409a2ca7b24011c71de4b2ae17517422333387ba Mon Sep 17 00:00:00 2001 From: Artem Proskurnev Date: Wed, 24 Jun 2026 21:06:30 +0300 Subject: [PATCH] Added a filter to the list of models The list of models is always very long and it is difficult to find the right one. Added a filter field that helps you select only the necessary models from the list. --- newprinter.py | 52 +++++++++++++++++++++++++++--------- po/ru.po | 8 ++++++ po/system-config-printer.pot | 8 ++++++ ui/NewPrinterWindow.ui | 43 +++++++++++++++++++++++------ 4 files changed, 91 insertions(+), 20 deletions(-) diff --git a/newprinter.py b/newprinter.py index 3d3b49bfb..2d28121f1 100644 --- a/newprinter.py +++ b/newprinter.py @@ -285,6 +285,7 @@ def __init__(self): "ntbkPPDSource", "rbtnNPPPD", "tvNPMakes", + "entryNPModelsSearch", "rbtnNPFoomatic", "filechooserPPD", "rbtnNPDownloadableDriverSearch", @@ -394,6 +395,13 @@ def __init__(self): treeview.append_column(column) treeview.get_selection().set_mode(selection_mode) + # Set up filter for Models list + self.models_liststore = self.tvNPModels.get_model() + self.models_filter = self.models_liststore.filter_new() + self.models_filter.set_visible_func(self.models_visible_func) + self.tvNPModels.set_model(self.models_filter) + self.entryNPModelsSearch.connect("changed", self.on_entryNPModelsSearch_changed) + # Since some dialogs are reused we can't let the delete-event's # default handler destroy them self.SMBBrowseDialog.connect ("delete-event", on_delete_just_hide) @@ -1356,11 +1364,12 @@ def _handlePrinterInstallationMode (self, step): # is available, based on the model the user has # selected. try: - model, iter = self.tvNPModels.get_selection ().\ - get_selected () - name = model.get(iter, 0)[0] - name = self.makeNameUnique (name) - self.entNPName.set_text (name) + selection = self.tvNPModels.get_selection () + model, iter = selection.get_selected () + if iter is not None: + name = model.get(iter, 0)[0] + name = self.makeNameUnique (name) + self.entNPName.set_text (name) except: nonfatalException () @@ -3866,11 +3875,27 @@ def on_tvNPMakes_cursor_changed(self, tvNPMakes): self.recommended_make_selected = recommended_make self.fillModelList() + def models_visible_func(self, model, iter, data): + """Filter function for models list.""" + search_text = self.entryNPModelsSearch.get_text().lower() + if not search_text: + return True + # Check both the display text (column 0) and the actual model name (column 1) + display_text = model.get(iter, 0)[0].lower() + model_name = model.get(iter, 1)[0].lower() + return search_text in display_text or search_text in model_name + + def on_entryNPModelsSearch_changed(self, entry): + """Handle search text changes.""" + if self.models_filter: + self.models_filter.refilter() + def fillModelList(self): self.recommended_model_selected = False + self.entryNPModelsSearch.set_text("") # Clear filter when make changes models = self.ppds.getModels(self.NPMake) - model = self.tvNPModels.get_model() - model.clear() + # Clear the underlying liststore, not the filter model + self.models_liststore.clear() selected = False is_auto_make = (cupshelpers.ppds.normalize (self.NPMake) == cupshelpers.ppds.normalize (self.auto_make)) @@ -3886,12 +3911,15 @@ def fillModelList(self): else: text = pmodel - iter = model.append((text, pmodel,)) + iter = self.models_liststore.append((text, pmodel,)) if recommended: - path = model.get_path(iter) - self.tvNPModels.set_cursor (path, None, False) - self.tvNPModels.scroll_to_cell(path, None, - True, 0.5, 0.5) + # Get the path in the filter model, not the liststore + child_path = self.models_liststore.get_path(iter) + filter_path = self.models_filter.convert_child_path_to_path(child_path) + if filter_path is not None: + self.tvNPModels.set_cursor (filter_path, None, False) + self.tvNPModels.scroll_to_cell(filter_path, None, + True, 0.5, 0.5) selected = True if not selected: self.tvNPModels.set_cursor (Gtk.TreePath(), None, False) diff --git a/po/ru.po b/po/ru.po index 363494f6e..2354170d6 100644 --- a/po/ru.po +++ b/po/ru.po @@ -4112,6 +4112,14 @@ msgstr "Апплет очереди печати" msgid "System tray icon for managing print jobs" msgstr "Значок на панели задач для управления заданиями печати" +#: ../ui/NewPrinterWindow.ui:1938 +msgid "Filter models..." +msgstr "Модель..." + +#: ../ui/NewPrinterWindow.ui:1940 +msgid "Type to filter the list of printer models" +msgstr "Введите текст для фильтрации списка моделей" + #~ msgid "Option '%s' has value '%s' and cannot be edited." #~ msgstr "Параметр «%s» имеет значение «%s» и не может быть изменён." diff --git a/po/system-config-printer.pot b/po/system-config-printer.pot index 956f4f953..9cf69957e 100644 --- a/po/system-config-printer.pot +++ b/po/system-config-printer.pot @@ -2939,6 +2939,14 @@ msgstr "" msgid "_Forward" msgstr "" +#: ../ui/NewPrinterWindow.ui.h:107 +msgid "Filter models..." +msgstr "" + +#: ../ui/NewPrinterWindow.ui.h:108 +msgid "Type to filter the list of printer models" +msgstr "" + #: ../ui/PrinterPropertiesDialog.ui.h:1 msgid "Printer Properties" msgstr "" diff --git a/ui/NewPrinterWindow.ui b/ui/NewPrinterWindow.ui index ce9aab4e4..774960f09 100644 --- a/ui/NewPrinterWindow.ui +++ b/ui/NewPrinterWindow.ui @@ -1927,20 +1927,47 @@ ipp://printer.mydomain/ipp True True - - 250 + True - True - in + False + vertical + 6 - + True True - - - + Filter models... + Type to filter the list of printer models + + + + False + True + 0 + + + + + 250 + True + True + in + + + True + True + + + + + + + True + True + 1 +