Skip to content

Commit

Permalink
installed-page: Add local search
Browse files Browse the repository at this point in the history
  • Loading branch information
oscfdezdz committed Sep 28, 2024
1 parent 37bee78 commit 5a81f95
Show file tree
Hide file tree
Showing 9 changed files with 323 additions and 64 deletions.
16 changes: 9 additions & 7 deletions src/exm-browse-page.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,14 @@

#include "exm-browse-page.h"

#include "exm-config.h"
#include "exm-search-row.h"

#include "exm-utils.h"
#include "local/exm-manager.h"

#include "web/exm-search-provider.h"
#include "web/exm-image-resolver.h"

#include "web/exm-search-provider.h"
#include "web/model/exm-search-result.h"

#include "exm-config.h"
#include "exm-utils.h"

#include <glib/gi18n.h>

struct _ExmBrowsePage
Expand Down Expand Up @@ -123,6 +119,12 @@ exm_browse_page_set_property (GObject *object,
}
}

GtkSearchEntry *
exm_browse_page_get_search_entry (ExmBrowsePage *self)
{
return self->search_entry;
}

static GtkWidget *
search_widget_factory (ExmSearchResult *result,
ExmBrowsePage *self)
Expand Down
6 changes: 5 additions & 1 deletion src/exm-browse-page.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ G_BEGIN_DECLS

G_DECLARE_FINAL_TYPE (ExmBrowsePage, exm_browse_page, EXM, BROWSE_PAGE, GtkWidget)

ExmBrowsePage *exm_browse_page_new (void);
ExmBrowsePage *
exm_browse_page_new (void);

GtkSearchEntry *
exm_browse_page_get_search_entry (ExmBrowsePage *self);

G_END_DECLS
5 changes: 5 additions & 0 deletions src/exm-help-overlay.blp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ ShortcutsWindow help_overlay {
accelerator: "<Alt>2";
}

ShortcutsShortcut {
title: C_("shortcut window", "Toggle Search");
accelerator: "<Primary>F";
}

