[gtk+] inspector: Improve search on the statistics page



commit d0973fdb78522b4c76b03b544e713a95760df69c
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Nov 7 23:40:31 2014 -0500

    inspector: Improve search on the statistics page
    
    Use a search bar here as well, instead of the builtin treeview popup.

 gtk/inspector/statistics.c  |   94 +++++++++++++++++++++++++++++++++++++++++--
 gtk/inspector/statistics.ui |   14 ++++++
 2 files changed, 104 insertions(+), 4 deletions(-)
---
diff --git a/gtk/inspector/statistics.c b/gtk/inspector/statistics.c
index 21fe86b..72b248f 100644
--- a/gtk/inspector/statistics.c
+++ b/gtk/inspector/statistics.c
@@ -25,6 +25,7 @@
 #include "gtktreeview.h"
 #include "gtkcellrenderertext.h"
 #include "gtkcelllayout.h"
+#include "gtksearchbar.h"
 
 enum
 {
@@ -49,6 +50,8 @@ struct _GtkInspectorStatisticsPrivate
   GtkCellRenderer *renderer_cumulative2;
   GHashTable *counts;
   guint update_source_id;
+  GtkWidget *search_entry;
+  GtkWidget *search_bar;
 };
 
 typedef struct {
@@ -262,6 +265,87 @@ parent_set (GtkWidget *widget, GtkWidget *old_parent)
                     G_CALLBACK (visible_child_name_changed), widget);
 }
 
+static gboolean
+key_press_event (GtkWidget              *window,
+                 GdkEvent               *event,
+                 GtkInspectorStatistics *sl)
+{
+  if (gtk_widget_get_mapped (GTK_WIDGET (sl)))
+    {
+      if (event->key.keyval == GDK_KEY_Return ||
+          event->key.keyval == GDK_KEY_ISO_Enter ||
+          event->key.keyval == GDK_KEY_KP_Enter)
+        {
+          GtkTreeSelection *selection;
+          GtkTreeModel *model;
+          GtkTreeIter iter;
+          GtkTreePath *path;
+
+          selection = gtk_tree_view_get_selection (sl->priv->view);
+          if (gtk_tree_selection_get_selected (selection, &model, &iter))
+            {
+              path = gtk_tree_model_get_path (model, &iter);
+              gtk_tree_view_row_activated (sl->priv->view, path, NULL);
+              gtk_tree_path_free (path);
+
+              return GDK_EVENT_STOP;
+            }
+          else
+            return GDK_EVENT_PROPAGATE;
+        }
+
+      return gtk_search_bar_handle_event (GTK_SEARCH_BAR (sl->priv->search_bar), event);
+    }
+  else
+    return GDK_EVENT_PROPAGATE;
+}
+
+static gboolean
+match_string (const gchar *string,
+              const gchar *text)
+{
+  gchar *lower;
+  gboolean match = FALSE;
+
+  if (string)
+    {
+      lower = g_ascii_strdown (string, -1);
+      match = g_str_has_prefix (lower, text);
+      g_free (lower);
+    }
+
+  return match;
+}
+
+static gboolean
+match_row (GtkTreeModel *model,
+           gint          column,
+           const gchar  *key,
+           GtkTreeIter  *iter,
+           gpointer      data)
+{
+  gchar *type;
+  gboolean match;
+
+  gtk_tree_model_get (model, iter, column, &type, -1);
+
+  match = match_string (type, key);
+
+  g_free (type);
+
+  return !match;
+}
+
+static void
+hierarchy_changed (GtkWidget *widget,
+                   GtkWidget *previous_toplevel)
+{
+  if (previous_toplevel)
+    g_signal_handlers_disconnect_by_func (previous_toplevel, key_press_event, widget);
+  g_signal_connect (gtk_widget_get_toplevel (widget), "key-press-event",
+                    G_CALLBACK (key_press_event), widget);
+}
+
 static void
 gtk_inspector_statistics_init (GtkInspectorStatistics *sl)
 {
@@ -285,10 +369,9 @@ gtk_inspector_statistics_init (GtkInspectorStatistics *sl)
                                       GINT_TO_POINTER (COLUMN_CUMULATIVE2), NULL);
   sl->priv->counts = g_hash_table_new_full (NULL, NULL, NULL, type_data_free);
 
-  if (has_instance_counts ())
-    update_type_counts (sl);
-  else
-    gtk_stack_set_visible_child_name (GTK_STACK (sl->priv->stack), "excuse");
+  gtk_tree_view_set_search_entry (sl->priv->view, GTK_ENTRY (sl->priv->search_entry));
+  gtk_tree_view_set_search_equal_func (sl->priv->view, match_row, sl, NULL);
+  g_signal_connect (sl, "hierarchy-changed", G_CALLBACK (hierarchy_changed), NULL);
 }
 
 static void
@@ -387,6 +470,9 @@ gtk_inspector_statistics_class_init (GtkInspectorStatisticsClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorStatistics, renderer_self2);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorStatistics, column_cumulative2);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorStatistics, renderer_cumulative2);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorStatistics, search_entry);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorStatistics, search_bar);
+
 }
 
 // vim: set et sw=2 ts=2:
diff --git a/gtk/inspector/statistics.ui b/gtk/inspector/statistics.ui
index 6549fe5..42eb311 100644
--- a/gtk/inspector/statistics.ui
+++ b/gtk/inspector/statistics.ui
@@ -23,6 +23,18 @@
             <property name="visible">True</property>
             <property name="orientation">vertical</property>
             <child>
+              <object class="GtkSearchBar" id="search_bar">
+                <property name="visible">True</property>
+                <property name="show-close-button">True</property>
+                <child>
+                  <object class="GtkSearchEntry" id="search_entry">
+                    <property name="visible">True</property>
+                    <property name="max-width-chars">40</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
               <object class="GtkScrolledWindow">
                 <property name="visible">True</property>
                 <property name="expand">True</property>
@@ -32,6 +44,8 @@
                   <object class="GtkTreeView" id="view">
                     <property name="visible">True</property>
                     <property name="model">model</property>
+                    <property name="search-column">1</property>
+                    <property name="enable-search">True</property>
                     <child>
                       <object class="GtkTreeViewColumn">
                         <property name="visible">True</property>


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