[gtk/iconbrowser-fix] iconbrowser: fix search<>category interaction
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/iconbrowser-fix] iconbrowser: fix search<>category interaction
- Date: Fri, 5 Mar 2021 00:32:43 +0000 (UTC)
commit d3d49ce7f1c2ddd37fab507d5b3b479a6fc232ff
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Mar 4 16:13:46 2021 -0500
iconbrowser: fix search<>category interaction
Make search act like a separate, filtered view of
all icons. This is how it worked in gtk3, and how
it should be.
Fixes: #3717
demos/icon-browser/iconbrowserwin.c | 29 +++++++++++++++++++++++++++
demos/icon-browser/window.ui | 39 ++++++++++++++++++++++++-------------
2 files changed, 55 insertions(+), 13 deletions(-)
---
diff --git a/demos/icon-browser/iconbrowserwin.c b/demos/icon-browser/iconbrowserwin.c
index 11c9c53234..4dbc054057 100644
--- a/demos/icon-browser/iconbrowserwin.c
+++ b/demos/icon-browser/iconbrowserwin.c
@@ -14,8 +14,10 @@ struct _IconBrowserWindow
GtkWidget *searchbar;
GListModel *icon_filter_model;
GListStore *icon_store;
+ GListModel *context_model;
GListStore *context_store;
GtkFilter *name_filter;
+ GtkFilter *search_mode_filter;
GtkWidget *details;
GtkWidget *image1;
GtkWidget *image2;
@@ -354,6 +356,28 @@ setup_scalable_image_dnd (GtkWidget *image)
gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (source));
}
+static void
+search_mode_toggled (GtkSearchBar *searchbar,
+ GParamSpec *pspec,
+ IconBrowserWindow *win)
+{
+ if (gtk_search_bar_get_search_mode (searchbar))
+ gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (win->context_model), GTK_INVALID_LIST_POSITION);
+ else if (gtk_single_selection_get_selected (GTK_SINGLE_SELECTION (win->context_model)) ==
GTK_INVALID_LIST_POSITION)
+ gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (win->context_model), 0);
+
+ gtk_filter_changed (win->search_mode_filter, GTK_FILTER_CHANGE_DIFFERENT);
+}
+
+static void
+selected_name_changed (GtkSingleSelection *selection,
+ GParamSpec *pspec,
+ IconBrowserWindow *win)
+{
+ if (gtk_single_selection_get_selected (selection) != GTK_INVALID_LIST_POSITION)
+ gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (win->searchbar), FALSE);
+}
+
static void
icon_browser_window_init (IconBrowserWindow *win)
{
@@ -380,6 +404,9 @@ icon_browser_window_init (IconBrowserWindow *win)
win->name_filter = GTK_FILTER (gtk_custom_filter_new (filter_by_icon_name, NULL, NULL));
gtk_multi_filter_append (GTK_MULTI_FILTER (filter), g_object_ref (win->name_filter));
+
+ g_signal_connect (win->searchbar, "notify::search-mode-enabled", G_CALLBACK (search_mode_toggled), win);
+ g_signal_connect (win->context_model, "notify::selected", G_CALLBACK (selected_name_changed), win);
}
static void
@@ -409,6 +436,7 @@ icon_browser_window_class_init (IconBrowserWindowClass *class)
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, searchbar);
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, icon_store);
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, icon_filter_model);
+ gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, context_model);
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, context_store);
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, details);
@@ -422,6 +450,7 @@ icon_browser_window_class_init (IconBrowserWindowClass *class)
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, image8);
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, label8);
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, description);
+ gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, search_mode_filter);
gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), item_activated);
gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), copy_to_clipboard);
diff --git a/demos/icon-browser/window.ui b/demos/icon-browser/window.ui
index 59685dbb57..17d745c218 100644
--- a/demos/icon-browser/window.ui
+++ b/demos/icon-browser/window.ui
@@ -151,19 +151,32 @@
</object>
</child>
<child>
- <object class="GtkStringFilter">
- <property name="ignore-case">0</property>
- <property name="match-mode">exact</property>
- <property name="expression">
- <lookup name="context" type="IbIcon"/>
- </property>
- <binding name="search">
- <lookup name="id" type="IbContext">
- <lookup name="selected-item" type="GtkSingleSelection">
- context_model
- </lookup>
- </lookup>
- </binding>
+ <object class="GtkAnyFilter">
+ <child>
+ <object class="GtkBoolFilter" id="search_mode_filter">
+ <property name="expression">
+ <lookup name="search-mode-enabled">
+ searchbar
+ </lookup>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStringFilter">
+ <property name="ignore-case">0</property>
+ <property name="match-mode">exact</property>
+ <property name="expression">
+ <lookup name="context" type="IbIcon"/>
+ </property>
+ <binding name="search">
+ <lookup name="id" type="IbContext">
+ <lookup name="selected-item" type="GtkSingleSelection">
+ context_model
+ </lookup>
+ </lookup>
+ </binding>
+ </object>
+ </child>
</object>
</child>
</object>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]