summaryrefslogtreecommitdiff
path: root/saedit
diff options
context:
space:
mode:
authorVasily_Makarov <danilka.pro@gmail.com>2011-06-12 11:51:11 +0400
committerVasily_Makarov <danilka.pro@gmail.com>2011-06-12 11:51:11 +0400
commitfaa37a3a73d8c7e5b7d02f4131081fda0b15a3bf (patch)
tree774730b89494c2fa96b5d0ff19d55f587fcbc030 /saedit
parent3cad16ffd82801dd1f6e3672bf3c4fdbf13b4fe8 (diff)
downloadtools-faa37a3a73d8c7e5b7d02f4131081fda0b15a3bf.tar.gz
tools-faa37a3a73d8c7e5b7d02f4131081fda0b15a3bf.tar.bz2
tools-faa37a3a73d8c7e5b7d02f4131081fda0b15a3bf.tar.xz
tools-faa37a3a73d8c7e5b7d02f4131081fda0b15a3bf.zip
saedit: Small revolution
Diffstat (limited to 'saedit')
-rw-r--r--saedit/interface.h183
-rw-r--r--saedit/main.c431
-rw-r--r--saedit/main.h64
3 files changed, 362 insertions, 316 deletions
diff --git a/saedit/interface.h b/saedit/interface.h
new file mode 100644
index 0000000..e9e52db
--- /dev/null
+++ b/saedit/interface.h
@@ -0,0 +1,183 @@
+void set_up_interface() {
+ GtkWidget *button = NULL;
+ GtkWidget *hbox = NULL;
+ GtkWidget *vbox = NULL;
+ GtkWidget *vbbox = NULL;
+ GtkWidget *text = NULL;
+ GtkWidget *label = NULL;
+ GtkWidget *menubar = NULL;
+ GtkWidget *menuitem = NULL;
+ GtkWidget *menu = NULL;
+ GtkWidget *vpaned = NULL;
+ GtkWidget *hscrollbar = NULL;
+ GtkWidget *vscrollbar = NULL;
+
+ GtkSourceLanguageManager *langman = gtk_source_language_manager_get_default();
+ source_buffer = gtk_source_buffer_new_with_language(gtk_source_language_manager_get_language(langman, "xml"));
+
+ win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title(GTK_WINDOW(win), "Sprite Animation Editor");
+ gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
+ gtk_window_set_icon(GTK_WINDOW(win), icon);
+ gtk_widget_realize(win);
+ g_signal_connect(win, "destroy", G_CALLBACK(save_config_and_quit), NULL);
+ gtk_widget_set_size_request(win, MIN_WIDTH, MIN_HEIGHT);
+ GtkAccelGroup *ag = gtk_accel_group_new();
+ gtk_window_add_accel_group(win, ag);
+
+ GtkWidget *fcdialog = gtk_file_chooser_dialog_new(_("Open XML source file"), win, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(win), vbox);
+
+ menubar = gtk_menu_bar_new();
+ gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
+
+ //File menu
+ menu = gtk_menu_new();
+ gtk_menu_set_accel_group(menu, ag);
+
+ menuitem = gtk_menu_item_new_with_label(_("Open..."));
+ g_signal_connect(menuitem, "activate", open_menu_item_activate, fcdialog);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+ gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), "<MenuItems>/File/Open");
+ gtk_accel_map_change_entry("<MenuItems>/File/Open", gdk_keyval_from_name("O"), GDK_CONTROL_MASK, TRUE);
+
+ menuitem = gtk_menu_item_new_with_label(_("File"));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menuitem);
+
+ //View menu
+ menu = gtk_menu_new();
+ gtk_menu_set_accel_group(menu, ag);
+
+ menuitem = gtk_check_menu_item_new_with_label(_("Show grid"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+ g_signal_connect(menuitem, "toggled", show_grid_menu_item_toggled, NULL);
+
+ gtk_menu_item_set_accel_path(menuitem, "<MenuItems>/View/ShowGrid");
+ gtk_accel_map_change_entry("<MenuItems>/View/ShowGrid", gdk_keyval_from_name("G"), GDK_CONTROL_MASK, TRUE);
+
+ show_grid_menu_item = menuitem;
+
+ menuitem = gtk_menu_item_new_with_label(_("Imageset preview"));
+ gtk_widget_set_sensitive(menuitem, FALSE);
+ g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(show_imageset_window), NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+ gtk_menu_item_set_accel_path(menuitem, "<MenuItems>/View/ImagesetPreview");
+ gtk_accel_map_change_entry("<MenuItems>/View/ImagesetPreview", gdk_keyval_from_name("I"), GDK_CONTROL_MASK, TRUE);
+
+ imageset_preview_menu_item = menuitem;
+
+ menuitem = gtk_menu_item_new_with_label(_("View"));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menuitem);
+
+ menu = gtk_menu_new();
+ menuitem = gtk_menu_item_new_with_label(_("About"));
+ g_signal_connect(menuitem, "activate", show_about_dialog, NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+ menuitem = gtk_menu_item_new_with_label(_("Help"));
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menuitem);
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+ vbbox = gtk_vbutton_box_new();
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(vbbox), GTK_BUTTONBOX_START);
+ gtk_button_box_set_child_size(GTK_BUTTON_BOX(vbbox), 180, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vbbox, FALSE, TRUE, 0);
+
+ label = gtk_label_new("");
+ gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Clientdata folder")));
+ gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
+
+ data_folder_chooser_button = gtk_file_chooser_button_new(_("Clientdata folder"), 0);
+ gtk_box_pack_start(GTK_BOX(vbbox), data_folder_chooser_button, TRUE, TRUE, 0);
+ gtk_file_chooser_set_action(GTK_FILE_CHOOSER(data_folder_chooser_button), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+ g_signal_connect(data_folder_chooser_button, "selection-changed", G_CALLBACK(data_folder_set_handler), NULL);
+
+ label = gtk_label_new("");
+ gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("XML source file")));
+ gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
+
+ //xml_file_chooser_button = gtk_file_chooser_button_new(_("XML source file"), 0);
+ xml_file_chooser_button = gtk_file_chooser_button_new_with_dialog(fcdialog);
+ gtk_box_pack_start(GTK_BOX(vbbox), xml_file_chooser_button, TRUE, TRUE, 0);
+ g_signal_connect(xml_file_chooser_button, "file-set", G_CALLBACK(open_xml_file), source_buffer);
+
+ xml_file_open_button = gtk_button_new_from_stock(GTK_STOCK_OPEN);
+ gtk_widget_set_sensitive(xml_file_open_button, FALSE);
+ gtk_box_pack_start(GTK_BOX(vbbox), xml_file_open_button, TRUE, TRUE, 0);
+ g_signal_connect(xml_file_open_button, "clicked", G_CALLBACK(open_xml_file), source_buffer);
+
+ xml_file_save_button = gtk_button_new_from_stock(GTK_STOCK_SAVE);
+ gtk_widget_set_sensitive(xml_file_save_button, FALSE);
+ gtk_box_pack_start(GTK_BOX(vbbox), xml_file_save_button, TRUE, TRUE, 0);
+ g_signal_connect(xml_file_save_button, "clicked", G_CALLBACK(save_to_xml_file), source_buffer);
+ gtk_widget_set_accel_path(xml_file_save_button, "<Buttons>/SaveXMLBuffer", ag);
+ gtk_accel_map_change_entry("<Buttons>/SaveXMLBuffer", gdk_keyval_from_name("S"), GDK_CONTROL_MASK, TRUE);
+
+ button = gtk_button_new_with_label(_("Parse XML buffer"));
+ gtk_box_pack_start(GTK_BOX(vbbox), button, TRUE, TRUE, 0);
+ g_signal_connect(button, "clicked", G_CALLBACK(parse_xml_buffer), source_buffer);
+ gtk_widget_set_accel_path(button, "<Buttons>/ParseXMLBuffer", ag);
+ gtk_accel_map_change_entry("<Buttons>/ParseXMLBuffer", gdk_keyval_from_name("P"), GDK_CONTROL_MASK, TRUE);
+
+ label = gtk_label_new("");
+ gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Imagesets")));
+ gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
+
+ imagesets_combo_box = gtk_combo_box_new_text();
+ g_signal_connect(imagesets_combo_box, "changed", G_CALLBACK(imagesets_combo_box_changed_handler), NULL);
+ gtk_box_pack_start(GTK_BOX(vbbox), imagesets_combo_box, TRUE, TRUE, 0);
+
+ label = gtk_label_new("");
+ gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Actions")));
+ gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
+
+ actions_combo_box = gtk_combo_box_new_text();
+ g_signal_connect(actions_combo_box, "changed", G_CALLBACK(actions_combo_box_changed_handler), NULL);
+ gtk_box_pack_start(GTK_BOX(vbbox), actions_combo_box, TRUE, TRUE, 0);
+
+ label = gtk_label_new("");
+ gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Directions")));
+ gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
+
+ animations_combo_box = gtk_combo_box_new_text();
+ g_signal_connect(animations_combo_box, "changed", G_CALLBACK(animations_combo_box_changed_handler), NULL);
+ gtk_box_pack_start(GTK_BOX(vbbox), animations_combo_box, TRUE, TRUE, 0);
+
+ vpaned = gtk_vpaned_new();
+ gtk_box_pack_end(GTK_BOX(hbox), vpaned, TRUE, TRUE, 0);
+
+ darea = gtk_drawing_area_new();
+ gtk_paned_pack1(GTK_PANED(vpaned), darea, FALSE, FALSE);
+ gtk_widget_set_size_request(darea, -1, 120);
+ g_signal_connect(darea, "expose-event", G_CALLBACK(darea_expose_event), NULL);
+
+ hbox = gtk_hbox_new(FALSE, 0);
+ gtk_paned_pack2(GTK_PANED(vpaned), hbox, TRUE, FALSE);
+ gtk_widget_set_size_request(hbox, -1, 50);
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+
+ text = gtk_source_view_new_with_buffer(source_buffer);
+ gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW(text), TRUE);
+ gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 0);
+
+ hscrollbar = gtk_hscrollbar_new(gtk_text_view_get_hadjustment(text));
+ gtk_box_pack_start(GTK_BOX(vbox), hscrollbar, FALSE, TRUE, 0);
+
+ vscrollbar = gtk_vscrollbar_new(gtk_text_view_get_vadjustment(text));
+ gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, TRUE, 0);
+
+ gtk_widget_show_all(win);
+ gtk_widget_show_all(text);
+}
diff --git a/saedit/main.c b/saedit/main.c
index 12c873c..130d051 100644
--- a/saedit/main.c
+++ b/saedit/main.c
@@ -10,6 +10,7 @@
\*=======================================*/
#include "main.h"
+#include "interface.h"
void kill_timeout(int tag) {
if (tag > 0)
@@ -31,7 +32,7 @@ cairo_surface_t *get_grid_surface(int w, int h) {
for (x = 0; x < w; x++)
for (y = 0; y < h; y++) {
- gdk_cairo_set_source_pixbuf(cr, imageset->ground, x * GRID_SIZE, y * GRID_SIZE);
+ gdk_cairo_set_source_pixbuf(cr, gen_xml_info->imageset->ground, x * GRID_SIZE, y * GRID_SIZE);
cairo_paint(cr);
}
@@ -67,9 +68,11 @@ gboolean darea_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer d
cairo_set_source_surface(cr, surface, width/2 - GRID_SIZE * (w + 2) * 0.5, height/2 - GRID_SIZE * (h + 2) * 0.5);
cairo_paint(cr);
- GdkPixbuf *pbuf = get_sprite_by_index(current_sprite->index);
+ GdkPixbuf *pbuf = get_sprite_by_index(gen_xml_info->sprite->index);
if (pbuf == NULL) return FALSE;
- gdk_cairo_set_source_pixbuf(cr, pbuf, width/2 - sprite_width/2 + offsetX + current_sprite->offsetX + imageset->offsetX, height/2 - sprite_height/2 + offsetY + current_sprite->offsetY + imageset->offsetY);
+ gdk_cairo_set_source_pixbuf(cr, pbuf,
+ width/2 - gen_xml_info->imageset->width/2 + offsetX + gen_xml_info->sprite->offsetX + gen_xml_info->imageset->offsetX,
+ height/2 - gen_xml_info->imageset->height/2 + offsetY + gen_xml_info->sprite->offsetY + gen_xml_info->imageset->offsetY);
cairo_paint(cr);
cairo_destroy(cr);
@@ -98,28 +101,32 @@ void open_xml_file(GtkButton *button, gpointer buffer) {
gtk_widget_set_sensitive(xml_file_save_button, TRUE);
}
-void free_imagesets() {
- free_imageset();
- imagesets = NULL;
- gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(imagesets_combo_box))));
+void free_imagesets(XMLInfo *xml_info, GtkComboBox *combo_box) {
+ free_imageset(xml_info);
+ xml_info->imagesets = NULL;
+ if (combo_box != NULL)
+ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combo_box))));
}
-void free_imageset() {
- imageset = imageset_info_new();
+void free_imageset(XMLInfo *xml_info) {
+ xml_info->imageset = imageset_info_new();
gtk_widget_set_sensitive(imageset_preview_menu_item, FALSE);
}
-void free_actions() {
- actions = NULL;
- gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(actions_combo_box))));
+void free_actions(XMLInfo *xml_info, GtkComboBox *combo_box) {
+ xml_info->actions = NULL;
+ if (combo_box != NULL)
+ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combo_box))));
}
-void free_animations() {
- animations = NULL;
- gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(animations_combo_box))));
- kill_timeout(running_animation);
- running_animation = 0;
- current_sprite = sprite_info_new(-1, 0, 0);
+void free_animations(XMLInfo *xml_info, GtkComboBox *combo_box) {
+ xml_info->animations = NULL;
+ if (combo_box != NULL)
+ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combo_box))));
+
+ kill_timeout(xml_info->anim_tag);
+ xml_info->anim_tag = 0;
+ xml_info->sprite = sprite_info_new(-1, 0, 0);
set_sprite_by_index(0);
}
@@ -176,72 +183,80 @@ gint xml_node_compare_with_name_attr(gconstpointer node, gconstpointer name) {
}
GdkPixbuf* get_sprite_by_index(size_t index) {
- size_t w = spriteset_width/sprite_width;
- if (imageset->spriteset == NULL) return NULL;
- return gdk_pixbuf_new_subpixbuf(imageset->spriteset, index%w*sprite_width, index/w*sprite_height, sprite_width, sprite_height);
+ size_t w = spriteset_width/gen_xml_info->imageset->width;
+ if (gen_xml_info->imageset->spriteset == NULL) return NULL;
+ return gdk_pixbuf_new_subpixbuf(gen_xml_info->imageset->spriteset, index%w*gen_xml_info->imageset->width, index/w*gen_xml_info->imageset->height, gen_xml_info->imageset->width, gen_xml_info->imageset->height);
}
void set_sprite_by_index(size_t index) {
- current_sprite->index = index;
+ gen_xml_info->sprite->index = index;
gtk_widget_queue_draw(darea);
}
-void set_up_actions_by_imageset_name(gchar *imageset_name) {
- free_actions();
- free_animations();
- actions = NULL;
- GList *list = root->sub_nodes;
+void set_up_actions_by_imageset_name(gchar *imageset_name, XMLInfo *xml_info, GtkComboBox *combo_box) {
+ free_actions(xml_info, combo_box);
+ free_animations(xml_info, animations_combo_box);
+ GList *_actions_list = NULL;
+ GList *list = xml_info->root->sub_nodes;
XMLNode *node = NULL;
while (TRUE) {
list = g_list_find_custom(list, imageset_name, xml_node_compare_with_action_node_by_imageset_name_func);
if (list == NULL)
break;
- if (actions == NULL) {
- actions = g_list_alloc();
- actions->data = list->data;
+ if (_actions_list == NULL) {
+ _actions_list = g_list_alloc();
+ xml_info->actions = _actions_list;
+ _actions_list->data = list->data;
} else
- g_list_append(actions, list->data);
+ g_list_append(_actions_list, list->data);
node = list->data;
- gtk_combo_box_append_text(GTK_COMBO_BOX(actions_combo_box), xml_node_get_attr_value(node, "name"));
+ if (combo_box != NULL)
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), xml_node_get_attr_value(node, "name"));
list = list->next;
}
}
-gboolean set_up_imagesets(const XMLNode *root) {
- free_imagesets();
- free_actions();
- free_animations();
- GList *list = root->sub_nodes;
+gboolean set_up_imagesets(XMLInfo *xml_info, GtkComboBox *combo_box) {
+ GList *_imagesets_list = NULL;
+ free_imagesets(xml_info, combo_box);
+ free_actions(xml_info, actions_combo_box);
+ free_animations(xml_info, animations_combo_box);
+ GList *list = xml_info->root->sub_nodes;
XMLNode *node = NULL;
while (TRUE) {
list = g_list_find_custom(list, "imageset", xml_node_compare_with_name);
if (list == NULL)
break;
- if (imagesets == NULL) {
- imagesets = g_list_alloc();
- imagesets->data = list->data;
+ if (_imagesets_list == NULL) {
+ _imagesets_list = g_list_alloc();
+ _imagesets_list->data = list->data;
+ xml_info->imagesets = _imagesets_list;
} else
- g_list_append(imagesets, list->data);
+ g_list_append(_imagesets_list, list->data);
node = list->data;
- gtk_combo_box_append_text(GTK_COMBO_BOX(imagesets_combo_box), xml_node_get_attr_value(node, "name"));
+ if (combo_box != NULL)
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), xml_node_get_attr_value(node, "name"));
list = list->next;
}
- if (imagesets == NULL)
+ if (_imagesets_list == NULL)
return FALSE;
- gtk_combo_box_set_active(GTK_COMBO_BOX(imagesets_combo_box), 0);
+ if (combo_box != NULL)
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), 0);
return TRUE;
}
gboolean sequence_source_func(SequenceInfo *seq) {
- gchar *end_attr = xml_node_get_attr_value(seq->node, "end");
- size_t end;
- sscanf(end_attr, "%d", &end);
- if (current_sprite->index == end) {
- guint *anim_tag = seq->anim_info->anim_tag;
- *anim_tag = g_timeout_add(seq->delay, show_animation_by_info, seq->anim_info);
- return FALSE;
+ if (gen_xml_info->sprite->index == seq->end) {
+ if (seq->repeat <= 1) {
+ guint *anim_tag = seq->anim_info->anim_tag;
+ *anim_tag = g_timeout_add(seq->delay, show_animation_by_info, seq->anim_info);
+ return FALSE;
+ } else {
+ seq->repeat--;
+ gen_xml_info->sprite->index = seq->start - 1;
+ }
}
- set_sprite_by_index(current_sprite->index+1);
+ set_sprite_by_index(gen_xml_info->sprite->index+1);
return TRUE;
}
@@ -265,8 +280,8 @@ gboolean show_animation_by_info(AnimationInfo *anim_info) {
ofY_param = xml_node_get_attr_value(node, "offsetY");
if (ofY_param != NULL)
sscanf(ofY_param, "%d", &ofY);
- current_sprite->offsetX = ofX;
- current_sprite->offsetY = ofY;
+ gen_xml_info->sprite->offsetX = ofX;
+ gen_xml_info->sprite->offsetY = ofY;
}
if (g_strcmp0(node->name, "frame") == 0) {
@@ -297,36 +312,36 @@ gboolean show_animation_by_info(AnimationInfo *anim_info) {
gchar *delay_attr = xml_node_get_attr_value(node, "delay");
if (delay_attr == NULL)
return FALSE;
+ gchar *repeat_attr = xml_node_get_attr_value(node, "repeat");
+
size_t start;
sscanf(start_attr, "%d", &start);
size_t end;
sscanf(end_attr, "%d", &end);
size_t delay;
sscanf(delay_attr, "%d", &delay);
+ size_t repeat = 1;
+ if (repeat_attr != NULL)
+ sscanf(repeat_attr, "%d", &repeat);
set_sprite_by_index(start);
- SequenceInfo *seq = g_new0(SequenceInfo, 1);
- seq->delay = delay;
- seq->next = next;
- seq->node = node;
- seq->anim_info = anim_info;
anim_info->sub_nodes = next;
kill_timeout(*anim_tag);
- *anim_tag = g_timeout_add(delay, sequence_source_func, seq);
+ *anim_tag = g_timeout_add(delay, sequence_source_func, sequence_info_new(node, start, end, delay, anim_info, repeat));
return FALSE;
}
return FALSE;
}
-gboolean show_general_animation() {
- XMLNode *node = animations->data;
+gboolean show_general_animation(XMLInfo *xml_info) {
+ XMLNode *node = xml_info->animations->data;
if (node == NULL)
return FALSE;
- return show_animation_by_info(animation_info_new_with_params(node->sub_nodes, &running_animation));
+ return show_animation_by_info(animation_info_new_with_params(node->sub_nodes, &xml_info->anim_tag));
}
-gboolean set_up_action_by_name(const gchar *name) {
- free_animations();
- GList *list = g_list_find_custom(actions, name, xml_node_compare_with_name_attr);
+gboolean set_up_action_by_name(const gchar *name, XMLInfo *xml_info, GtkComboBox *combo_box) {
+ free_animations(xml_info, animations_combo_box);
+ GList *list = g_list_find_custom(xml_info->actions, name, xml_node_compare_with_name_attr);
if (list == NULL) return FALSE;
list = ((XMLNode *)list->data)->sub_nodes;
gboolean was_direction = FALSE;
@@ -334,88 +349,89 @@ gboolean set_up_action_by_name(const gchar *name) {
list = g_list_find_custom(list, "animation", xml_node_compare_with_name);
if (list == NULL)
break;
- if (animations == NULL) {
- animations = g_list_alloc();
- animations->data = list->data;
+ if (xml_info->animations == NULL) {
+ xml_info->animations = g_list_alloc();
+ xml_info->animations->data = list->data;
} else
- g_list_append(animations, list->data);
+ g_list_append(xml_info->animations, list->data);
XMLNode *node = list->data;
gchar *direction = xml_node_get_attr_value(node, "direction");
if (direction != NULL) {
- gtk_combo_box_append_text(GTK_COMBO_BOX(animations_combo_box), direction);
+ if (animations_combo_box != NULL)
+ gtk_combo_box_append_text(GTK_COMBO_BOX(animations_combo_box), direction);
was_direction = TRUE;
}
list = list->next;
}
- if (animations == NULL)
+ if (xml_info->animations == NULL)
return FALSE;
if (!was_direction)
- show_general_animation();
+ show_general_animation(xml_info);
return TRUE;
}
void actions_combo_box_changed_handler(GtkComboBox *widget, gpointer user_data) {
- set_up_action_by_name(gtk_combo_box_get_active_text(widget));
+ set_up_action_by_name(gtk_combo_box_get_active_text(widget), gen_xml_info, widget);
}
void animations_combo_box_changed_handler(GtkComboBox *widget, gpointer user_data) {
- GList *list = g_list_find_custom(animations, gtk_combo_box_get_active_text(widget), xml_node_compare_with_direction_attr);
+ GList *list = g_list_find_custom(gen_xml_info->animations, gtk_combo_box_get_active_text(widget), xml_node_compare_with_direction_attr);
if (list == NULL)
return;
XMLNode *node = list->data;
- show_animation_by_info(animation_info_new_with_params(node->sub_nodes, &running_animation));
+ show_animation_by_info(animation_info_new_with_params(node->sub_nodes, &gen_xml_info->anim_tag));
}
-void set_up_imageset_by_node(XMLNode *node) {
- free_imageset();
- free_actions();
- free_animations();
+void set_up_imageset_by_node(XMLNode *node, XMLInfo *xml_info, GtkComboBox *combo_box) {
+ free_imageset(xml_info);
+ free_actions(xml_info, actions_combo_box);
+ free_animations(xml_info, animations_combo_box);
- imageset->node = node;
- imageset->offsetX = 0;
- imageset->offsetY = 0;
+ xml_info->imageset->node = node;
+ xml_info->imageset->offsetX = 0;
+ xml_info->imageset->offsetY = 0;
- gchar *offset_attr = xml_node_get_attr_value(imageset->node, "offsetX");
+ gchar *offset_attr = xml_node_get_attr_value(xml_info->imageset->node, "offsetX");
if (offset_attr != NULL)
- sscanf(offset_attr, "%d", &imageset->offsetX);
+ sscanf(offset_attr, "%d", &xml_info->imageset->offsetX);
- offset_attr = xml_node_get_attr_value(imageset->node, "offsetY");
+ offset_attr = xml_node_get_attr_value(xml_info->imageset->node, "offsetY");
if (offset_attr != NULL)
- sscanf(offset_attr, "%d", &imageset->offsetY);
+ sscanf(offset_attr, "%d", &xml_info->imageset->offsetY);
- gchar *imageset_name = xml_node_get_attr_value(imageset->node, "name");
- set_up_actions_by_imageset_name(imageset_name);
- if (actions == NULL)
+ gchar *imageset_name = xml_node_get_attr_value(xml_info->imageset->node, "name");
+ set_up_actions_by_imageset_name(imageset_name, xml_info, actions_combo_box);
+ if (xml_info->actions == NULL)
return;
- gchar *src = xml_node_get_attr_value(imageset->node, "src");
+ gchar *src = xml_node_get_attr_value(xml_info->imageset->node, "src");
format_src_string(src);
gchar *datapath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_folder_chooser_button));
gchar path[255];
g_sprintf(path, "%s/%s", datapath, src);
- imageset->spriteset = gdk_pixbuf_new_from_file(path, NULL);
- if (imageset->spriteset == NULL) {
+ xml_info->imageset->spriteset = gdk_pixbuf_new_from_file(path, NULL);
+ if (xml_info->imageset->spriteset == NULL) {
show_wrong_source_buffer_dialog();
return;
}
gtk_widget_set_sensitive(imageset_preview_menu_item, TRUE);
- spriteset_width = gdk_pixbuf_get_width(imageset->spriteset);
- spriteset_height = gdk_pixbuf_get_height(imageset->spriteset);
+ spriteset_width = gdk_pixbuf_get_width(xml_info->imageset->spriteset);
+ spriteset_height = gdk_pixbuf_get_height(xml_info->imageset->spriteset);
- gchar *width = xml_node_get_attr_value(imageset->node, "width");
- sscanf(width, "%d", &sprite_width);
- gchar *height = xml_node_get_attr_value(imageset->node, "height");
- sscanf(height, "%d", &sprite_height);
+ gchar *width = xml_node_get_attr_value(xml_info->imageset->node, "width");
+ sscanf(width, "%d", &xml_info->imageset->width);
+ gchar *height = xml_node_get_attr_value(xml_info->imageset->node, "height");
+ sscanf(height, "%d", &xml_info->imageset->height);
- GList *list = g_list_find_custom(root->sub_nodes, "sae", xml_node_compare_with_name);
+ GList *list = g_list_find_custom(xml_info->root->sub_nodes, "sae", xml_node_compare_with_name);
if (list != NULL) {
gchar *ground_attr = xml_node_get_attr_value((XMLNode *)list->data, "ground");
if (ground_attr != NULL) {
ground_attr = g_strjoin(NULL, DIR_GROUNDS, SEPARATOR_SLASH, ground_attr, ".png", NULL);
GdkPixbuf *pbuf = gdk_pixbuf_new_from_file(ground_attr, NULL);
if(pbuf != NULL)
- imageset->ground = pbuf;
+ xml_info->imageset->ground = pbuf;
}
}
@@ -423,10 +439,10 @@ void set_up_imageset_by_node(XMLNode *node) {
}
void imagesets_combo_box_changed_handler(GtkComboBox *widget, gpointer user_data) {
- GList *list = g_list_find_custom(imagesets, gtk_combo_box_get_active_text(widget), xml_node_compare_with_name_attr);
+ GList *list = g_list_find_custom(gen_xml_info->imagesets, gtk_combo_box_get_active_text(widget), xml_node_compare_with_name_attr);
if (list == NULL)
return;
- set_up_imageset_by_node(list->data);
+ set_up_imageset_by_node(list->data, gen_xml_info, imagesets_combo_box);
}
void load_options() {
@@ -452,9 +468,9 @@ void load_options() {
paths->sprites = g_strjoin(SEPARATOR_SLASH, datapath, paths->sprites, NULL);
}
-void parse_xml_text(gchar *text, XMLNode **root_node) {
+void parse_xml_text(gchar *text, XMLInfo *xml_info) {
XMLNode *_root_node = ibus_xml_parse_buffer(text);
- *root_node = _root_node;
+ xml_info->root = _root_node;
if (_root_node == NULL) {
show_wrong_source_buffer_dialog();
return;
@@ -486,22 +502,22 @@ void parse_xml_text(gchar *text, XMLNode **root_node) {
g_strcmp0(action_attr, "stand") == 0)
offsetY = -16;
- if (!set_up_imagesets(_root_node)) {
+ if (!set_up_imagesets(xml_info, imagesets_combo_box)) {
show_wrong_source_buffer_dialog();
return;
}
}
void parse_xml_buffer(GtkWidget *button, GtkSourceBuffer *buffer) {
- free_imagesets();
- free_actions();
- free_animations();
+ free_imagesets(gen_xml_info, imagesets_combo_box);
+ free_actions(gen_xml_info, actions_combo_box);
+ free_animations(gen_xml_info, animations_combo_box);
load_options();
GtkTextIter beg, end;
gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(buffer), &beg);
gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(buffer), &end);
- parse_xml_text(gtk_text_iter_get_text(&beg, &end), &root);
+ parse_xml_text(gtk_text_iter_get_text(&beg, &end), gen_xml_info);
}
void show_about_dialog() {
@@ -522,190 +538,6 @@ void open_menu_item_activate(GtkMenuItem *menuitem, GtkFileChooserDialog *fcdial
gtk_dialog_run(fcdialog);
}
-void set_up_interface() {
- GtkWidget *button = NULL;
- GtkWidget *hbox = NULL;
- GtkWidget *vbox = NULL;
- GtkWidget *vbbox = NULL;
- GtkWidget *text = NULL;
- GtkWidget *label = NULL;
- GtkWidget *menubar = NULL;
- GtkWidget *menuitem = NULL;
- GtkWidget *menu = NULL;
- GtkWidget *vpaned = NULL;
- GtkWidget *hscrollbar = NULL;
- GtkWidget *vscrollbar = NULL;
-
- GtkSourceLanguageManager *langman = gtk_source_language_manager_get_default();
- source_buffer = gtk_source_buffer_new_with_language(gtk_source_language_manager_get_language(langman, "xml"));
-
- win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(win), "Sprite Animation Editor");
- gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
- gtk_window_set_icon(GTK_WINDOW(win), icon);
- gtk_widget_realize(win);
- g_signal_connect(win, "destroy", G_CALLBACK(save_config_and_quit), NULL);
- gtk_widget_set_size_request(win, MIN_WIDTH, MIN_HEIGHT);
- GtkAccelGroup *ag = gtk_accel_group_new();
- gtk_window_add_accel_group(win, ag);
-
- GtkWidget *fcdialog = gtk_file_chooser_dialog_new(_("Open XML source file"), win, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(win), vbox);
-
- menubar = gtk_menu_bar_new();
- gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
-
- //File menu
- menu = gtk_menu_new();
- gtk_menu_set_accel_group(menu, ag);
-
- menuitem = gtk_menu_item_new_with_label(_("Open..."));
- g_signal_connect(menuitem, "activate", open_menu_item_activate, fcdialog);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
-
- gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), "<MenuItems>/File/Open");
- gtk_accel_map_change_entry("<MenuItems>/File/Open", gdk_keyval_from_name("O"), GDK_CONTROL_MASK, TRUE);
-
- menuitem = gtk_menu_item_new_with_label(_("File"));
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
- gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menuitem);
-
- //View menu
- menu = gtk_menu_new();
- gtk_menu_set_accel_group(menu, ag);
-
- menuitem = gtk_check_menu_item_new_with_label(_("Show grid"));
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
-
- g_signal_connect(menuitem, "toggled", show_grid_menu_item_toggled, NULL);
-
- gtk_menu_item_set_accel_path(menuitem, "<MenuItems>/View/ShowGrid");
- gtk_accel_map_change_entry("<MenuItems>/View/ShowGrid", gdk_keyval_from_name("G"), GDK_CONTROL_MASK, TRUE);
-
- show_grid_menu_item = menuitem;
-
- menuitem = gtk_menu_item_new_with_label(_("Imageset preview"));
- gtk_widget_set_sensitive(menuitem, FALSE);
- g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(show_imageset_window), NULL);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
-
- gtk_menu_item_set_accel_path(menuitem, "<MenuItems>/View/ImagesetPreview");
- gtk_accel_map_change_entry("<MenuItems>/View/ImagesetPreview", gdk_keyval_from_name("I"), GDK_CONTROL_MASK, TRUE);
-
- imageset_preview_menu_item = menuitem;
-
- menuitem = gtk_menu_item_new_with_label(_("View"));
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
- gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menuitem);
-
- menu = gtk_menu_new();
- menuitem = gtk_menu_item_new_with_label(_("About"));
- g_signal_connect(menuitem, "activate", show_about_dialog, NULL);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
-
- menuitem = gtk_menu_item_new_with_label(_("Help"));
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
- gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menuitem);
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
-
- vbbox = gtk_vbutton_box_new();
- gtk_button_box_set_layout(GTK_BUTTON_BOX(vbbox), GTK_BUTTONBOX_START);
- gtk_button_box_set_child_size(GTK_BUTTON_BOX(vbbox), 180, 0);
- gtk_box_pack_start(GTK_BOX(hbox), vbbox, FALSE, TRUE, 0);
-
- label = gtk_label_new("");
- gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Clientdata folder")));
- gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
-
- data_folder_chooser_button = gtk_file_chooser_button_new(_("Clientdata folder"), 0);
- gtk_box_pack_start(GTK_BOX(vbbox), data_folder_chooser_button, TRUE, TRUE, 0);
- gtk_file_chooser_set_action(GTK_FILE_CHOOSER(data_folder_chooser_button), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
- g_signal_connect(data_folder_chooser_button, "selection-changed", G_CALLBACK(data_folder_set_handler), NULL);
-
- label = gtk_label_new("");
- gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("XML source file")));
- gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
-
- //xml_file_chooser_button = gtk_file_chooser_button_new(_("XML source file"), 0);
- xml_file_chooser_button = gtk_file_chooser_button_new_with_dialog(fcdialog);
- gtk_box_pack_start(GTK_BOX(vbbox), xml_file_chooser_button, TRUE, TRUE, 0);
- g_signal_connect(xml_file_chooser_button, "file-set", G_CALLBACK(open_xml_file), source_buffer);
-
- xml_file_open_button = gtk_button_new_from_stock(GTK_STOCK_OPEN);
- gtk_widget_set_sensitive(xml_file_open_button, FALSE);
- gtk_box_pack_start(GTK_BOX(vbbox), xml_file_open_button, TRUE, TRUE, 0);
- g_signal_connect(xml_file_open_button, "clicked", G_CALLBACK(open_xml_file), source_buffer);
-
- xml_file_save_button = gtk_button_new_from_stock(GTK_STOCK_SAVE);
- gtk_widget_set_sensitive(xml_file_save_button, FALSE);
- gtk_box_pack_start(GTK_BOX(vbbox), xml_file_save_button, TRUE, TRUE, 0);
- g_signal_connect(xml_file_save_button, "clicked", G_CALLBACK(save_to_xml_file), source_buffer);
- gtk_widget_set_accel_path(xml_file_save_button, "<Buttons>/SaveXMLBuffer", ag);
- gtk_accel_map_change_entry("<Buttons>/SaveXMLBuffer", gdk_keyval_from_name("S"), GDK_CONTROL_MASK, TRUE);
-
- button = gtk_button_new_with_label(_("Parse XML buffer"));
- gtk_box_pack_start(GTK_BOX(vbbox), button, TRUE, TRUE, 0);
- g_signal_connect(button, "clicked", G_CALLBACK(parse_xml_buffer), source_buffer);
- gtk_widget_set_accel_path(button, "<Buttons>/ParseXMLBuffer", ag);
- gtk_accel_map_change_entry("<Buttons>/ParseXMLBuffer", gdk_keyval_from_name("P"), GDK_CONTROL_MASK, TRUE);
-
- label = gtk_label_new("");
- gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Imagesets")));
- gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
-
- imagesets_combo_box = gtk_combo_box_new_text();
- g_signal_connect(imagesets_combo_box, "changed", G_CALLBACK(imagesets_combo_box_changed_handler), NULL);
- gtk_box_pack_start(GTK_BOX(vbbox), imagesets_combo_box, TRUE, TRUE, 0);
-
- label = gtk_label_new("");
- gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Actions")));
- gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
-
- actions_combo_box = gtk_combo_box_new_text();
- g_signal_connect(actions_combo_box, "changed", G_CALLBACK(actions_combo_box_changed_handler), NULL);
- gtk_box_pack_start(GTK_BOX(vbbox), actions_combo_box, TRUE, TRUE, 0);
-
- label = gtk_label_new("");
- gtk_label_set_markup(GTK_LABEL(label), markup_bold(_("Directions")));
- gtk_box_pack_start(GTK_BOX(vbbox), label, TRUE, TRUE, 0);
-
- animations_combo_box = gtk_combo_box_new_text();
- g_signal_connect(animations_combo_box, "changed", G_CALLBACK(animations_combo_box_changed_handler), NULL);
- gtk_box_pack_start(GTK_BOX(vbbox), animations_combo_box, TRUE, TRUE, 0);
-
- vpaned = gtk_vpaned_new();
- gtk_box_pack_end(GTK_BOX(hbox), vpaned, TRUE, TRUE, 0);
-
- darea = gtk_drawing_area_new();
- gtk_paned_pack1(GTK_PANED(vpaned), darea, FALSE, FALSE);
- gtk_widget_set_size_request(darea, -1, 120);
- g_signal_connect(darea, "expose-event", G_CALLBACK(darea_expose_event), NULL);
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_paned_pack2(GTK_PANED(vpaned), hbox, TRUE, FALSE);
- gtk_widget_set_size_request(hbox, -1, 50);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
-
- text = gtk_source_view_new_with_buffer(source_buffer);
- gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW(text), TRUE);
- gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 0);
-
- hscrollbar = gtk_hscrollbar_new(gtk_text_view_get_hadjustment(text));
- gtk_box_pack_start(GTK_BOX(vbox), hscrollbar, FALSE, TRUE, 0);
-
- vscrollbar = gtk_vscrollbar_new(gtk_text_view_get_vadjustment(text));
- gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, TRUE, 0);
-
- gtk_widget_show_all(win);
- gtk_widget_show_all(text);
-}
-
gboolean frame_image_button_press_event(GtkWidget *widget, GdkEventButton *button, int index) {
gchar buf[10];
gint len = g_sprintf(buf, "%d", index);
@@ -714,15 +546,15 @@ gboolean frame_image_button_press_event(GtkWidget *widget, GdkEventButton *butto
}
void show_imageset_window() {
- if (imageset->spriteset == NULL) return;
+ if (gen_xml_info->imageset->spriteset == NULL) return;
GtkWidget *iwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(iwin), "Imageset preview");
gtk_window_set_position(GTK_WINDOW(iwin), GTK_WIN_POS_CENTER);
gtk_widget_add_events(iwin, GDK_BUTTON_PRESS_MASK);
gtk_widget_set_size_request(iwin, IMAGESET_PREVIEW_WINDOW_WIDTH, IMAGESET_PREVIEW_WINDOW_HEIGHT);
gtk_widget_realize(win);
- int w = spriteset_width / sprite_width;
- int h = spriteset_height / sprite_height;
+ int w = spriteset_width / gen_xml_info->imageset->width;
+ int h = spriteset_height / gen_xml_info->imageset->height;
GtkWidget *vbox = gtk_vbox_new(TRUE, 0);
GtkWidget *hbox = NULL;
@@ -779,8 +611,9 @@ int main(int argc, char *argv[]) {
config = keys_new();
paths = g_new0(Options, 1);
- current_sprite = sprite_info_new(-1, 0, 0);
- imageset = imageset_info_new();
+ gen_xml_info = xml_info_new();
+ gen_xml_info->sprite = sprite_info_new(-1, 0, 0);
+ gen_xml_info->imageset = imageset_info_new();
set_up_interface();
load_config();
diff --git a/saedit/main.h b/saedit/main.h
index bc17e7e..d2a9134 100644
--- a/saedit/main.h
+++ b/saedit/main.h
@@ -53,11 +53,24 @@ static AnimationInfo *animation_info_new_with_params(GList *sub_nodes_new, guint
typedef struct {
XMLNode *node;
- GList *next;
+ int start;
+ int end;
guint delay;
AnimationInfo *anim_info;
+ int repeat;
} SequenceInfo;
+static SequenceInfo *sequence_info_new(XMLNode *node, int start, int end, guint delay, AnimationInfo *anim_info, int repeat) {
+ SequenceInfo *res = g_new0(SequenceInfo, 1);
+ res->start = start;
+ res->end = end;
+ res->node = node;
+ res->delay = delay;
+ res->anim_info = anim_info;
+ res->repeat = repeat;
+ return res;
+}
+
typedef struct {
int index;
int offsetX;
@@ -85,6 +98,8 @@ typedef struct {
XMLNode *node;
int offsetX;
int offsetY;
+ int width;
+ int height;
GdkPixbuf *spriteset;
GdkPixbuf *ground;
} ImagesetInfo;
@@ -92,11 +107,26 @@ typedef struct {
static ImagesetInfo *imageset_info_new() {
ImagesetInfo *res = g_new0(ImagesetInfo, 1);
res->ground = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, GRID_SIZE * 3, GRID_SIZE * 3);
+ res->width = SPRITE_WIDTH_DEFAULT;
+ res->height = SPRITE_HEIGHT_DEFAULT;
gdk_pixbuf_fill(res->ground, 0x00000000);
return res;
}
-int sprite_width = 64, sprite_height = 64;
+typedef struct {
+ GList *imagesets;
+ GList *actions;
+ GList *animations;
+ ImagesetInfo *imageset;
+ SpriteInfo *sprite;
+ guint anim_tag;
+ XMLNode *root;
+} XMLInfo;
+
+static XMLInfo *xml_info_new() {
+ return g_new0(XMLInfo, 1);
+}
+
int spriteset_width, spriteset_height;
int offsetX = 0, offsetY = 0;
@@ -114,16 +144,16 @@ GtkWidget *show_grid_menu_item = NULL;
GtkSourceBuffer *source_buffer = NULL;
-GList *imagesets = NULL;
-GList *actions = NULL;
-GList *animations = NULL;
+//GList *imagesets = NULL;
+//GList *actions = NULL;
+//GList *animations = NULL;
+XMLInfo *gen_xml_info;
GdkPixbuf *icon = NULL;
-XMLNode *root = NULL;
-ImagesetInfo *imageset = NULL;
-SpriteInfo *current_sprite;
-guint running_animation = 0;
+//XMLNode *root = NULL;
+//ImagesetInfo *imageset = NULL;
+//guint running_animation = 0;
Options *paths;
Keys *config;
@@ -131,9 +161,9 @@ static gboolean show_animation_by_info(AnimationInfo *anim_info);
static gchar *markup_bold(gchar *str);
static void format_src_string(gchar *src);
static void open_xml_file(GtkButton *button, gpointer buffer);
-static void free_imagesets();
-static void free_actions();
-static void free_animations();
+static void free_imagesets(XMLInfo *xml_info, GtkComboBox *combo_box);
+static void free_actions(XMLInfo *xml_info, GtkComboBox *combo_box);
+static void free_animations(XMLInfo *xml_info, GtkComboBox *combo_box);
static void save_to_xml_file(GtkButton *button, gpointer buffer);
static void data_folder_set_handler(GtkFileChooserButton *widget, gpointer data);
static void show_wrong_source_buffer_dialog();
@@ -144,14 +174,14 @@ static gint xml_node_compare_with_direction_attr(gconstpointer node, gconstpoint
static gint xml_node_compare_with_name_attr(gconstpointer node, gconstpointer name);
static GdkPixbuf* get_sprite_by_index(size_t index);
static void set_sprite_by_index(size_t index);
-static void set_up_actions_by_imageset_name(gchar *imageset_name);
-static gboolean set_up_imagesets(const XMLNode *root);
+static void set_up_actions_by_imageset_name(gchar *imageset_name, XMLInfo *xml_info, GtkComboBox *combo_box);
+static gboolean set_up_imagesets(XMLInfo *xml_info, GtkComboBox *combo_box);
static gboolean sequence_source_func(SequenceInfo *seq);
-static gboolean show_general_animation();
-static gboolean set_up_action_by_name(const gchar *name);
+static gboolean show_general_animation(XMLInfo *xml_info);
+static gboolean set_up_action_by_name(const gchar *name, XMLInfo *xml_info, GtkComboBox *combo_box);
static void actions_combo_box_changed_handler(GtkComboBox *widget, gpointer user_data);
static void animations_combo_box_changed_handler(GtkComboBox *widget, gpointer user_data);
-static void set_up_imageset_by_node(XMLNode *node);
+static void set_up_imageset_by_node(XMLNode *node, XMLInfo *xml_info, GtkComboBox *combo_box);
static void imagesets_combo_box_changed_handler(GtkComboBox *widget, gpointer user_data);
static void parse_xml_buffer(GtkWidget *button, GtkSourceBuffer *buffer);
static void set_up_interface();