summaryrefslogtreecommitdiff
path: root/gladeui/glade-inspector.c
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2013-04-07 22:34:11 +0900
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2013-04-08 01:38:58 +0900
commit7434df5696da1eb0fd60826d3354c1e0c5c1eaf4 (patch)
tree8ab32c6f74327f4119c10493f71d3880bad66311 /gladeui/glade-inspector.c
parentb669bff33127341378dbab176ab87614c71f7ef0 (diff)
downloadglade-7434df5696da1eb0fd60826d3354c1e0c5c1eaf4.tar.gz
Revert "Removed search entry from GladeInspector"
This reverts commit 644299857b3cdd3861bfebfb7aefdabe0e93fb30.
Diffstat (limited to 'gladeui/glade-inspector.c')
-rw-r--r--gladeui/glade-inspector.c328
1 files changed, 241 insertions, 87 deletions
diff --git a/gladeui/glade-inspector.c b/gladeui/glade-inspector.c
index 1614faba..7c4d9c3e 100644
--- a/gladeui/glade-inspector.c
+++ b/gladeui/glade-inspector.c
@@ -60,7 +60,6 @@ enum
{
PROP_0,
PROP_PROJECT,
- PROP_SEARCH_ENTRY,
N_PROPERTIES
};
@@ -77,7 +76,10 @@ struct _GladeInspectorPrivate
GtkTreeModel *filter;
GladeProject *project;
- GtkWidget *search_entry;
+
+ GtkWidget *entry;
+ guint idle_complete;
+ gboolean search_disabled;
};
static GParamSpec *properties[N_PROPERTIES];
@@ -98,12 +100,10 @@ static gint button_press_cb (GtkWidget *widget,
GladeInspector *inspector);
G_DEFINE_TYPE (GladeInspector, glade_inspector, GTK_TYPE_VBOX)
-
-static void
-glade_inspector_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
+ static void
+ glade_inspector_set_property (GObject *object,
+ guint property_id,
+ const GValue *value, GParamSpec *pspec)
{
GladeInspector *inspector = GLADE_INSPECTOR (object);
@@ -112,9 +112,6 @@ glade_inspector_set_property (GObject *object,
case PROP_PROJECT:
glade_inspector_set_project (inspector, g_value_get_object (value));
break;
- case PROP_SEARCH_ENTRY:
- glade_inspector_set_search_entry (inspector, g_value_get_object (value));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -134,9 +131,6 @@ glade_inspector_get_property (GObject *object,
case PROP_PROJECT:
g_value_set_object (value, glade_inspector_get_project (inspector));
break;
- case PROP_SEARCH_ENTRY:
- g_value_set_object (value, inspector->priv->search_entry);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -187,14 +181,7 @@ glade_inspector_class_init (GladeInspectorClass *klass)
_("The project being inspected"),
GLADE_TYPE_PROJECT,
G_PARAM_READABLE | G_PARAM_WRITABLE);
-
- properties[PROP_SEARCH_ENTRY] =
- g_param_spec_object ("search-entry",
- _("Search Entry"),
- _("The search entry to use for this inspector. see gtk_tree_view_set_search_entry()"),
- GTK_TYPE_ENTRY,
- G_PARAM_READWRITE);
-
+
/* Install all properties */
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
@@ -228,7 +215,7 @@ glade_inspector_visible_func (GtkTreeModel *model,
gboolean retval = FALSE;
- if (!priv->search_entry)
+ if (priv->search_disabled)
return TRUE;
if (gtk_tree_model_iter_children (model, &iter, parent))
@@ -241,21 +228,212 @@ glade_inspector_visible_func (GtkTreeModel *model,
}
if (!retval)
{
- const gchar *text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
- GladeWidget *gwidget;
- GObject *object;
-
- /* We better get the object and then access the Gladewidget name than
- allocating the string from the model */
- gtk_tree_model_get (model, parent, GLADE_PROJECT_MODEL_COLUMN_OBJECT, &object, -1);
- gwidget = glade_widget_get_from_gobject (object);
- retval = find_in_string_insensitive (glade_widget_get_name (gwidget), text);
+ const gchar *text = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+ gchar *widget_name;
+
+ gtk_tree_model_get (model, parent, GLADE_PROJECT_MODEL_COLUMN_NAME,
+ &widget_name, -1);
+
+ retval = find_in_string_insensitive (widget_name, text);
+
+ g_free (widget_name);
}
return retval;
}
static void
+glade_inspector_filter (GladeInspector *inspector)
+{
+ GladeInspectorPrivate *priv = inspector->priv;
+
+ if (!priv->search_disabled)
+ {
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+ gtk_tree_view_expand_all (GTK_TREE_VIEW (priv->view));
+ }
+
+}
+
+static void
+search_entry_changed_cb (GtkEntry *entry, GladeInspector *inspector)
+{
+ glade_inspector_filter (inspector);
+}
+
+static void
+selection_name_foreach_func (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gchar **selection)
+{
+ if (*selection == NULL)
+ {
+ gchar *name;
+
+ gtk_tree_model_get (model, iter, GLADE_PROJECT_MODEL_COLUMN_NAME, &name, -1);
+ *selection = name;
+ }
+}
+
+static gchar *
+get_selected_name (GladeInspector *inspector)
+{
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (inspector->priv->view));
+ gchar *name = NULL;
+
+ gtk_tree_selection_selected_foreach (selection,
+ (GtkTreeSelectionForeachFunc)
+ selection_name_foreach_func, &name);
+
+ return name;
+}
+
+static gboolean
+search_complete_idle (GladeInspector *inspector)
+{
+ GladeInspectorPrivate *priv = inspector->priv;
+ gchar *completed = get_selected_name (inspector);
+ const gchar *str;
+ gsize length;
+
+ str = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+
+ if (completed)
+ {
+ length = strlen (str);
+
+ gtk_entry_set_text (GTK_ENTRY (priv->entry), completed);
+ gtk_editable_set_position (GTK_EDITABLE (priv->entry), length);
+ gtk_editable_select_region (GTK_EDITABLE (priv->entry), length, -1);
+ g_free (completed);
+ }
+
+ priv->idle_complete = 0;
+
+ return FALSE;
+}
+
+static void
+search_entry_text_inserted_cb (GtkEntry *entry,
+ const gchar *text,
+ gint length,
+ gint *position,
+ GladeInspector *inspector)
+{
+ GladeInspectorPrivate *priv = inspector->priv;
+
+ if (!priv->search_disabled && !priv->idle_complete)
+ {
+ priv->idle_complete =
+ g_idle_add ((GSourceFunc) search_complete_idle, inspector);
+ }
+}
+
+static gboolean
+search_entry_key_press_event_cb (GtkEntry *entry,
+ GdkEventKey *event,
+ GladeInspector *inspector)
+{
+ GladeInspectorPrivate *priv = inspector->priv;
+ const gchar *str;
+
+ if (event->keyval == GDK_KEY_Tab)
+ {
+ if (event->state & GDK_CONTROL_MASK)
+ {
+ gtk_widget_grab_focus (priv->view);
+ }
+ else
+ {
+ gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+ gtk_editable_select_region (GTK_EDITABLE (entry), -1, -1);
+ }
+ return TRUE;
+ }
+
+ if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter)
+ {
+ gchar *name;
+
+ str = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+
+ if (str && (name = get_selected_name (inspector)))
+ {
+ gtk_entry_set_text (GTK_ENTRY (entry), name);
+ g_free (name);
+ gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+ gtk_editable_select_region (GTK_EDITABLE (entry), -1, -1);
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+widget_font_desc_set_style (GtkWidget *widget, PangoStyle style)
+{
+ GtkStyleContext *context = gtk_widget_get_style_context (widget);
+ PangoFontDescription *font_desc =
+ pango_font_description_copy (gtk_style_context_get_font (context, GTK_STATE_FLAG_NORMAL));
+
+ pango_font_description_set_style (font_desc, style);
+ gtk_widget_override_font (widget, font_desc);
+ pango_font_description_free (font_desc);
+}
+
+static void
+search_entry_update (GladeInspector *inspector)
+{
+ GladeInspectorPrivate *priv = inspector->priv;
+ const gchar *str = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+
+ if (str[0] == '\0')
+ {
+ GtkStyleContext *context;
+ GdkRGBA color;
+
+ priv->search_disabled = TRUE;
+ widget_font_desc_set_style (priv->entry, PANGO_STYLE_ITALIC);
+ gtk_entry_set_text (GTK_ENTRY (priv->entry), _("< search widgets >"));
+
+ context = gtk_widget_get_style_context (priv->entry);
+ gtk_style_context_get_color (context, GTK_STATE_FLAG_INSENSITIVE, &color);
+ gtk_widget_override_color (priv->entry, GTK_STATE_FLAG_NORMAL, &color);
+ }
+}
+
+static gboolean
+search_entry_focus_in_cb (GtkWidget *entry,
+ GdkEventFocus *event,
+ GladeInspector *inspector)
+{
+ GladeInspectorPrivate *priv = inspector->priv;
+
+ if (priv->search_disabled)
+ {
+ gtk_entry_set_text (GTK_ENTRY (priv->entry), "");
+ gtk_widget_override_color (priv->entry, GTK_STATE_NORMAL, NULL);
+ gtk_widget_override_font (priv->entry, NULL);
+
+ priv->search_disabled = FALSE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+search_entry_focus_out_cb (GtkWidget *entry,
+ GdkEventFocus *event,
+ GladeInspector *inspector)
+{
+ search_entry_update (inspector);
+
+ return FALSE;
+}
+
+static void
glade_inspector_init (GladeInspector *inspector)
{
GladeInspectorPrivate *priv;
@@ -266,6 +444,24 @@ glade_inspector_init (GladeInspector *inspector)
priv->project = NULL;
+ priv->entry = gtk_entry_new ();
+
+ search_entry_update (inspector);
+ gtk_widget_show (priv->entry);
+ gtk_box_pack_start (GTK_BOX (inspector), priv->entry, FALSE, FALSE, 2);
+
+ g_signal_connect (priv->entry, "changed",
+ G_CALLBACK (search_entry_changed_cb), inspector);
+ g_signal_connect (priv->entry, "key-press-event",
+ G_CALLBACK (search_entry_key_press_event_cb), inspector);
+ g_signal_connect_after (priv->entry, "insert-text",
+ G_CALLBACK (search_entry_text_inserted_cb),
+ inspector);
+ g_signal_connect (priv->entry, "focus-in-event",
+ G_CALLBACK (search_entry_focus_in_cb), inspector);
+ g_signal_connect (priv->entry, "focus-out-event",
+ G_CALLBACK (search_entry_focus_out_cb), inspector);
+
priv->view = gtk_tree_view_new ();
add_columns (GTK_TREE_VIEW (priv->view));
gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->view), GLADE_PROJECT_MODEL_COLUMN_NAME);
@@ -301,6 +497,12 @@ glade_inspector_dispose (GObject *object)
glade_inspector_set_search_entry (inspector, NULL);
glade_inspector_set_project (inspector, NULL);
+ if (inspector->priv->idle_complete)
+ {
+ g_source_remove (inspector->priv->idle_complete);
+ inspector->priv->idle_complete = 0;
+ }
+
G_OBJECT_CLASS (glade_inspector_parent_class)->dispose (object);
}
@@ -603,9 +805,6 @@ glade_inspector_set_project (GladeInspector *inspector, GladeProject *project)
priv->project = NULL;
}
- gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), NULL);
- gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), FALSE);
-
if (project)
{
priv->project = project;
@@ -625,12 +824,13 @@ glade_inspector_set_project (GladeInspector *inspector, GladeProject *project)
connect_project_signals (inspector, project);
- if (priv->search_entry)
- {
- gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view),
- GTK_ENTRY (priv->search_entry));
- gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), TRUE);
- }
+ gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), GTK_ENTRY (priv->entry));
+ gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), TRUE);
+ }
+ else
+ {
+ gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), NULL);
+ gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), FALSE);
}
g_object_notify_by_pspec (G_OBJECT (inspector), properties[PROP_PROJECT]);
@@ -728,49 +928,3 @@ glade_inspector_new_with_project (GladeProject *project)
return GTK_WIDGET (inspector);
}
-
-static void
-search_entry_changed_cb (GtkEntry *entry, GladeInspector *inspector)
-{
- GladeInspectorPrivate *priv = inspector->priv;
-
- gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
- gtk_tree_view_expand_all (GTK_TREE_VIEW (priv->view));
-}
-
-/**
- * glade_inspector_set_search_entry:
- * @project: a #GladeProject
- * @entry: a #GtkEntry
- *
- * Sets @entry as the interactive search entry for the inspector treeview.
- */
-void
-glade_inspector_set_search_entry (GladeInspector *inspector, GtkEntry *entry)
-{
- GladeInspectorPrivate *priv;
-
- g_return_if_fail (GLADE_IS_INSPECTOR (inspector));
-
- priv = inspector->priv;
-
- if (priv->search_entry)
- g_signal_handlers_disconnect_by_func (priv->search_entry, search_entry_changed_cb, inspector);
-
- g_clear_object (&priv->search_entry);
-
- if (entry)
- {
- priv->search_entry = g_object_ref (entry);
-
- g_signal_connect (entry, "changed", G_CALLBACK (search_entry_changed_cb), inspector);
- }
-
- if (priv->project)
- {
- gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), entry);
- gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view),
- entry ? TRUE : FALSE);
- }
-}
-