[gtk+] icon-browser: Add search



commit fcdec5ac414095e7143ea9721882baa82c52445e
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Oct 31 22:28:17 2014 -0400

    icon-browser: Add search
    
    Most of the code was already in place, just some loose ends
    to fix up.

 demos/icon-browser/iconbrowserwin.c |   49 +++++++++++++++++++++++++----------
 demos/icon-browser/window.ui        |    6 +++-
 2 files changed, 39 insertions(+), 16 deletions(-)
---
diff --git a/demos/icon-browser/iconbrowserwin.c b/demos/icon-browser/iconbrowserwin.c
index 12bd24f..39db096 100644
--- a/demos/icon-browser/iconbrowserwin.c
+++ b/demos/icon-browser/iconbrowserwin.c
@@ -1,3 +1,4 @@
+#include <string.h>
 #include "iconbrowserapp.h"
 #include "iconbrowserwin.h"
 #include <gtk/gtk.h>
@@ -51,7 +52,7 @@ enum {
 G_DEFINE_TYPE(IconBrowserWindow, icon_browser_window, GTK_TYPE_APPLICATION_WINDOW);
 
 static void
-search_text_changed (GtkEntry *entry)
+search_text_changed (GtkEntry *entry, IconBrowserWindow *win)
 {
   const gchar *text;
 
@@ -59,6 +60,8 @@ search_text_changed (GtkEntry *entry)
 
   if (text[0] == '\0')
     return;
+
+  gtk_tree_model_filter_refilter (win->filter_model);
 }
 
 static void
@@ -191,6 +194,8 @@ selected_context_changed (GtkListBox *list, IconBrowserWindow *win)
   if (row == NULL)
     return;
 
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (win->search), FALSE);
+
   label = gtk_bin_get_child (GTK_BIN (row));
   win->current_context = g_object_get_data (G_OBJECT (label), "context");
   gtk_tree_model_filter_refilter (win->filter_model);
@@ -671,11 +676,13 @@ populate (IconBrowserWindow *win)
 }
 
 static gboolean
-key_press_event_cb (GtkWidget    *widget,
-                    GdkEvent     *event,
-                    GtkSearchBar *bar)
+key_press_event_cb (GtkWidget *widget,
+                    GdkEvent  *event,
+                    gpointer   data)
 {
-  return gtk_search_bar_handle_event (bar, event);
+  IconBrowserWindow *win = data;
+
+  return gtk_search_bar_handle_event (GTK_SEARCH_BAR (win->searchbar), event);
 }
 
 static gboolean
@@ -687,8 +694,13 @@ icon_visible_func (GtkTreeModel *model,
   gchar *context;
   gchar *name;
   gint column;
+  gboolean search;
+  const gchar *search_text;
   gboolean visible;
 
+  search = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (win->search));
+  search_text = gtk_entry_get_text (GTK_ENTRY (win->searchentry));
+
   if (win->symbolic)
     column = SYMBOLIC_NAME_COLUMN;
   else
@@ -698,8 +710,12 @@ icon_visible_func (GtkTreeModel *model,
                       column, &name,
                       CONTEXT_COLUMN, &context,
                       -1);
-
-  visible = name != NULL && win->current_context != NULL && g_strcmp0 (context, win->current_context->id) == 
0;
+  if (!name)
+    visible = FALSE;
+  else if (search)
+    visible = strstr (name, search_text) != NULL;
+  else
+    visible = win->current_context != NULL && g_strcmp0 (context, win->current_context->id) == 0;
 
   g_free (name);
   g_free (context);
@@ -727,22 +743,26 @@ symbolic_toggled (GtkToggleButton *toggle, IconBrowserWindow *win)
 }
 
 static void
+search_mode_toggled (GObject *searchbar, GParamSpec *pspec, IconBrowserWindow *win)
+{
+  if (gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (searchbar)))
+    gtk_list_box_unselect_all (GTK_LIST_BOX (win->context_list));
+}
+
+static void
 icon_browser_window_init (IconBrowserWindow *win)
 {
   gtk_widget_init_template (GTK_WIDGET (win));
 
   win->contexts = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
 
-  g_object_bind_property (win->search, "active",
-                          win->searchbar, "search-mode-enabled",
-                          G_BINDING_BIDIRECTIONAL);
-
-//  gtk_tree_view_set_search_entry (GTK_TREE_VIEW (win->list), GTK_ENTRY (win->searchentry));
-  g_signal_connect (win, "key-press-event", G_CALLBACK (key_press_event_cb), win->searchbar);
-
   gtk_tree_model_filter_set_visible_func (win->filter_model, icon_visible_func, win, NULL);
   gtk_window_set_transient_for (GTK_WINDOW (win->details), GTK_WINDOW (win));
 
+
+  g_signal_connect (win->searchbar, "notify::search-mode-enabled",
+                    G_CALLBACK (search_mode_toggled), win);
+
   symbolic_toggled (GTK_TOGGLE_BUTTON (win->symbolic_radio), win);
 
   populate (win);
@@ -778,6 +798,7 @@ icon_browser_window_class_init (IconBrowserWindowClass *class)
   gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), item_activated);
   gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), selected_context_changed);
   gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), symbolic_toggled);
+  gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), key_press_event_cb);
 }
 
 IconBrowserWindow *
diff --git a/demos/icon-browser/window.ui b/demos/icon-browser/window.ui
index 4e49bdc..296a1ea 100644
--- a/demos/icon-browser/window.ui
+++ b/demos/icon-browser/window.ui
@@ -16,6 +16,7 @@
     <property name="title" translatable="yes">Icon Browser</property>
     <property name="default-width">600</property>
     <property name="default-height">800</property>
+    <signal name="key-press-event" handler="key_press_event_cb"/>
     <child type="titlebar">
       <object class="GtkHeaderBar" id="header">
         <property name="visible">True</property>
@@ -47,7 +48,7 @@
         </child>
         <child>
           <object class="GtkToggleButton" id="search">
-            <property name="visible">False</property>
+            <property name="visible">True</property>
             <style>
               <class name="image-button"/>
             </style>
@@ -83,10 +84,11 @@
             <child>
               <object class="GtkSearchBar" id="searchbar">
                 <property name="visible">True</property>
+                <property name="search-mode-enabled" bind-source="search" bind-property="active" 
bind-flags="bidirectional"/>
                 <child>
                   <object class="GtkSearchEntry" id="searchentry">
-                    <signal name="search-changed" handler="search_text_changed"/>
                     <property name="visible">True</property>
+                    <signal name="search-changed" handler="search_text_changed"/>
                   </object>
                 </child>
               </object>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]