From b8b7242a4bea9c0eb6e42c9daf8b57d3ef62fd30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 28 Feb 2024 11:29:09 -0800 Subject: [PATCH 1/6] CategoryView: make search internal --- src/Views/CategoryView.vala | 49 +++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/Views/CategoryView.vala b/src/Views/CategoryView.vala index 6e7b0d2b5..043710a90 100644 --- a/src/Views/CategoryView.vala +++ b/src/Views/CategoryView.vala @@ -20,6 +20,7 @@ public class AppCenter.CategoryView : Adw.NavigationPage { public AppStream.Category category { get; construct; } + private Gtk.SearchEntry search_entry; private Gtk.Stack stack; private Gtk.ScrolledWindow scrolled; private Gtk.Box box; @@ -32,6 +33,11 @@ public class AppCenter.CategoryView : Adw.NavigationPage { } construct { + search_entry = new Gtk.SearchEntry () { + hexpand = true, + placeholder_text = _("Search %s").printf (category.name) + }; + recently_updated_flowbox = new SubcategoryFlowbox (_("Recently Updated")); paid_flowbox = new SubcategoryFlowbox (_("Paid Apps")); @@ -42,7 +48,8 @@ public class AppCenter.CategoryView : Adw.NavigationPage { margin_top = 12, margin_end = 12, margin_bottom = 24, - margin_start = 12 + margin_start = 12, + vexpand = true }; scrolled = new Gtk.ScrolledWindow () { @@ -60,7 +67,11 @@ public class AppCenter.CategoryView : Adw.NavigationPage { stack.add_child (spinner); stack.add_child (scrolled); - child = stack; + var main_box = new Gtk.Box (VERTICAL, 0); + main_box.append (search_entry); + main_box.append (stack); + + child = main_box; title = category.name; populate (); @@ -80,6 +91,12 @@ public class AppCenter.CategoryView : Adw.NavigationPage { AppCenterCore.Client.get_default ().installed_apps_changed.connect (() => { populate (); }); + + search_entry.search_changed.connect (() => { + recently_updated_flowbox.search_text = search_entry.text; + paid_flowbox.search_text = search_entry.text; + free_flowbox.search_text = search_entry.text; + }); } private void populate () { @@ -177,6 +194,7 @@ public class AppCenter.CategoryView : Adw.NavigationPage { private class SubcategoryFlowbox : Gtk.Box { public signal void show_package (AppCenterCore.Package package); + public string search_text { get; set; default = ""; } public string? label { get; construct; } public bool has_children { @@ -205,6 +223,7 @@ public class AppCenter.CategoryView : Adw.NavigationPage { valign = Gtk.Align.START }; flowbox.set_sort_func ((Gtk.FlowBoxSortFunc) package_row_compare); + flowbox.set_filter_func (filter_func); orientation = Gtk.Orientation.VERTICAL; @@ -221,6 +240,8 @@ public class AppCenter.CategoryView : Adw.NavigationPage { var row = (Widgets.ListPackageRowGrid) child.get_child (); show_package (row.package); }); + + notify["search-text"].connect (flowbox.invalidate_filter); } public void add_package (AppCenterCore.Package package) { @@ -249,5 +270,29 @@ public class AppCenter.CategoryView : Adw.NavigationPage { #endif return row1.package.get_name ().collate (row2.package.get_name ()); } + + private bool filter_func (Gtk.FlowBoxChild child) { + if (search_text == "") { + return true; + } + + _search_text = search_text.down (); + + var package = ((Widgets.ListPackageRowGrid) child.get_child ()).package; + + if (_search_text in package.get_name ().down ()) { + return true; + } + + if (_search_text in package.get_summary ().down ()) { + return true; + } + + if (_search_text in package.get_description ().down ()) { + return true; + } + + return false; + } } } From f2e14cde7815e2e8415685a27aa28874f6b402ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 28 Feb 2024 11:38:13 -0800 Subject: [PATCH 2/6] Move search matching to package --- src/Core/Package.vala | 26 ++++++++++++++++++++++++++ src/Views/CategoryView.vala | 21 +-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/Core/Package.vala b/src/Core/Package.vala index 6738f2a80..b6c527dac 100644 --- a/src/Core/Package.vala +++ b/src/Core/Package.vala @@ -967,4 +967,30 @@ public class AppCenterCore.Package : Object { backend_details = new PackageDetails (); } } + + public bool matches_search (string search_term) { + if (search_term == "") { + return true; + } + + var _search_term = search_term.down (); + + if (_search_term in get_name ().down ()) { + return true; + } + + if (_search_term in get_summary ().down ()) { + return true; + } + + if (_search_term in get_description ().down ()) { + return true; + } + + if (_search_term in component.get_keywords_table ()) { + return true; + } + + return false; + } } diff --git a/src/Views/CategoryView.vala b/src/Views/CategoryView.vala index 043710a90..6eb9f8185 100644 --- a/src/Views/CategoryView.vala +++ b/src/Views/CategoryView.vala @@ -272,27 +272,8 @@ public class AppCenter.CategoryView : Adw.NavigationPage { } private bool filter_func (Gtk.FlowBoxChild child) { - if (search_text == "") { - return true; - } - - _search_text = search_text.down (); - var package = ((Widgets.ListPackageRowGrid) child.get_child ()).package; - - if (_search_text in package.get_name ().down ()) { - return true; - } - - if (_search_text in package.get_summary ().down ()) { - return true; - } - - if (_search_text in package.get_description ().down ()) { - return true; - } - - return false; + return package.matches_search (search_text); } } } From 3b699626ecbfc9dc74dcdef39bf378e642bdf211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 28 Feb 2024 11:50:34 -0800 Subject: [PATCH 3/6] Simplify show/hide --- src/Views/CategoryView.vala | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/Views/CategoryView.vala b/src/Views/CategoryView.vala index 6eb9f8185..a7ec005f9 100644 --- a/src/Views/CategoryView.vala +++ b/src/Views/CategoryView.vala @@ -51,6 +51,9 @@ public class AppCenter.CategoryView : Adw.NavigationPage { margin_start = 12, vexpand = true }; + box.append (recently_updated_flowbox); + box.append (paid_flowbox); + box.append (free_flowbox); scrolled = new Gtk.ScrolledWindow () { child = box, @@ -101,10 +104,6 @@ public class AppCenter.CategoryView : Adw.NavigationPage { private void populate () { get_packages.begin ((obj, res) => { - while (box.get_first_child () != null) { - box.remove (box.get_first_child ()); - }; - recently_updated_flowbox.clear (); free_flowbox.clear (); paid_flowbox.clear (); @@ -157,17 +156,9 @@ public class AppCenter.CategoryView : Adw.NavigationPage { } } - if (recently_updated_flowbox.has_children) { - box.append (recently_updated_flowbox); - } - - if (paid_flowbox.has_children) { - box.append (paid_flowbox); - } - - if (free_flowbox.has_children) { - box.append (free_flowbox); - } + free_flowbox.visible = free_flowbox.has_children; + paid_flowbox.visible = paid_flowbox.has_children; + recently_updated_flowbox.visible = recently_updated_flowbox.has_children; stack.visible_child = scrolled; }); @@ -225,7 +216,8 @@ public class AppCenter.CategoryView : Adw.NavigationPage { flowbox.set_sort_func ((Gtk.FlowBoxSortFunc) package_row_compare); flowbox.set_filter_func (filter_func); - orientation = Gtk.Orientation.VERTICAL; + orientation = VERTICAL; + visible = false; if (label != null) { var header = new Granite.HeaderLabel (label) { @@ -241,7 +233,10 @@ public class AppCenter.CategoryView : Adw.NavigationPage { show_package (row.package); }); - notify["search-text"].connect (flowbox.invalidate_filter); + notify["search-text"].connect (() => { + flowbox.invalidate_filter (); + visible = has_children; + }); } public void add_package (AppCenterCore.Package package) { From 524679528e75a69ffa6f36710d244f715b7c78a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 28 Feb 2024 12:04:15 -0800 Subject: [PATCH 4/6] Style some things, forward keypresses --- data/styles/CategoryPage.scss | 10 +++++++ data/styles/Index.scss | 1 + src/Views/CategoryView.vala | 50 +++++++++++++++++++++++++++-------- 3 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 data/styles/CategoryPage.scss diff --git a/data/styles/CategoryPage.scss b/data/styles/CategoryPage.scss new file mode 100644 index 000000000..7ad0bb77d --- /dev/null +++ b/data/styles/CategoryPage.scss @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2023-2024 elementary, Inc. (https://elementary.io) + */ + +categorypage { + .header { + padding: rem(12px); + } +} diff --git a/data/styles/Index.scss b/data/styles/Index.scss index 12caa5d13..11e4bf0be 100644 --- a/data/styles/Index.scss +++ b/data/styles/Index.scss @@ -4,5 +4,6 @@ @import 'AppInfoView.scss'; @import 'Banner.scss'; @import 'Category.scss'; +@import 'CategoryPage.scss'; @import 'MainWindow.scss'; @import 'ProgressButton.scss'; diff --git a/src/Views/CategoryView.vala b/src/Views/CategoryView.vala index a7ec005f9..4bd0db6f6 100644 --- a/src/Views/CategoryView.vala +++ b/src/Views/CategoryView.vala @@ -22,8 +22,7 @@ public class AppCenter.CategoryView : Adw.NavigationPage { private Gtk.SearchEntry search_entry; private Gtk.Stack stack; - private Gtk.ScrolledWindow scrolled; - private Gtk.Box box; + private Gtk.Box main_box; private SubcategoryFlowbox free_flowbox; private SubcategoryFlowbox paid_flowbox; private SubcategoryFlowbox recently_updated_flowbox; @@ -32,19 +31,28 @@ public class AppCenter.CategoryView : Adw.NavigationPage { Object (category: category); } + class construct { + set_css_name ("categorypage"); + } + construct { search_entry = new Gtk.SearchEntry () { hexpand = true, placeholder_text = _("Search %s").printf (category.name) }; + var clamp = new Adw.Clamp () { + child = search_entry + }; + clamp.add_css_class ("header"); + recently_updated_flowbox = new SubcategoryFlowbox (_("Recently Updated")); paid_flowbox = new SubcategoryFlowbox (_("Paid Apps")); free_flowbox = new SubcategoryFlowbox (_("Free Apps")); - box = new Gtk.Box (Gtk.Orientation.VERTICAL, 48) { + var box = new Gtk.Box (Gtk.Orientation.VERTICAL, 48) { margin_top = 12, margin_end = 12, margin_bottom = 24, @@ -55,7 +63,7 @@ public class AppCenter.CategoryView : Adw.NavigationPage { box.append (paid_flowbox); box.append (free_flowbox); - scrolled = new Gtk.ScrolledWindow () { + var scrolled = new Gtk.ScrolledWindow () { child = box, hscrollbar_policy = Gtk.PolicyType.NEVER }; @@ -66,15 +74,15 @@ public class AppCenter.CategoryView : Adw.NavigationPage { }; spinner.start (); + main_box = new Gtk.Box (VERTICAL, 0); + main_box.append (clamp); + main_box.append (scrolled); + stack = new Gtk.Stack (); stack.add_child (spinner); - stack.add_child (scrolled); - - var main_box = new Gtk.Box (VERTICAL, 0); - main_box.append (search_entry); - main_box.append (stack); + stack.add_child (main_box); - child = main_box; + child = stack; title = category.name; populate (); @@ -100,6 +108,26 @@ public class AppCenter.CategoryView : Adw.NavigationPage { paid_flowbox.search_text = search_entry.text; free_flowbox.search_text = search_entry.text; }); + + // Forward only printable keys, not navigation keys + var eventcontrollerkey = new Gtk.EventControllerKey (); + eventcontrollerkey.key_pressed.connect ((keyval, keycode, state) => { + var mods = state & Gtk.accelerator_get_default_mod_mask (); + var is_printable_char = ((unichar) Gdk.keyval_to_unicode (keyval)).isprint (); + + if ( + (is_printable_char && mods == 0) || + (is_printable_char && mods == SHIFT_MASK) + ) { + eventcontrollerkey.forward (search_entry.get_delegate ()); + search_entry.grab_focus (); + return Gdk.EVENT_STOP; + } + + return Gdk.EVENT_PROPAGATE; + }); + + add_controller (eventcontrollerkey); } private void populate () { @@ -160,7 +188,7 @@ public class AppCenter.CategoryView : Adw.NavigationPage { paid_flowbox.visible = paid_flowbox.has_children; recently_updated_flowbox.visible = recently_updated_flowbox.has_children; - stack.visible_child = scrolled; + stack.visible_child = main_box; }); } From 1f880bc2f810b4f3a4a1263f3807d652b05d09a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 28 Feb 2024 12:11:54 -0800 Subject: [PATCH 5/6] Hide search on other pages --- src/MainWindow.vala | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 25b7bfabb..17f188a2e 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -402,20 +402,14 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { if (leaflet.visible_child is Homepage) { view_mode_revealer.reveal_child = true; - configure_search (true, _("Search Apps"), ""); + configure_search (true, true); } else if (leaflet.visible_child is CategoryView) { var current_category = ((CategoryView) leaflet.visible_child).category; view_mode_revealer.reveal_child = false; - configure_search (true, _("Search %s").printf (current_category.name), ""); + configure_search (false); } else if (leaflet.visible_child == search_view) { - if (previous_child is CategoryView) { - var previous_category = ((CategoryView) previous_child).category; - configure_search (true, _("Search %s").printf (previous_category.name)); - view_mode_revealer.reveal_child = false; - } else { - configure_search (true); - view_mode_revealer.reveal_child = true; - } + configure_search (true); + view_mode_revealer.reveal_child = true; } else if (leaflet.visible_child is Views.AppInfoView) { view_mode_revealer.reveal_child = false; configure_search (false); @@ -545,11 +539,11 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { return_button.visible = return_name != null; } - private void configure_search (bool sensitive, string? placeholder_text = _("Search Apps"), string? search_term = null) { + private void configure_search (bool sensitive, bool? clear = false) { search_entry.sensitive = sensitive; - search_entry.placeholder_text = placeholder_text; + search_entry.visible = sensitive; - if (search_term != null) { + if (clear) { search_entry.text = ""; } From 3c4cc22ce351f671d53e4d4e8749f47e19646a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 23 May 2024 09:28:49 -0700 Subject: [PATCH 6/6] Fix bad merge --- src/MainWindow.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index d72d96d7a..b784160e0 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -370,7 +370,7 @@ public class AppCenter.MainWindow : Gtk.ApplicationWindow { if (navigation_view.visible_page is Homepage) { view_mode_revealer.reveal_child = true; - configure_search (true, _("Search Apps"), ""); + configure_search (true); } else if (navigation_view.visible_page is CategoryView) { var current_category = ((CategoryView) navigation_view.visible_page).category; view_mode_revealer.reveal_child = false;