summaryrefslogblamecommitdiff
path: root/saedit/xmlsetup.c
blob: 1036436a032ab4e5ae87f96e3992ec8b57fa16dc (plain) (tree)




































































































































































                                                                                             
#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;
}