summaryrefslogtreecommitdiff
path: root/gladeui/glade-editor-table.c
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2010-12-17 01:23:47 +0900
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2010-12-17 01:25:02 +0900
commit2712e27243157356618d5aa718e7dba9ca08c49d (patch)
treef1ac8815d49c71a711a72cc3d527f42d76060964 /gladeui/glade-editor-table.c
parentb65dae9daa0f8e0eb96ad8f0f9d8f1e975a1bbf8 (diff)
downloadglade-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.c76
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");