diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-12-17 01:23:47 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-12-17 01:25:02 +0900 |
commit | 2712e27243157356618d5aa718e7dba9ca08c49d (patch) | |
tree | f1ac8815d49c71a711a72cc3d527f42d76060964 /gladeui/glade-editor-table.c | |
parent | b65dae9daa0f8e0eb96ad8f0f9d8f1e975a1bbf8 (diff) | |
download | glade-2712e27243157356618d5aa718e7dba9ca08c49d.tar.gz |
* gladeui/glade-inspector.c:
- Avoid changing project selection when selection is cleared, selection get's cleared
when the user changes a widget name and a filter is applied (removing the entry from
the filtered model), avoiding syncing project selection avoids making the editor disappear
when the user changes a widget name (fixes bug 604322).
- Also plugged some leaked objects retrieved by gtk_tree_model_get().
* gladeui/glade-editor-table.c: Fire a warning when entry is edited with no widget
loaded, also change the ->loading flag strategy for blocking signal emission instead.
Diffstat (limited to 'gladeui/glade-editor-table.c')
-rw-r--r-- | gladeui/glade-editor-table.c | 76 |
1 files changed, 48 insertions, 28 deletions
diff --git a/gladeui/glade-editor-table.c b/gladeui/glade-editor-table.c index 5d12478a..8fae8078 100644 --- a/gladeui/glade-editor-table.c +++ b/gladeui/glade-editor-table.c @@ -37,6 +37,20 @@ G_DEFINE_TYPE_WITH_CODE (GladeEditorTable, glade_editor_table, GTK_TYPE_TABLE, G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE, glade_editor_table_editable_init)); + +#define BLOCK_NAME_ENTRY_CB(table) \ + do { if (table->name_entry) \ + g_signal_handlers_block_by_func (G_OBJECT (table->name_entry), \ + G_CALLBACK (widget_name_edited), table); \ + } while (0); + +#define UNBLOCK_NAME_ENTRY_CB(table) \ + do { if (table->name_entry) \ + g_signal_handlers_unblock_by_func (G_OBJECT (table->name_entry), \ + G_CALLBACK (widget_name_edited), table); \ + } while (0); + + static void glade_editor_table_class_init (GladeEditorTableClass *klass) { @@ -107,6 +121,29 @@ glade_editor_table_grab_focus (GtkWidget *widget) GTK_WIDGET_CLASS (glade_editor_table_parent_class)->grab_focus (widget); } +static void +widget_name_edited (GtkWidget *editable, GladeEditorTable *table) +{ + GladeWidget *widget; + gchar *new_name; + + g_return_if_fail (GTK_IS_EDITABLE (editable)); + g_return_if_fail (GLADE_IS_EDITOR_TABLE (table)); + + if (table->loaded_widget == NULL) + { + g_warning ("Name entry edited with no loaded widget in editor %p!\n", + table); + return; + } + + widget = table->loaded_widget; + new_name = gtk_editable_get_chars (GTK_EDITABLE (editable), 0, -1); + + if (glade_project_available_widget_name (widget->project, widget, new_name)) + glade_command_set_name (widget, new_name); + g_free (new_name); +} static void widget_name_changed (GladeWidget *widget, @@ -116,10 +153,12 @@ widget_name_changed (GladeWidget *widget, if (!gtk_widget_get_mapped (GTK_WIDGET (table))) return; - table->loading = TRUE; if (table->name_entry) + { + BLOCK_NAME_ENTRY_CB (table); gtk_entry_set_text (GTK_ENTRY (table->name_entry), table->loaded_widget->name); - table->loading = FALSE; + UNBLOCK_NAME_ENTRY_CB (table); + } } @@ -129,6 +168,8 @@ widget_finalized (GladeEditorTable *table, { table->loaded_widget = NULL; + g_warning ("Finalized widget in editor %p\n", table); + glade_editable_load (GLADE_EDITABLE (table), NULL); } @@ -142,12 +183,9 @@ glade_editor_table_load (GladeEditable *editable, GList *list; /* abort mission */ - if ((!table->loaded_widget && !widget) || - (table->loaded_widget && table->loaded_widget == widget)) + if (table->loaded_widget == widget) return; - table->loading = TRUE; - if (table->loaded_widget) { g_signal_handlers_disconnect_by_func (G_OBJECT (table->loaded_widget), @@ -161,6 +199,8 @@ glade_editor_table_load (GladeEditable *editable, table->loaded_widget = widget; + BLOCK_NAME_ENTRY_CB (table); + if (table->loaded_widget) { g_signal_connect (G_OBJECT (table->loaded_widget), "notify::name", @@ -178,14 +218,14 @@ glade_editor_table_load (GladeEditable *editable, else if (table->name_entry) gtk_entry_set_text (GTK_ENTRY (table->name_entry), ""); + UNBLOCK_NAME_ENTRY_CB (table); + /* Sync up properties, even if widget is NULL */ for (list = table->properties; list; list = list->next) { property = list->data; glade_editor_property_load_by_widget (property, widget); } - - table->loading = FALSE; } static void @@ -331,26 +371,6 @@ append_items (GladeEditorTable *table, } static void -widget_name_edited (GtkWidget *editable, GladeEditorTable *table) -{ - GladeWidget *widget; - gchar *new_name; - - g_return_if_fail (GTK_IS_EDITABLE (editable)); - g_return_if_fail (GLADE_IS_EDITOR_TABLE (table)); - - if (table->loading) return; - - widget = table->loaded_widget; - new_name = gtk_editable_get_chars (GTK_EDITABLE (editable), 0, -1); - - if (glade_project_available_widget_name (widget->project, widget, new_name)) - glade_command_set_name (widget, new_name); - g_free (new_name); -} - - -static void append_name_field (GladeEditorTable *table) { gchar *text = _("The Object's name"); |