From df05b0ba8effbc5c5b2f3d5ca28409efaa8af72b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 29 Oct 2026 13:19:56 -0700 Subject: [PATCH 1/5] SearchView: use FilterModel --- src/SearchView.vala | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/SearchView.vala b/src/SearchView.vala index d6f7fd1d..00ef420b 100644 --- a/src/SearchView.vala +++ b/src/SearchView.vala @@ -30,6 +30,10 @@ public class Switchboard.SearchView : Granite.Bin { construct { list_store = new ListStore (typeof (SearchRow)); + var filter_model = new Gtk.FilterListModel (list_store, new Gtk.CustomFilter (filter_func)) { + incremental = true + }; + var alert_view = new Granite.Placeholder ("") { description = _("Try changing search terms."), icon = new ThemedIcon ("edit-find-symbolic") @@ -40,10 +44,9 @@ public class Switchboard.SearchView : Granite.Bin { listbox = new Gtk.ListBox () { selection_mode = BROWSE }; - listbox.bind_model (list_store, (obj) => (SearchRow) obj); + listbox.bind_model (filter_model, (obj) => (SearchRow) obj); listbox.add_css_class (Granite.STYLE_CLASS_BACKGROUND); listbox.add_css_class (Granite.STYLE_CLASS_RICH_LIST); - listbox.set_filter_func (filter_func); listbox.set_sort_func (sort_func); listbox.set_placeholder (alert_view); @@ -55,7 +58,7 @@ public class Switchboard.SearchView : Granite.Bin { alert_view.title = _("No Results for “%s”").printf (search_entry.text); if (search_entry.text.length > 0) { - listbox.invalidate_filter (); + filter_model.filter.changed (DIFFERENT); listbox.invalidate_sort (); listbox.select_row (null); } @@ -75,15 +78,15 @@ public class Switchboard.SearchView : Granite.Bin { listbox.get_row_at_y (0).activate (); } - private bool filter_func (Gtk.ListBoxRow listbox_row) { + private bool filter_func (Object object) { var search_text = search_entry.text; if (search_text == "" || search_text == null) { return true; } - bool valid = search_text.down () in ((SearchRow) listbox_row).last_item.down (); + bool valid = search_text.down () in ((SearchRow) object).last_item.down (); if (valid) { - ((SearchRow) listbox_row).pattern = search_entry.text; + ((SearchRow) object).pattern = search_entry.text; } return valid; From 3c376fc3d5803a0e96123245ddc61c8c48d7f47e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 29 Oct 2026 13:44:05 -0700 Subject: [PATCH 2/5] Accept ascii alts --- src/SearchView.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SearchView.vala b/src/SearchView.vala index 00ef420b..49995f75 100644 --- a/src/SearchView.vala +++ b/src/SearchView.vala @@ -84,7 +84,7 @@ public class Switchboard.SearchView : Granite.Bin { return true; } - bool valid = search_text.down () in ((SearchRow) object).last_item.down (); + bool valid = search_text.match_string (((SearchRow) object).last_item, true); if (valid) { ((SearchRow) object).pattern = search_entry.text; } From c87d358e92db0eee512bd35a972bf637abba987a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 29 Oct 2026 13:56:12 -0700 Subject: [PATCH 3/5] Go faster with filter change --- src/CategoryView.vala | 3 ++- src/SearchView.vala | 50 +++++++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/CategoryView.vala b/src/CategoryView.vala index e06dde62..55648091 100644 --- a/src/CategoryView.vala +++ b/src/CategoryView.vala @@ -41,7 +41,7 @@ public class Switchboard.CategoryView : Adw.NavigationPage { title_widget = search_clamp }; - var searchview = new SearchView (search_box); + var searchview = new SearchView (); var alert_view = new Granite.Placeholder (_("No Settings Found")) { description = _("Install settings plugins and re-launch System Settings."), @@ -107,6 +107,7 @@ public class Switchboard.CategoryView : Adw.NavigationPage { search_box.search_changed.connect (() => { if (search_box.text.length > 0) { stack.visible_child = searchview; + searchview.query = search_box.text; } else { stack.visible_child = category_box; } diff --git a/src/SearchView.vala b/src/SearchView.vala index 49995f75..8fb7e27d 100644 --- a/src/SearchView.vala +++ b/src/SearchView.vala @@ -18,23 +18,41 @@ */ public class Switchboard.SearchView : Granite.Bin { - public Gtk.SearchEntry search_entry { get; construct; } - private Gtk.ListBox listbox; + private string _query = ""; + public string query { + get { + return _query; + } + set { + Gtk.FilterChange filter_change = DIFFERENT; + if (value.has_prefix (query)) { + filter_change = MORE_STRICT; + } - private ListStore list_store; + _query = value; - public SearchView (Gtk.SearchEntry search_entry) { - Object (search_entry: search_entry); + alert_view.title = _("No Results for “%s”").printf (query); + + filter_model.filter.changed (filter_change); + listbox.invalidate_sort (); + listbox.select_row (null); + } } + private Granite.Placeholder alert_view; + private Gtk.ListBox listbox; + private Gtk.FilterListModel filter_model; + + private ListStore list_store; + construct { list_store = new ListStore (typeof (SearchRow)); - var filter_model = new Gtk.FilterListModel (list_store, new Gtk.CustomFilter (filter_func)) { + filter_model = new Gtk.FilterListModel (list_store, new Gtk.CustomFilter (filter_func)) { incremental = true }; - var alert_view = new Granite.Placeholder ("") { + alert_view = new Granite.Placeholder ("") { description = _("Try changing search terms."), icon = new ThemedIcon ("edit-find-symbolic") }; @@ -54,23 +72,13 @@ public class Switchboard.SearchView : Granite.Bin { load_plugs.begin (); - search_entry.search_changed.connect (() => { - alert_view.title = _("No Results for “%s”").printf (search_entry.text); - - if (search_entry.text.length > 0) { - filter_model.filter.changed (DIFFERENT); - listbox.invalidate_sort (); - listbox.select_row (null); - } - }); - listbox.row_activated.connect ((row) => { app.load_setting_path ( ((SearchRow) row).uri.replace ("settings://", ""), Switchboard.PlugsManager.get_default () ); - search_entry.text = ""; + query = ""; }); } @@ -79,21 +87,21 @@ public class Switchboard.SearchView : Granite.Bin { } private bool filter_func (Object object) { - var search_text = search_entry.text; + var search_text = query; if (search_text == "" || search_text == null) { return true; } bool valid = search_text.match_string (((SearchRow) object).last_item, true); if (valid) { - ((SearchRow) object).pattern = search_entry.text; + ((SearchRow) object).pattern = query; } return valid; } private int sort_func (Gtk.ListBoxRow row1, Gtk.ListBoxRow row2) { - var search_text = search_entry.text.down (); + var search_text = query.down (); var row1_label = ((SearchRow) row1).last_item.down (); var row2_label = ((SearchRow) row2).last_item.down (); From 970742fdd41f82fa847539d79c1858d01894dda8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 29 Oct 2026 13:58:45 -0700 Subject: [PATCH 4/5] Fix clearing --- src/CategoryView.vala | 4 ++++ src/SearchView.vala | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/CategoryView.vala b/src/CategoryView.vala index 55648091..15c5521d 100644 --- a/src/CategoryView.vala +++ b/src/CategoryView.vala @@ -104,6 +104,10 @@ public class Switchboard.CategoryView : Adw.NavigationPage { search_box.sensitive = false; } + searchview.row_activated.connect (() => { + search_box.text = ""; + }); + search_box.search_changed.connect (() => { if (search_box.text.length > 0) { stack.visible_child = searchview; diff --git a/src/SearchView.vala b/src/SearchView.vala index 8fb7e27d..a1261014 100644 --- a/src/SearchView.vala +++ b/src/SearchView.vala @@ -18,6 +18,8 @@ */ public class Switchboard.SearchView : Granite.Bin { + public signal void row_activated (); + private string _query = ""; public string query { get { @@ -78,7 +80,7 @@ public class Switchboard.SearchView : Granite.Bin { Switchboard.PlugsManager.get_default () ); - query = ""; + row_activated (); }); } From 86d928aa908dde4e0105d4541cab9b81f71dc01b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 29 Oct 2026 14:00:08 -0700 Subject: [PATCH 5/5] cleanup --- src/SearchView.vala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/SearchView.vala b/src/SearchView.vala index a1261014..8dde924c 100644 --- a/src/SearchView.vala +++ b/src/SearchView.vala @@ -89,12 +89,11 @@ public class Switchboard.SearchView : Granite.Bin { } private bool filter_func (Object object) { - var search_text = query; - if (search_text == "" || search_text == null) { + if (query == "" || query == null) { return true; } - bool valid = search_text.match_string (((SearchRow) object).last_item, true); + bool valid = query.match_string (((SearchRow) object).last_item, true); if (valid) { ((SearchRow) object).pattern = query; }