diff options
author | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2013-03-10 15:01:43 -0300 |
---|---|---|
committer | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2013-03-12 19:28:19 -0300 |
commit | 644299857b3cdd3861bfebfb7aefdabe0e93fb30 (patch) | |
tree | 923232337c80bc2dc41eeccdc499f7ecc9939e7e /gladeui/glade-inspector.c | |
parent | cfa923f8596cca177c04c17e1afcaf56e9d97013 (diff) | |
download | glade-644299857b3cdd3861bfebfb7aefdabe0e93fb30.tar.gz |
Removed search entry from GladeInspector
Added glade_inspector_set_search_entry()
Diffstat (limited to 'gladeui/glade-inspector.c')
-rw-r--r-- | gladeui/glade-inspector.c | 328 |
1 files changed, 87 insertions, 241 deletions
diff --git a/gladeui/glade-inspector.c b/gladeui/glade-inspector.c index 69d91ed7..63bc143d 100644 --- a/gladeui/glade-inspector.c +++ b/gladeui/glade-inspector.c @@ -60,6 +60,7 @@ enum { PROP_0, PROP_PROJECT, + PROP_SEARCH_ENTRY, N_PROPERTIES }; @@ -76,10 +77,7 @@ struct _GladeInspectorPrivate GtkTreeModel *filter; GladeProject *project; - - GtkWidget *entry; - guint idle_complete; - gboolean search_disabled; + GtkWidget *search_entry; }; static GParamSpec *properties[N_PROPERTIES]; @@ -100,10 +98,12 @@ 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,6 +112,9 @@ G_DEFINE_TYPE (GladeInspector, glade_inspector, GTK_TYPE_VBOX) 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; @@ -131,6 +134,9 @@ 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; @@ -181,7 +187,14 @@ 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); @@ -215,7 +228,7 @@ glade_inspector_visible_func (GtkTreeModel *model, gboolean retval = FALSE; - if (priv->search_disabled) + if (!priv->search_entry) return TRUE; if (gtk_tree_model_iter_children (model, &iter, parent)) @@ -228,212 +241,21 @@ glade_inspector_visible_func (GtkTreeModel *model, } if (!retval) { - 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); + 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); } 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; @@ -446,24 +268,6 @@ 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); @@ -500,12 +304,6 @@ glade_inspector_dispose (GObject *object) 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); } @@ -783,6 +581,9 @@ 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; @@ -802,13 +603,12 @@ glade_inspector_set_project (GladeInspector *inspector, GladeProject *project) connect_project_signals (inspector, project); - 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); + 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); + } } g_object_notify_by_pspec (G_OBJECT (inspector), properties[PROP_PROJECT]); @@ -906,3 +706,49 @@ 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); + } +} + |