[gtk/iconbrowser-fix] iconbrowser: fix search<>category interaction




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]