diff options
Diffstat (limited to 'saedit/config.c')
-rw-r--r-- | saedit/config.c | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/saedit/config.c b/saedit/config.c new file mode 100644 index 0000000..1e20411 --- /dev/null +++ b/saedit/config.c @@ -0,0 +1,191 @@ +#include "config.h" +#include "xml.h" +#include <unistd.h> +#include <sys/stat.h> + +static GKeyFile *_config_keyfile = NULL; + +gchar * +_config_get_config_folder (void) { + return g_strjoin ( + "/", + g_get_user_config_dir (), + "saedit2", + NULL + ); +} + +gchar * +_config_get_key_file_path (void) { + gchar *dir = _config_get_config_folder (); + gchar *result; + + result = g_strjoin ( + "/", + dir, + "config.ini", + NULL + ); + + g_free (dir); + return result; +} + +void +config_keys_load () { + gchar *filename; + + _config_keyfile = g_key_file_new (); + + filename = _config_get_key_file_path (); + + g_key_file_load_from_file ( + _config_keyfile, + filename, + 0, + NULL + ); + + g_free (filename); +} + +gchar * +config_keys_get_data_folder_path () { + gchar *result; + + if (_config_keyfile == NULL) + config_keys_load (); + + result = g_key_file_get_value ( + _config_keyfile, + "Default", + "Data Folder", + NULL + ); + + if (result == NULL) + result = g_strdup (""); + + return result; +} + +void +config_keys_set_data_folder_path (const gchar *filename) { + if (_config_keyfile == NULL) + config_keys_load (); + + g_key_file_set_value ( + _config_keyfile, + "Default", + "Data Folder", + filename + ); +} + +gint +config_keys_get_tile_size () { + /* TODO */ + return 32; +} + +void +config_keys_save () { + gchar *filename; + + if (_config_keyfile == NULL) + return; + + filename = _config_get_config_folder (); + mkdir (filename, S_IRWXU); + g_free (filename); + + filename = _config_get_key_file_path (); + + g_key_file_save_to_file ( + _config_keyfile, + filename, + NULL + ); + + g_free (filename); +} + +static XMLNode *_config_paths_xml_root = NULL; + +void +config_data_paths_load () { + gchar *filename; + gchar *df_path; + + df_path = config_keys_get_data_folder_path (); + + filename = g_strjoin ( + "/", + df_path, + "paths.xml", + NULL + ); + + _config_paths_xml_root = xml_parse_file (filename); + + g_free (df_path); + g_free (filename); +} + +gchar * +config_data_paths_get_sprites_path () { + XMLNode *node; + GList *list; + gchar *name; + + if (_config_paths_xml_root == NULL) + config_data_paths_load (); + + node = _config_paths_xml_root; + + if (node != NULL) { + list = node->sub_nodes; + while (TRUE) { + list = g_list_find_custom ( + list, + "option", + xml_node_compare_with_name_func + ); + + if (list == NULL) + break; + + name = xml_node_get_attr_value (list->data, "name"); + if (name != NULL && g_strcmp0 (name, "sprites") == 0) { + g_free (name); + return xml_node_get_attr_value (list->data, "value"); + } + + g_free(name); + list = list->next; + } + } + + return g_strdup (""); +} + +gchar * +config_data_path_get_full_sprite_path (const gchar *rel_path) { + gchar *data_folder, *sprites_path, *filename; + + data_folder = config_keys_get_data_folder_path (); + sprites_path = config_data_paths_get_sprites_path (); + + filename = g_strjoin ( + "/", + data_folder, + sprites_path, + rel_path, + NULL + ); + + g_free (sprites_path); + g_free (data_folder); + + return filename; +} |