ShortcutsShortcut {
title: C_("shortcut window", "Show Keyboard Shortcuts");
action-name: "win.show-help-overlay";
Expand Down
126 changes: 88 additions & 38 deletions src/exm-installed-page.blp
Original file line number Diff line number Diff line change
Expand Up @@ -4,60 +4,110 @@ using Adw 1;
template $ExmInstalledPage: Gtk.Widget {
notify::manager => $on_bind_manager();

Gtk.Box {
orientation: vertical;
Gtk.Stack stack {
transition-type: crossfade;
vexpand: true;

Adw.Banner updates_banner {
button-label: _("_Log Out…");
action-name: "app.logout";
}
Gtk.StackPage page_list {
name: "page_list";

Adw.PreferencesPage {
Adw.PreferencesGroup {
Adw.SwitchRow global_toggle {
[prefix]
Gtk.Image {
icon-name: 'puzzle-piece-symbolic';
}
child: Gtk.Box {
orientation: vertical;

title: _("Use Extensions");
subtitle: _("Extensions can cause performance and stability issues");
Adw.Banner updates_banner {
button-label: _("_Log Out…");
action-name: "app.logout";
}
}

Adw.PreferencesGroup user_list {
title: _("User-Installed Extensions");
Adw.PreferencesPage {
Adw.PreferencesGroup {
Adw.SwitchRow global_toggle {
[prefix]
Gtk.Image {
icon-name: 'puzzle-piece-symbolic';
}

Gtk.ListBox user_list_box {
styles [
"boxed-list",
"boxed-list-placeholder"
]
title: _("Use Extensions");
subtitle: _("Extensions can cause performance and stability issues");
}
}

Adw.PreferencesGroup user_list {
title: _("User-Installed Extensions");

Gtk.ListBox user_list_box {
styles [
"boxed-list",
"boxed-list-placeholder"
]

selection-mode: none;

accessibility {
labelled-by: user_list;
}
}
}

Adw.PreferencesGroup system_list {
title: _("System Extensions");

selection-mode: none;
Gtk.ListBox system_list_box {
styles [
"boxed-list",
"boxed-list-placeholder"
]

accessibility {
labelled-by: user_list;
selection-mode: none;

accessibility {
labelled-by: system_list;
}
}
}
}
}
};
}

Adw.PreferencesGroup system_list {
title: _("System Extensions");
Gtk.StackPage {
name: "page_results";

Gtk.ListBox system_list_box {
styles [
"boxed-list",
"boxed-list-placeholder"
]
child: Adw.PreferencesPage {
Adw.PreferencesGroup {
Gtk.ListBox search_list_box {
styles [
"boxed-list"
]

selection-mode: none;
selection-mode: none;

accessibility {
labelled-by: system_list;
accessibility {
label: _("Search Results");
}
}
}
}
};
}

Gtk.StackPage {
name: "page_empty";

child: Adw.StatusPage {
icon-name: "edit-find-symbolic";
title: _("No Results Found");
description: _("Try a different search or search online");

child: Gtk.Button {
styles [
"pill"
]

label: _("_Search Online");
use-underline: true;
halign: center;
action-name: "win.search-online";
};
};
}
}
}
85 changes: 80 additions & 5 deletions src/exm-installed-page.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
#include "exm-installed-page.h"

#include "exm-extension-row.h"

#include "local/exm-manager.h"
#include "exm-config.h"
#include "exm-enums.h"
#include "exm-extension-row.h"
#include "exm-types.h"

#include "exm-config.h"
#include "exm-window.h"
#include "local/exm-manager.h"

#include <glib/gi18n.h>

Expand All @@ -17,10 +16,13 @@ struct _ExmInstalledPage
ExmManager *manager;

// Template Widgets
GtkStack *stack;
AdwBanner *updates_banner;
AdwSwitchRow *global_toggle;
GtkListBox *user_list_box;
GtkListBox *system_list_box;
GtkListBox *search_list_box;
GtkFilterListModel *search_list_model;

gboolean sort_enabled_first;
};
Expand Down Expand Up @@ -100,6 +102,18 @@ exm_installed_page_set_property (GObject *object,
}
}

GtkStack *
exm_installed_page_get_stack (ExmInstalledPage *self)
{
return self->stack;
}

GtkFilterListModel *
exm_installed_page_get_search_list_model (ExmInstalledPage *self)
{
return self->search_list_model;
}

static GtkWidget *
widget_factory (ExmExtension *extension,
ExmInstalledPage *self)
Expand Down Expand Up @@ -135,15 +149,48 @@ compare_enabled (ExmExtension *this, ExmExtension *other)
return 1;
}

static void
on_search_changed (GtkSearchEntry *search_entry,
gpointer user_data)
{
GtkStringFilter *search_filter = (GtkStringFilter *)user_data;

gtk_string_filter_set_search (search_filter, gtk_editable_get_text (GTK_EDITABLE (search_entry)));
}

static void
on_visible_stack_changed (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
ExmInstalledPage *self = (ExmInstalledPage *) user_data;
ExmWindow *window;
gboolean search_mode;

window = EXM_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (self), EXM_TYPE_WINDOW));
search_mode = gtk_search_bar_get_search_mode (exm_window_get_search_bar (window));

if (search_mode && g_list_model_get_n_items (G_LIST_MODEL (self->search_list_model)) > 0)
gtk_stack_set_visible_child_name (self->stack , "page_results");
else if (search_mode)
gtk_stack_set_visible_child_name (self->stack , "page_empty");
else
gtk_stack_set_visible_child_name (self->stack , "page_list");
}

static void
bind_list_box (GListModel *model,
ExmInstalledPage *self)
{
GtkExpression *expression;
GtkStringSorter *alphabetical_sorter;
GtkSortListModel *sorted_model;
GtkStringFilter *search_filter;
GtkBoolFilter *is_user_filter;
GtkFilterListModel *filtered_model;
ExmWindow *window;
GtkSearchEntry *search_entry;
const gchar *search_text = NULL;

g_return_if_fail (G_IS_LIST_MODEL (model));

Expand All @@ -170,6 +217,13 @@ bind_list_box (GListModel *model,
sorted_model = gtk_sort_list_model_new (model, GTK_SORTER (alphabetical_sorter));
}

search_filter = gtk_string_filter_new (expression);
self->search_list_model = gtk_filter_list_model_new (G_LIST_MODEL (sorted_model), GTK_FILTER (search_filter));

gtk_list_box_bind_model (self->search_list_box, G_LIST_MODEL (self->search_list_model),
(GtkListBoxCreateWidgetFunc) widget_factory,
self, NULL);

// Filter by user/system extension
expression = gtk_property_expression_new (EXM_TYPE_EXTENSION, NULL, "is-user");
is_user_filter = gtk_bool_filter_new (expression);
Expand All @@ -186,6 +240,24 @@ bind_list_box (GListModel *model,
gtk_list_box_bind_model (self->system_list_box, G_LIST_MODEL (filtered_model),
(GtkListBoxCreateWidgetFunc) widget_factory,
self, NULL);

window = EXM_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (self), EXM_TYPE_WINDOW));
search_entry = GTK_SEARCH_ENTRY (gtk_search_bar_get_child (exm_window_get_search_bar (window)));
search_text = gtk_editable_get_text (GTK_EDITABLE (search_entry));

// Refilter when sort-enabled-first changes and there is an ongoing search
if (search_text)
gtk_string_filter_set_search (search_filter, search_text);

g_signal_connect (search_entry,
"search-changed",
G_CALLBACK (on_search_changed),
search_filter);

g_signal_connect (self->search_list_model,
"notify::n-items",
G_CALLBACK (on_visible_stack_changed),
self);
}

static guint
Expand Down Expand Up @@ -282,10 +354,13 @@ exm_installed_page_class_init (ExmInstalledPageClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);

gtk_widget_class_set_template_from_resource (widget_class, "/com/mattjakeman/ExtensionManager/exm-installed-page.ui");

gtk_widget_class_bind_template_child (widget_class, ExmInstalledPage, stack);
gtk_widget_class_bind_template_child (widget_class, ExmInstalledPage, updates_banner);
gtk_widget_class_bind_template_child (widget_class, ExmInstalledPage, global_toggle);
gtk_widget_class_bind_template_child (widget_class, ExmInstalledPage, user_list_box);
gtk_widget_class_bind_template_child (widget_class, ExmInstalledPage, system_list_box);
gtk_widget_class_bind_template_child (widget_class, ExmInstalledPage, search_list_box);

gtk_widget_class_bind_template_callback (widget_class, on_bind_manager);

Expand Down
9 changes: 8 additions & 1 deletion src/exm-installed-page.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ G_BEGIN_DECLS

G_DECLARE_FINAL_TYPE (ExmInstalledPage, exm_installed_page, EXM, INSTALLED_PAGE, GtkWidget)

ExmInstalledPage *exm_installed_page_new (void);
ExmInstalledPage *
exm_installed_page_new (void);

GtkStack *
exm_installed_page_get_stack (ExmInstalledPage *self);

GtkFilterListModel *
exm_installed_page_get_search_list_model (ExmInstalledPage *self);

G_END_DECLS
Loading

0 comments on commit 5a81f95

Please sign in to comment.