diff options
author | Tristan Van Berkom <tvb@gnome.org> | 2011-03-14 16:40:00 -0300 |
---|---|---|
committer | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2011-04-04 15:45:35 -0300 |
commit | 22a42ca3eceb6555756eeac2b5d0de587377919c (patch) | |
tree | f90650fc2284d75424d67e738e8c6be92e633a2c | |
parent | 234e3a621c037ad02664a98a010e0c5bf7261619 (diff) | |
download | glade-22a42ca3eceb6555756eeac2b5d0de587377919c.tar.gz |
Moved GtkDialog action-widgets tag read/write support into a new file to use
as a generic implementation for GtkInfoBar too.
-rw-r--r-- | plugins/gtk+/glade-gtk-action-widgets.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/plugins/gtk+/glade-gtk-action-widgets.c b/plugins/gtk+/glade-gtk-action-widgets.c new file mode 100644 index 00000000..c527b3b9 --- /dev/null +++ b/plugins/gtk+/glade-gtk-action-widgets.c @@ -0,0 +1,121 @@ +#define GLADE_TAG_ACTION_WIDGETS "action-widgets" +#define GLADE_TAG_ACTION_WIDGET "action-widget" +#define GLADE_TAG_RESPONSE "response" + + +static void +glade_gtk_dialog_read_responses (GladeWidget * widget, + GladeXmlNode * widgets_node) +{ + GladeXmlNode *node; + GladeWidget *action_widget; + + for (node = glade_xml_node_get_children (widgets_node); + node; node = glade_xml_node_next (node)) + { + gchar *widget_name, *response; + + if (!glade_xml_node_verify (node, GLADE_TAG_ACTION_WIDGET)) + continue; + + response = + glade_xml_get_property_string_required (node, GLADE_TAG_RESPONSE, + NULL); + widget_name = glade_xml_get_content (node); + + if ((action_widget = + glade_project_get_widget_by_name (glade_widget_get_project (widget), + widget_name)) != NULL) + { + glade_widget_property_set (action_widget, "response-id", + g_ascii_strtoll (response, NULL, 10)); + } + + g_free (response); + g_free (widget_name); + } +} + +void +glade_gtk_dialog_read_child (GladeWidgetAdaptor * adaptor, + GladeWidget * widget, GladeXmlNode * node) +{ + GladeXmlNode *widgets_node; + + GWA_GET_CLASS (GTK_TYPE_CONTAINER)->read_child (adaptor, widget, node); + + node = glade_xml_node_get_parent (node); + + if ((widgets_node = + glade_xml_search_child (node, GLADE_TAG_ACTION_WIDGETS)) != NULL) + glade_gtk_dialog_read_responses (widget, widgets_node); +} + + +static void +glade_gtk_dialog_write_responses (GladeWidget * widget, + GladeXmlContext * context, + GladeXmlNode * node) +{ + GladeXmlNode *widget_node; + GtkDialog *dialog = GTK_DIALOG (glade_widget_get_object (widget)); + GList *l, *action_widgets = + gtk_container_get_children (GTK_CONTAINER + (gtk_dialog_get_action_area (dialog))); + + for (l = action_widgets; l; l = l->next) + { + GladeWidget *action_widget; + GladeProperty *property; + gchar *str; + + if ((action_widget = glade_widget_get_from_gobject (l->data)) == NULL) + continue; + + if ((property = + glade_widget_get_property (action_widget, "response-id")) == NULL) + continue; + + widget_node = glade_xml_node_new (context, GLADE_TAG_ACTION_WIDGET); + glade_xml_node_append_child (node, widget_node); + + str = + glade_property_class_make_string_from_gvalue (glade_property_get_class (property), + glade_property_inline_value (property)); + + glade_xml_node_set_property_string (widget_node, GLADE_TAG_RESPONSE, str); + glade_xml_set_content (widget_node, glade_widget_get_name (action_widget)); + + g_free (str); + } + + g_list_free (action_widgets); +} + +void +glade_gtk_dialog_write_child (GladeWidgetAdaptor * adaptor, + GladeWidget * widget, + GladeXmlContext * context, GladeXmlNode * node) +{ + GladeXmlNode *widgets_node; + GladeWidget *parent; + GladeProject *project; + + GWA_GET_CLASS (GTK_TYPE_CONTAINER)->write_child (adaptor, widget, context, + node); + + parent = glade_widget_get_parent (widget); + project = glade_widget_get_project (widget); + + if (parent && GTK_IS_DIALOG (glade_widget_get_object (parent))) + { + widgets_node = glade_xml_node_new (context, GLADE_TAG_ACTION_WIDGETS); + + glade_gtk_dialog_write_responses (parent, context, widgets_node); + + if (!glade_xml_node_get_children (widgets_node)) + glade_xml_node_delete (widgets_node); + else + glade_xml_node_append_child (node, widgets_node); + } +} |