summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Pablo Ugarte <juanpablougarte@gmail.com>2011-04-04 21:31:36 -0300
committerJuan Pablo Ugarte <juanpablougarte@gmail.com>2011-04-05 02:15:57 -0300
commit6c0314d5f744bc19578e75617949cdb23efad877 (patch)
tree7efad90ed131ec50ff0d1a04f6121769090f507f
parent746553e2029e3b646e75682804f874fa048d68ae (diff)
downloadglade-6c0314d5f744bc19578e75617949cdb23efad877.tar.gz
* gladeui/glade-widget-adaptor.[ch]:
o added GladeGetInternalChildrenFunc class and base implementation method o removed glade_widget_adaptor_get_internal_children() function o gwa_internal_children_update_from_node() reworked to work with simplyfied <internal-children> format <internal-children> <object/> <object> <object/> </object> </internal-children> * plugins/gtk+/glade-gtk.c: o fixed glade_gtk_container_get_children() now uses new get_internal_children GWA method and purify the list to remove posible duplicates * plugins/gtk+/gtk+.xml.in: o update <internal-children> tag to new format o make GtkTreeViewColumn:widget property parentless-widget * src/glade-window.c: set project in inspector after finishing loading (25% improvment in loading time)
-rw-r--r--gladeui/glade-widget-adaptor.c134
-rw-r--r--gladeui/glade-widget-adaptor.h17
-rw-r--r--plugins/gtk+/glade-gtk.c14
-rw-r--r--plugins/gtk+/gtk+.xml.in33
-rw-r--r--src/glade-window.c22
5 files changed, 120 insertions, 100 deletions
diff --git a/gladeui/glade-widget-adaptor.c b/gladeui/glade-widget-adaptor.c
index 7fa61d41..364b24ef 100644
--- a/gladeui/glade-widget-adaptor.c
+++ b/gladeui/glade-widget-adaptor.c
@@ -292,54 +292,6 @@ glade_widget_adaptor_has_internal_children (GladeWidgetAdaptor *adaptor)
return adaptor->priv->internal_children != NULL;
}
-static void
-gwa_get_internal_children (GladeWidgetAdaptor *adaptor,
- GObject *container,
- GList **children,
- GList *list)
-{
- GList *l;
-
- for (l = list; l; l = g_list_next (l))
- {
- GladeInternalChild *internal = l->data;
- GObject *child;
-
- child = glade_widget_adaptor_get_internal_child (adaptor,
- container,
- internal->name);
-
- if (child)
- {
- GtkWidget *parent;
-
- /* Only return a widget if is not packed into a wrapped object */
- if (GTK_IS_WIDGET (child) == FALSE ||
- ((parent = gtk_widget_get_parent (GTK_WIDGET (child))) &&
- glade_widget_get_from_gobject (parent) == NULL))
- *children = g_list_prepend (*children, child);
-
- if (internal->children)
- gwa_get_internal_children (adaptor, container, children, internal->children);
- }
- }
-}
-
-GList *
-glade_widget_adaptor_get_internal_children (GladeWidgetAdaptor *adaptor,
- GObject *container)
-{
- GList *children;
-
- g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
-
- children = NULL;
-
- gwa_get_internal_children (adaptor, container, &children, adaptor->priv->internal_children);
-
- return children;
-}
-
static gint
gwa_signal_comp (gpointer a, gpointer b)
{
@@ -1325,6 +1277,41 @@ glade_widget_adaptor_object_create_editable (GladeWidgetAdaptor * adaptor,
return (GladeEditable *) glade_editor_table_new (adaptor, type);
}
+static void
+gwa_get_internal_children (GladeWidgetAdaptor *adaptor,
+ GObject *object,
+ GList **children,
+ GList *list)
+{
+ GList *l;
+
+ for (l = list; l; l = g_list_next (l))
+ {
+ GladeInternalChild *internal = l->data;
+ GObject *child;
+
+ child = glade_widget_adaptor_get_internal_child (adaptor,
+ object,
+ internal->name);
+ if (child)
+ *children = g_list_prepend (*children, child);
+
+ if (internal->children)
+ gwa_get_internal_children (adaptor, object, children, internal->children);
+ }
+}
+
+static GList *
+glade_widget_adaptor_object_get_internal_children (GladeWidgetAdaptor *adaptor,
+ GObject *object)
+{
+ GList *children = NULL;
+
+ gwa_get_internal_children (adaptor, object, &children, adaptor->priv->internal_children);
+
+ return children;
+}
+
/*******************************************************************************
GladeWidgetAdaptor type registration and class initializer
@@ -1353,8 +1340,7 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass * adaptor_class)
/* Class methods */
adaptor_class->create_widget = glade_widget_adaptor_object_create_widget;
- adaptor_class->construct_object =
- glade_widget_adaptor_object_construct_object;
+ adaptor_class->construct_object = glade_widget_adaptor_object_construct_object;
adaptor_class->deep_post_create = NULL;
adaptor_class->post_create = NULL;
adaptor_class->get_internal_child = glade_widget_adaptor_object_get_internal_child;
@@ -1369,8 +1355,7 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass * adaptor_class)
adaptor_class->child_set_property = NULL;
adaptor_class->child_get_property = NULL;
adaptor_class->action_activate = glade_widget_adaptor_object_action_activate;
- adaptor_class->child_action_activate =
- glade_widget_adaptor_object_child_action_activate;
+ adaptor_class->child_action_activate = glade_widget_adaptor_object_child_action_activate;
adaptor_class->action_submenu = NULL;
adaptor_class->depends = glade_widget_adaptor_object_depends;
adaptor_class->read_widget = glade_widget_adaptor_object_read_widget;
@@ -1378,9 +1363,9 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass * adaptor_class)
adaptor_class->read_child = glade_widget_adaptor_object_read_child;
adaptor_class->write_child = glade_widget_adaptor_object_write_child;
adaptor_class->create_eprop = glade_widget_adaptor_object_create_eprop;
- adaptor_class->string_from_value =
- glade_widget_adaptor_object_string_from_value;
+ adaptor_class->string_from_value = glade_widget_adaptor_object_string_from_value;
adaptor_class->create_editable = glade_widget_adaptor_object_create_editable;
+ adaptor_class->get_internal_children = glade_widget_adaptor_object_get_internal_children;
/* Base defaults here */
adaptor_class->toplevel = FALSE;
@@ -2322,21 +2307,36 @@ gwa_set_signals_from_node (GladeWidgetAdaptor *adaptor,
}
}
-static gint
-gwa_internal_child_cmp (gconstpointer a, gconstpointer b)
+static GladeInternalChild *
+gwa_internal_child_find (GList *list, gchar *name)
{
- const GladeInternalChild *da = a;
- return strcmp (da->name, b);
+ GList *l;
+
+ for (l = list; l; l = g_list_next (l))
+ {
+ GladeInternalChild *data = l->data;
+
+ if (strcmp (data->name, name) == 0)
+ return data;
+
+ if (data->children)
+ {
+ GladeInternalChild *child;
+ if ((child = gwa_internal_child_find (data->children, name)))
+ return child;
+ }
+ }
+
+ return NULL;
}
static GList *
gwa_internal_children_update_from_node (GList *internal_children, GladeXmlNode *node)
{
- GList *link, *retval = internal_children;
+ GList *retval = internal_children;
GladeXmlNode *child, *children;
- for (child = glade_xml_node_get_children (node);
- child; child = glade_xml_node_next (child))
+ for (child = node; child; child = glade_xml_node_next (child))
{
GladeInternalChild *data;
gchar *name;
@@ -2347,18 +2347,14 @@ gwa_internal_children_update_from_node (GList *internal_children, GladeXmlNode *
if (!(name = glade_xml_get_property_string_required (child, GLADE_TAG_NAME, NULL)))
continue;
- if ((link = g_list_find_custom (retval, name, gwa_internal_child_cmp)))
- {
- data = link->data;
- }
- else
+ if ((data = gwa_internal_child_find (retval, name)) == NULL)
{
gboolean anarchist = glade_xml_get_boolean (child, GLADE_TAG_ANARCHIST, FALSE);
data = gwa_internal_children_new (name, anarchist);
retval = g_list_prepend (retval, data);
}
- if ((children = glade_xml_search_child (child, GLADE_TAG_INTERNAL_CHILDREN)))
+ if ((children = glade_xml_search_child (child, GLADE_XML_TAG_WIDGET)))
data->children = gwa_internal_children_update_from_node (data->children, children);
g_free (name);
@@ -2405,7 +2401,9 @@ gwa_extend_with_node (GladeWidgetAdaptor * adaptor,
gwa_action_update_from_node (adaptor, TRUE, child, domain, NULL);
if ((child = glade_xml_search_child (node, GLADE_TAG_INTERNAL_CHILDREN)))
- adaptor->priv->internal_children = gwa_internal_children_update_from_node (adaptor->priv->internal_children, child);
+ adaptor->priv->internal_children =
+ gwa_internal_children_update_from_node (adaptor->priv->internal_children,
+ glade_xml_node_get_children (child));
return TRUE;
}
diff --git a/gladeui/glade-widget-adaptor.h b/gladeui/glade-widget-adaptor.h
index c609cf9c..0559394a 100644
--- a/gladeui/glade-widget-adaptor.h
+++ b/gladeui/glade-widget-adaptor.h
@@ -329,6 +329,18 @@ typedef GList *(* GladeGetChildrenFunc) (GladeWidgetAdaptor *adaptor,
GObject *container);
/**
+ * GladeGetInternalChildrenFunc:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @object: A #GObject container
+ *
+ * A function called to get @object internal children.
+ *
+ * Returns: A #GList of #GObject internal children.
+ */
+typedef GList *(* GladeGetInternalChildrenFunc) (GladeWidgetAdaptor *adaptor,
+ GObject *container);
+
+/**
* GladeAddChildFunc:
* @adaptor: A #GladeWidgetAdaptor
* @parent: A #GObject container
@@ -660,6 +672,8 @@ struct _GladeWidgetAdaptorClass
GladeStringFromValueFunc string_from_value; /* Creates a string for a value */
GladeCreateEditableFunc create_editable; /* Creates a page for the editor */
+ GladeGetInternalChildrenFunc get_internal_children; /* Return the list of internal children */
+
void (* glade_reserved1) (void);
void (* glade_reserved2) (void);
void (* glade_reserved3) (void);
@@ -844,8 +858,7 @@ GladeSignalClass *glade_widget_adaptor_get_signal_class (GladeWidgetAdapto
GladeWidgetAdaptor *glade_widget_adaptor_get_parent_adaptor (GladeWidgetAdaptor *adaptor);
gboolean glade_widget_adaptor_has_internal_children (GladeWidgetAdaptor *adaptor);
-GList *glade_widget_adaptor_get_internal_children (GladeWidgetAdaptor *adaptor,
- GObject *container);
+
G_END_DECLS
#endif /* _GLADE_WIDGET_ADAPTOR_H_ */
diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c
index 50e21c5e..876ea60f 100644
--- a/plugins/gtk+/glade-gtk.c
+++ b/plugins/gtk+/glade-gtk.c
@@ -1226,12 +1226,20 @@ GList *
glade_gtk_container_get_children (GladeWidgetAdaptor *adaptor,
GtkContainer *container)
{
- GList *children, *internal_children;
+ GList *children;
children = glade_util_container_get_all_children (container);
- internal_children = glade_widget_adaptor_get_internal_children (adaptor, G_OBJECT (container));
- return g_list_concat (children, internal_children);
+ if (GWA_GET_CLASS (GTK_TYPE_CONTAINER)->get_internal_children)
+ {
+ GList *internal;
+
+ internal = GWA_GET_CLASS (GTK_TYPE_CONTAINER)->get_internal_children (adaptor, G_OBJECT (container));
+
+ return glade_util_purify_list (g_list_concat (children, internal));
+ }
+ else
+ return children;
}
GladeEditable *
diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in
index 86390ea8..77e84d33 100644
--- a/plugins/gtk+/gtk+.xml.in
+++ b/plugins/gtk+/gtk+.xml.in
@@ -1369,9 +1369,7 @@ embedded in another object</_tooltip>
<internal-children>
<object name="vbox">
- <internal-children>
- <object name="action_area"/>
- </internal-children>
+ <object name="action_area"/>
</object>
</internal-children>
@@ -1853,16 +1851,12 @@ embedded in another object</_tooltip>
<glade-widget-class name="GtkColorSelectionDialog" generic-name="colorselectiondialog" _title="Color Selection Dialog">
<internal-children>
<object name="vbox">
- <internal-children>
<object name="color_selection"/>
- <object name="action_area">
- <internal-children>
- <object name="ok_button"/>
- <object name="cancel_button"/>
- <object name="help_button"/>
- </internal-children>
- </object>
- </internal-children>
+ </object>
+ <object name="action_area">
+ <object name="ok_button"/>
+ <object name="cancel_button"/>
+ <object name="help_button"/>
</object>
</internal-children>
<properties>
@@ -1886,16 +1880,12 @@ embedded in another object</_tooltip>
<glade-widget-class name="GtkFontSelectionDialog" generic-name="fontselectiondialog" _title="Font Selection Dialog">
<internal-children>
<object name="vbox">
- <internal-children>
<object name="font_selection"/>
- <object name="action_area">
- <internal-children>
- <object name="ok_button"/>
- <object name="cancel_button"/>
- <object name="apply_button"/>
- </internal-children>
- </object>
- </internal-children>
+ </object>
+ <object name="action_area">
+ <object name="ok_button"/>
+ <object name="cancel_button"/>
+ <object name="apply_button"/>
</object>
</internal-children>
<properties>
@@ -2266,6 +2256,7 @@ embedded in another object</_tooltip>
</actions>
<properties>
+ <property id="widget" parentless-widget="True"/>
<property id="sort-column-id" since="2.18"/>
<property id="sort-order">
<displayable-values>
diff --git a/src/glade-window.c b/src/glade-window.c
index ca5219ce..8b776679 100644
--- a/src/glade-window.c
+++ b/src/glade-window.c
@@ -1714,15 +1714,24 @@ notebook_switch_page_cb (GtkNotebook * notebook,
}
static void
-set_widget_sensitive_on_load (GladeProject * project, GtkWidget * widget)
+project_parse_finished_cb (GladeProject *project, GtkWidget *inspector)
+{
+ gtk_widget_set_sensitive (inspector, TRUE);
+
+ glade_inspector_set_project (GLADE_INSPECTOR (inspector), project);
+}
+
+static void
+set_widget_sensitive_on_load (GladeProject *project, GtkWidget *widget)
{
gtk_widget_set_sensitive (widget, TRUE);
}
static void
-notebook_tab_added_cb (GtkNotebook * notebook,
- GladeDesignView * view,
- guint page_num, GladeWindow * window)
+notebook_tab_added_cb (GtkNotebook *notebook,
+ GladeDesignView *view,
+ guint page_num,
+ GladeWindow *window)
{
GladeProject *project;
GtkWidget *inspector, *palette;
@@ -1754,7 +1763,6 @@ notebook_tab_added_cb (GtkNotebook * notebook,
/* create inspector */
inspector = glade_inspector_new ();
gtk_widget_show (inspector);
- glade_inspector_set_project (GLADE_INSPECTOR (inspector), project);
gtk_notebook_append_page (GTK_NOTEBOOK (window->priv->inspectors_notebook),
inspector, NULL);
@@ -1781,10 +1789,12 @@ notebook_tab_added_cb (GtkNotebook * notebook,
gtk_widget_set_sensitive (inspector, FALSE);
gtk_widget_set_sensitive (palette, FALSE);
g_signal_connect (project, "parse-finished",
- G_CALLBACK (set_widget_sensitive_on_load), inspector);
+ G_CALLBACK (project_parse_finished_cb), inspector);
g_signal_connect (project, "parse-finished",
G_CALLBACK (set_widget_sensitive_on_load), palette);
}
+ else
+ glade_inspector_set_project (GLADE_INSPECTOR (inspector), project);
set_sensitivity_according_to_project (window, project);