inspector: Improve search on the statistics page

Use a search bar here as well, instead of the builtin treeview popup.
This commit is contained in:
Matthias Clasen
2014-11-07 23:40:31 -05:00
parent 5f701cf4c9
commit d0973fdb78
2 changed files with 104 additions and 4 deletions

View File

@ -25,6 +25,7 @@
#include "gtktreeview.h" #include "gtktreeview.h"
#include "gtkcellrenderertext.h" #include "gtkcellrenderertext.h"
#include "gtkcelllayout.h" #include "gtkcelllayout.h"
#include "gtksearchbar.h"
enum enum
{ {
@ -49,6 +50,8 @@ struct _GtkInspectorStatisticsPrivate
GtkCellRenderer *renderer_cumulative2; GtkCellRenderer *renderer_cumulative2;
GHashTable *counts; GHashTable *counts;
guint update_source_id; guint update_source_id;
GtkWidget *search_entry;
GtkWidget *search_bar;
}; };
typedef struct { typedef struct {
@ -262,6 +265,87 @@ parent_set (GtkWidget *widget, GtkWidget *old_parent)
G_CALLBACK (visible_child_name_changed), widget); 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 static void
gtk_inspector_statistics_init (GtkInspectorStatistics *sl) gtk_inspector_statistics_init (GtkInspectorStatistics *sl)
{ {
@ -285,10 +369,9 @@ gtk_inspector_statistics_init (GtkInspectorStatistics *sl)
GINT_TO_POINTER (COLUMN_CUMULATIVE2), NULL); GINT_TO_POINTER (COLUMN_CUMULATIVE2), NULL);
sl->priv->counts = g_hash_table_new_full (NULL, NULL, NULL, type_data_free); sl->priv->counts = g_hash_table_new_full (NULL, NULL, NULL, type_data_free);
if (has_instance_counts ()) gtk_tree_view_set_search_entry (sl->priv->view, GTK_ENTRY (sl->priv->search_entry));
update_type_counts (sl); gtk_tree_view_set_search_equal_func (sl->priv->view, match_row, sl, NULL);
else g_signal_connect (sl, "hierarchy-changed", G_CALLBACK (hierarchy_changed), NULL);
gtk_stack_set_visible_child_name (GTK_STACK (sl->priv->stack), "excuse");
} }
static void 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, renderer_self2);
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorStatistics, column_cumulative2); 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, 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: // vim: set et sw=2 ts=2:

View File

@ -22,6 +22,18 @@
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="orientation">vertical</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> <child>
<object class="GtkScrolledWindow"> <object class="GtkScrolledWindow">
<property name="visible">True</property> <property name="visible">True</property>
@ -32,6 +44,8 @@
<object class="GtkTreeView" id="view"> <object class="GtkTreeView" id="view">
<property name="visible">True</property> <property name="visible">True</property>
<property name="model">model</property> <property name="model">model</property>
<property name="search-column">1</property>
<property name="enable-search">True</property>
<child> <child>
<object class="GtkTreeViewColumn"> <object class="GtkTreeViewColumn">
<property name="visible">True</property> <property name="visible">True</property>