#include "main.h" #include "xml.h" #include "xmlsetup.h" #include "config.h" #include "drawfuncs.h" GList *_xml_setup_layers = NULL; GList *_xml_setup_interactors = NULL; void xml_setup_setup (XMLNode *node) { GList *l; g_return_if_fail (g_strcmp0 (node->name, "saedit") == 0); for (l = node->sub_nodes; l != NULL; l = l->next) { XMLNode *current = (XMLNode *) l->data; if (g_strcmp0 (current->name, "layer") == 0) { SDALayer *layer = NULL; gint z_index = -1; gint offset_x, offset_y; gchar *type = xml_node_get_attr_value (current, "type"); if (type == NULL) { /* TODO: layer type is not specified */ continue; } if (g_strcmp0 (type, "repeater") == 0) { Interactor **repeater; SpriteContext *repeater_context; XMLNode *sprite = NULL; gchar *file; file = xml_node_get_attr_value (current, "file"); if (file == NULL) { /* TODO: file is not specified */ } else { gchar *filename = config_data_path_get_full_sprite_path (file); sprite = xml_parse_file (filename); g_free (file); g_free (filename); } repeater_context = sprite_context_new ( config_keys_get_data_folder_path () ); sprite_context_add_sprite (repeater_context, sprite, 0); repeater = (Interactor **) g_new0 (gpointer, 1); *repeater = interactor_new (repeater_context); layer = sda_layer_new ( interactor_sprite_layer_draw_func, repeater ); interactor_add_repeater (interactor, *repeater); _xml_setup_interactors = g_list_append ( _xml_setup_interactors, repeater ); } else if (g_strcmp0 (type, "background") == 0) { GdkRGBA *rgba = (GdkRGBA *) g_new0 (GdkRGBA, 1); gchar *color; color = xml_node_get_attr_value (current, "color"); if (color != NULL && gdk_rgba_parse (rgba, color)) { layer = sda_layer_new ( background_layer_draw_func, rgba ); } else { /* TODO: color not specified or wrong */ } } else { /* TODO: unknown type of layer */ } g_free (type); if (layer == NULL) { continue; } z_index = xml_node_get_int_attr_value ( current, "zindex", z_index ); offset_x = xml_node_get_int_attr_value ( current, "offsetX", 0 ); offset_y = xml_node_get_int_attr_value ( current, "offsetY", 0 ); g_object_set ( G_OBJECT (layer), "z-index", z_index, "offset-x", offset_x, "offset-y", offset_y, NULL ); sprite_drawing_area_add_layer ( SPRITE_DRAWING_AREA (d_area), layer ); _xml_setup_layers = g_list_append ( _xml_setup_layers, layer ); } else { /* TODO: unknown tag in the setup */ } } } void xml_setup_clear () { GList *l; for (l = _xml_setup_interactors; l != NULL; l = l->next) { Interactor **intr = (Interactor **) l->data; interactor_free (*intr); } for (l = _xml_setup_layers; l != NULL; l = l->next) { SDALayer *layer = (SDALayer *) l->data; gpointer user_data; g_object_get (layer, "user-data", &user_data, NULL); g_free (user_data); sprite_drawing_area_remove_layer ( SPRITE_DRAWING_AREA (d_area), layer ); g_object_unref (layer); } g_list_free (_xml_setup_interactors); g_list_free (_xml_setup_layers); _xml_setup_interactors = NULL; _xml_setup_layers = NULL; }