summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-03-04 16:13:46 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-03-04 19:30:02 -0500
commitd3d49ce7f1c2ddd37fab507d5b3b479a6fc232ff (patch)
tree2d1a28f639af9e76ef0c05dfe7fa7f28661b6604
parent053d7cfe9ff20f54387022f562529983c2871705 (diff)
downloadgtk+-d3d49ce7f1c2ddd37fab507d5b3b479a6fc232ff.tar.gz
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
-rw-r--r--demos/icon-browser/iconbrowserwin.c29
-rw-r--r--demos/icon-browser/window.ui39
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;
@@ -355,6 +357,28 @@ setup_scalable_image_dnd (GtkWidget *image)
}
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)
{
GtkFilter *filter;
@@ -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>