diff options
Diffstat (limited to 'saedit/callbacks.c')
-rw-r--r-- | saedit/callbacks.c | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/saedit/callbacks.c b/saedit/callbacks.c new file mode 100644 index 0000000..f27fc47 --- /dev/null +++ b/saedit/callbacks.c @@ -0,0 +1,432 @@ +#include "main.h" +#include "errors.h" +#include "config.h" +#include "file.h" +#include "buffer.h" +#include <string.h> + +void +store_append_action (const Action *action, gpointer user_data) { + int hp; + gchar *name; + GtkTreeIter iter; + + action_get_hp_and_name (action, &hp, &name); + gtk_list_store_append (store_actions, &iter); + + gtk_list_store_set ( + store_actions, + &iter, + 0, name, + 1, hp, + 2, get_action_id (hp, name), + -1 + ); +} + +void +parse_buffer_clicked_cb ( + GtkToolButton *button, + gpointer user_data +) { + gchar *buffer_text; + GError *error = NULL; + GList *actions; + + release_context (); + + buffer_text = buffer_get_text (); + + context = sprite_context_new ( + config_keys_get_data_folder_path () + ); + interactor = interactor_new (context); + + sprite_context_add_sprite ( + context, + xml_parse_buffer (buffer_text, &error), + -1 + ); + + if (error != NULL) { + post_error ("XML parser", error->message); + g_error_free (error); + } + + g_free (buffer_text); + + interactor_set_updated_callback (interactor, intr_updated); + + actions = sprite_context_get_actions (context); + g_list_foreach (actions, (GFunc) store_append_action, NULL); + g_list_free (actions); + + gtk_widget_queue_draw (d_area); +} + +void +append_direction (const gchar *direction, gpointer user_data) { + gchar *display; + + g_return_if_fail (direction != NULL); + + if (strlen (direction) == 0) + display = g_strdup ("<empty>"); + else + display = g_strdup (direction); + + gtk_combo_box_text_append ( + cb_directions, + direction, + display + ); + + g_free (display); +} + +void +action_changed_cb (GtkComboBox *cbox, gpointer user_data) { + GList *directions; + GtkTreeIter iter; + gint hp; + gchar *name; + const Action *action; + gboolean w_run; + + g_return_if_fail (cbox == cb_actions); + + if (interactor == NULL) + return; + + if (!gtk_combo_box_get_active_iter (cbox, &iter)) + return; + + gtk_tree_model_get ( + GTK_TREE_MODEL (store_actions), + &iter, + 0, &name, + 1, &hp, + -1 + ); + + w_run = interactor_loop_running (interactor); + if (w_run) + interactor_loop_stop (interactor); + + gtk_combo_box_text_remove_all (cb_directions); + + action = sprite_context_get_action (context, hp, name); + g_return_if_fail (action != NULL); + + directions = action_get_directions (action); + g_list_foreach (directions, (GFunc) append_direction, NULL); + g_list_free (directions); + + interactor_set_action (interactor, hp, name); + + if (w_run) + interactor_loop_start (interactor, 10, 10); +} + +void +direction_changed_cb (GtkComboBox *cbox, gpointer user_data) { + gchar *active_text; + + g_return_if_fail (cbox == GTK_COMBO_BOX (cb_directions)); + + if (interactor == NULL) + return; + + active_text = gtk_combo_box_text_get_active_text (cb_directions); + + if (active_text == NULL) + return; + + interactor_set_direction ( + interactor, + active_text + ); +} + +void +play_pause_clicked_cb ( + GtkToolButton *button, + gpointer user_data +) { + if (interactor == NULL) + return; + + if (interactor_loop_running (interactor)) + interactor_loop_stop (interactor); + else + interactor_loop_start (interactor, 10, 10); +} + +void +next_frame_clicked_cb ( + GtkToolButton *button, + gpointer user_data +) { + if (interactor == NULL) + return; + + interactor_skip_current_frame (interactor); +} + +void +first_frame_clicked_cb ( + GtkToolButton *button, + gpointer user_data +) { + if (interactor == NULL) + return; + + interactor_loop_stop (interactor); + interactor_reset_animation (interactor); +} + +void +choose_df_activated_cb ( + GtkMenuItem *item, + gpointer user_data +) { + TreeFolderView *tfview; + GtkWidget *dialog; + gint res; + gchar *filename; + + g_return_if_fail (IS_TREE_FOLDER_VIEW (user_data)); + + tfview = TREE_FOLDER_VIEW (user_data); + dialog = gtk_file_chooser_dialog_new ( + "Choose data folder", + GTK_WINDOW (main_window), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + "Cancel", GTK_RESPONSE_CANCEL, + "Open", GTK_RESPONSE_ACCEPT, + NULL + ); + + gtk_file_chooser_set_filename ( + GTK_FILE_CHOOSER (dialog), + tree_folder_view_get_filename (tfview) + ); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + + if (res == GTK_RESPONSE_ACCEPT) { + filename = gtk_file_chooser_get_filename ( + GTK_FILE_CHOOSER (dialog) + ); + + config_keys_set_data_folder_path (filename); + config_keys_save (); + + tree_folder_view_set_filename ( + tfview, + filename + ); + + g_free (filename); + } + + gtk_widget_destroy (dialog); +} + +void +open_file_activated_cb ( + GtkMenuItem *item, + gpointer user_data +) { + GtkWidget *dialog; + GtkFileChooser *chooser; + gint res; + gchar *data_folder; + + dialog = gtk_file_chooser_dialog_new ( + NULL, + GTK_WINDOW (main_window), + GTK_FILE_CHOOSER_ACTION_OPEN, + "_Cancel", GTK_RESPONSE_CANCEL, + "_Open", GTK_RESPONSE_ACCEPT, + NULL + ); + + data_folder = config_keys_get_data_folder_path (); + + chooser = GTK_FILE_CHOOSER (dialog); + gtk_file_chooser_set_current_folder ( + chooser, + data_folder + ); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + + if (res == GTK_RESPONSE_ACCEPT) { + gchar *filename = gtk_file_chooser_get_filename (chooser); + open_file (filename); + g_free (filename); + } + + gtk_widget_destroy (dialog); + g_free (data_folder); +} + +void save_file_as_activated_cb ( + GtkMenuItem *item, + gpointer user_data +) { + GtkWidget *dialog; + GtkFileChooser *chooser; + gint res; + gchar *data_folder; + + dialog = gtk_file_chooser_dialog_new ( + NULL, + GTK_WINDOW (main_window), + GTK_FILE_CHOOSER_ACTION_SAVE, + "_Cancel", GTK_RESPONSE_CANCEL, + "_Save", GTK_RESPONSE_ACCEPT, + NULL + ); + + data_folder = config_keys_get_data_folder_path (); + + chooser = GTK_FILE_CHOOSER (dialog); + gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); + + if (get_opened_file_name () != NULL) { + gtk_file_chooser_set_current_name ( + chooser, + get_opened_file_name () + ); + } else { + gtk_file_chooser_set_current_folder ( + chooser, + data_folder + ); + } + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + + if (res == GTK_RESPONSE_ACCEPT) { + gchar *filename = gtk_file_chooser_get_filename (chooser); + save_file (filename); + g_free (filename); + } + + gtk_widget_destroy (dialog); + g_free (data_folder); +} + +void +save_file_activated_cb ( + GtkMenuItem *item, + gpointer user_data +) { + const gchar *filename; + + filename = get_opened_file_name (); + + if (filename == NULL) { + save_file_as_activated_cb (item, user_data); + return; + } + + save_file (NULL); +} + +void +zoom_adjustment_value_changed_cb ( + GtkAdjustment *adjustment, + gpointer user_data +) { + sprite_drawing_area_set_scale_factor ( + SPRITE_DRAWING_AREA (user_data), + gtk_adjustment_get_value (adjustment) + ); + gtk_widget_queue_draw (GTK_WIDGET (user_data)); +} + +void +tfview_file_activated_cb ( + TreeFolderView *tfview, + gchar *filename, + gpointer user_data +) { + open_file (filename); +} + +void +sourceview_buffer_modified_changed_cb ( + GtkTextBuffer *textbuffer, + gpointer user_data +) { + update_window_title (); +} + +void +new_file_activated_cb ( + GtkMenuItem *item, + gpointer user_data +) { + open_file (NULL); +} + +void +view_reset_to_center_activate_cb ( + GtkMenuItem *item, + gpointer user_data +) { + sprite_drawing_area_set_center ( + SPRITE_DRAWING_AREA (d_area), + 0, 0 + ); + + gtk_widget_queue_draw (d_area); +} + +void +show_tile_grid_toggled_cb ( + GtkCheckMenuItem *item, + gpointer user_data +) { + sda_layer_set_visible ( + tile_grid_layer, + gtk_check_menu_item_get_active (item) + ); + + gtk_widget_queue_draw (d_area); +} + +void +show_pixel_grid_toggled_cb ( + GtkCheckMenuItem *item, + gpointer user_data +) { + sda_layer_set_visible ( + pixel_grid_layer, + gtk_check_menu_item_get_active (item) + ); + + gtk_widget_queue_draw (d_area); +} + +void +menuitem_about_activate_cb ( + GtkMenuItem *item, + gpointer user_data +) { + gtk_dialog_run (GTK_DIALOG (user_data)); +} + +void +about_dialog_response_cb ( + GtkDialog *dialog, + gint response_id, + gpointer user_data +) { + if (response_id == GTK_RESPONSE_DELETE_EVENT) { + gtk_widget_hide (GTK_WIDGET (dialog)); + } +} |