diff options
| -rw-r--r-- | src/mo_edit.c | 54 | ||||
| -rw-r--r-- | src/save.c | 363 | ||||
| -rw-r--r-- | src/save.h | 9 |
3 files changed, 186 insertions, 240 deletions
diff --git a/src/mo_edit.c b/src/mo_edit.c index 3fff401..92e4b54 100644 --- a/src/mo_edit.c +++ b/src/mo_edit.c @@ -7,8 +7,6 @@ #include "config.h" #include "project_base.h" -#include "languages.h" - // TODO(Aldrik): option to disable menu item // TODO(Aldrik): move the delete button for term to edit panel on the topright and put a exclamation mark at the old spot to indicate a missing translation // TODO(Aldrik): language name validation @@ -17,6 +15,7 @@ // TODO(Aldrik): change save icon s32 global_language_id = 1; +char project_path[MAX_INPUT_LENGTH]; #define MAX_LANGUAGE_COUNT 100 @@ -47,6 +46,9 @@ typedef struct t_translation_project translation_project *current_project = 0; +#include "save.h" +#include "save.c" + scroll_state term_scroll; scroll_state lang_scroll; scroll_state trans_scroll; @@ -346,6 +348,14 @@ void load_config(settings_config *config) char *path = settings_config_get_string(config, "ACTIVE_PROJECT"); char *locale_id = settings_config_get_string(config, "LOCALE"); + if (path) + { + string_copyn(project_path, path, MAX_INPUT_LENGTH); + + start_new_project(); + load_project_from_file(project_path); + } + if (locale_id) set_locale(locale_id); else @@ -461,18 +471,26 @@ int main(int argc, char **argv) // TODO(Aldrik): translate if (ui_push_menu_item("Load Project", "Ctrl + O")) { + start_new_project(); + load_project(); } // TODO(Aldrik): translate if (ui_push_menu_item("Save Project", "Ctrl + S")) { + if (string_equals(project_path, "")) + save_project(); + else + save_project_to_file(project_path); } // TODO(Aldrik): translate if (ui_push_menu_item("Save Project As", "Ctrl + E")) { + save_project(); } // TODO(Aldrik): translate if (ui_push_menu_item("Export MO files", "Ctrl + X")) { + // TODO(Aldrik): export mo files } ui_push_menu_item_separator(); if (ui_push_menu_item(localize("quit"), "Ctrl + Q")) @@ -682,9 +700,10 @@ int main(int argc, char **argv) ui_block_begin(LAYOUT_HORIZONTAL); { // TODO(Aldrik): translate + bool selected = tb_new_language.state; ui_push_textbox(&tb_new_language, "Add language"); - if (keyboard_is_key_pressed(&keyboard, KEY_ENTER)) + if (keyboard_is_key_pressed(&keyboard, KEY_ENTER) && selected) { add_language_to_project(tb_new_language.buffer); ui_set_textbox_text(&tb_new_language, ""); @@ -755,6 +774,31 @@ int main(int argc, char **argv) render_rectangle(330, 240, 10, 25, MISSING_TRANSLATION_COLOR); render_text(font_small, 350, 248, "Missing translation", global_ui_context.style.foreground); } + + if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_O)) + { + start_new_project(); + load_project(); + } + if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_S)) + { + if (string_equals(project_path, "")) + save_project(); + else + save_project_to_file(project_path); + } + if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_E)) + { + save_project(); + } + if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_X)) + { + // TODO(Aldrik): export mo files + } + if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_Q)) + { + window.is_open = false; + } } ui_end(); // end ui @@ -777,7 +821,8 @@ int main(int argc, char **argv) settings_page_hide_without_save(); // write config file - //settings_config_set_string(&config, "ACTIVE_PROJECT", textbox_path.buffer); + if (!string_equals(project_path, "")) + settings_config_set_string(&config, "ACTIVE_PROJECT", project_path); vec2 win_size = platform_get_window_size(&window); settings_config_set_number(&config, "WINDOW_WIDTH", win_size.x); @@ -791,7 +836,6 @@ int main(int argc, char **argv) settings_config_set_string(&config, "LOCALE", current_locale_id); } } - printf("%s\n", config_path_buffer); settings_config_write_to_file(&config, config_path_buffer); settings_config_destroy(&config); @@ -4,117 +4,97 @@ * All rights reserved. */ -search_result *create_empty_search_result(); -void* destroy_search_result_thread(void *arg); - -static void write_json_file(char *buffer, s32 length, search_result *search_result) +static void write_json_file(char *buffer, s32 length) { - array matches = search_result->matches; - cJSON *result = cJSON_CreateObject(); - if (cJSON_AddStringToObject(result, "search_directory", - search_result->directory_to_search) == NULL) - return; - - if (cJSON_AddStringToObject(result, "filter", - search_result->file_filter) == NULL) - return; - - if (cJSON_AddStringToObject(result, "search_query", - search_result->text_to_find) == NULL) - return; - - if (cJSON_AddNumberToObject(result, "duration_us", - search_result->find_duration_us) == NULL) - return; - - if (cJSON_AddNumberToObject(result, "show_error", - search_result->show_error_message) == NULL) - return; - - if (cJSON_AddNumberToObject(result, "file_match_found", - search_result->found_file_matches) == NULL) - return; - - if (cJSON_AddNumberToObject(result, "files_searched", - search_result->files_searched) == NULL) - return; - - if (cJSON_AddNumberToObject(result, "files_matched", - search_result->files_matched) == NULL) - return; - - if (cJSON_AddNumberToObject(result, "query_match_found", - search_result->match_found) == NULL) - return; - - if (cJSON_AddNumberToObject(result, "recursive_search", - search_result->is_recursive) == NULL) + if (cJSON_AddNumberToObject(result, "next_language_id", + global_language_id) == NULL) return; - cJSON *match_list = cJSON_AddArrayToObject(result, "match_list"); - - if (!match_list) return; + cJSON *langs = cJSON_AddArrayToObject(result, "languages"); + if (!langs) return; - for (s32 i = 0; i < matches.length; i++) + for (s32 i = 0; i < current_project->languages.length; i++) { - file_match* m = array_at(&matches, i); - cJSON *item = cJSON_CreateObject(); + language *lang = array_at(¤t_project->languages, i); - if (cJSON_AddStringToObject(item, "path", - m->file.path) == NULL) + if (cJSON_AddStringToObject(item, "name", lang->name) == NULL) return; - if (cJSON_AddStringToObject(item, "matched_filter", - m->file.matched_filter) == NULL) + if (cJSON_AddNumberToObject(item, "id", lang->id) == NULL) return; - if (cJSON_AddNumberToObject(item, "word_offset", - m->word_match_offset) == NULL) - return; - - if (cJSON_AddNumberToObject(item, "word_length", - m->word_match_length) == NULL) - return; - - if (cJSON_AddNumberToObject(item, "file_error", - m->file_error) == NULL) - return; + cJSON_AddItemToArray(langs, item); + } + + cJSON *terms = cJSON_AddArrayToObject(result, "terms"); + if (!terms) return; + + for (s32 i = 0; i < current_project->terms.length; i++) + { + cJSON *item = cJSON_CreateObject(); + term *trm = array_at(¤t_project->terms, i); - if (cJSON_AddNumberToObject(item, "line_nr", - m->line_nr) == NULL) + if (cJSON_AddStringToObject(item, "name", trm->name) == NULL) return; - if (cJSON_AddNumberToObject(item, "file_size", - m->file_size) == NULL) - return; + cJSON *translations = cJSON_AddArrayToObject(item, "translations"); + if (!translations) return; - if (m->line_info) - { - if (cJSON_AddStringToObject(item, "line_info", - m->line_info) == NULL) - return; - } - else + for (s32 x = 0; x < trm->translations.length; x++) { - if (cJSON_AddNumberToObject(item, "line_info", 0) == NULL) + cJSON *sub_item = cJSON_CreateObject(); + translation *tr = array_at(&trm->translations, x); + + if (cJSON_AddNumberToObject(sub_item, "language_id", tr->language_id) == NULL) return; + + if (tr->value) + { + if (cJSON_AddStringToObject(sub_item, "value", tr->value) == NULL) + return; + } + else + { + if (cJSON_AddNumberToObject(sub_item, "value", 0) == NULL) + return; + } + + cJSON_AddItemToArray(translations, sub_item); } - cJSON_AddItemToArray(match_list, item); + cJSON_AddItemToArray(terms, item); } cJSON_PrintPreallocated(result, buffer, length, true); cJSON_Delete(result); } -static void *export_result_d(void *arg) +void save_project_to_file(char *path_buf) { - search_result *search_result = arg; + s32 size = ((current_project->terms.length+1)* + (current_project->languages.length+1)*MAX_INPUT_LENGTH)*2; + + char *buffer = mem_alloc(size); + memset(buffer, 0, size); + + char *file_extension = get_file_extension(path_buf); + if (string_equals(file_extension, ".json") || string_equals(file_extension, "")) + { + write_json_file(buffer, size); + } - array matches = search_result->files; + if (string_equals(file_extension, "")) + { + string_appendn(path_buf, ".json", MAX_INPUT_LENGTH); + } + platform_write_file_content(path_buf, "w", buffer, size); +} + +static void *save_project_d(void *arg) +{ char path_buf[MAX_INPUT_LENGTH]; path_buf[0] = 0; @@ -124,21 +104,14 @@ static void *export_result_d(void *arg) char default_save_file_extension[50]; string_copyn(default_save_file_extension, "json", 50); - if (!search_result->is_command_line_search) - { - struct open_dialog_args *args = mem_alloc(sizeof(struct open_dialog_args)); - args->buffer = path_buf; - args->type = SAVE_FILE; - args->file_filter = SEARCH_RESULT_FILE_EXTENSION; - args->start_path = start_path; - args->default_save_file_extension = default_save_file_extension; - - platform_open_file_dialog_block(args); - } - else - { - string_copyn(path_buf, search_result->export_path, MAX_INPUT_LENGTH); - } + struct open_dialog_args *args = mem_alloc(sizeof(struct open_dialog_args)); + args->buffer = path_buf; + args->type = SAVE_FILE; + args->file_filter = SAVE_FILE_EXTENSION; + args->start_path = start_path; + args->default_save_file_extension = default_save_file_extension; + + platform_open_file_dialog_block(args); char tmp_dir_buffer[MAX_INPUT_LENGTH]; get_directory_from_path(tmp_dir_buffer, path_buf); @@ -150,158 +123,103 @@ static void *export_result_d(void *arg) if (string_equals(tmp_name_buffer, "")) return 0; if (!platform_directory_exists(tmp_dir_buffer)) return 0; - s32 size = matches.length * (MAX_INPUT_LENGTH*10); - char *buffer = mem_alloc(size); - memset(buffer, 0, size); - - char *file_extension = get_file_extension(path_buf); - if (string_equals(file_extension, ".json") || string_equals(file_extension, "")) - { - write_json_file(buffer, size, search_result); - } - - if (string_equals(file_extension, "")) - { - string_appendn(path_buf, ".json", MAX_INPUT_LENGTH); - } - - platform_write_file_content(path_buf, "w", buffer, size); - + string_copyn(project_path, path_buf, MAX_INPUT_LENGTH); + save_project_to_file(path_buf); return 0; } -bool export_results(search_result *search_result) +void save_project() { thread thr; thr.valid = false; while (!thr.valid) - thr = thread_start(export_result_d, search_result); + thr = thread_start(save_project_d, 0); - if (!search_result->is_command_line_search) - thread_detach(&thr); - else - thread_join(&thr); - - return true; + thread_detach(&thr); } -static bool read_json_file(char *buffer, s32 size, search_result *search_result) +static bool read_json_file(char *buffer, s32 size) { cJSON *result = cJSON_Parse(buffer); if (!result) return false; - cJSON *search_directory = cJSON_GetObjectItemCaseSensitive(result, "search_directory"); - string_copyn(textbox_path.buffer, search_directory->valuestring, MAX_INPUT_LENGTH); - string_copyn(search_result->directory_to_search, search_directory->valuestring, MAX_INPUT_LENGTH); - - cJSON *filter = cJSON_GetObjectItemCaseSensitive(result, "filter"); - string_copyn(textbox_file_filter.buffer, filter->valuestring, MAX_INPUT_LENGTH); - string_copyn(search_result->file_filter, filter->valuestring, MAX_INPUT_LENGTH); - - cJSON *search_query = cJSON_GetObjectItemCaseSensitive(result, "search_query"); - string_copyn(textbox_search_text.buffer, search_query->valuestring, MAX_INPUT_LENGTH); - string_copyn(search_result->text_to_find, search_query->valuestring, MAX_INPUT_LENGTH); - - cJSON *duration_us = cJSON_GetObjectItemCaseSensitive(result, "duration_us"); - search_result->find_duration_us = duration_us->valueint; - - cJSON *show_error = cJSON_GetObjectItemCaseSensitive(result, "show_error"); - search_result->show_error_message = show_error->valueint; - - cJSON *file_match_found = cJSON_GetObjectItemCaseSensitive(result, "file_match_found"); - search_result->found_file_matches = file_match_found->valueint; - - cJSON *files_searched = cJSON_GetObjectItemCaseSensitive(result, "files_searched"); - search_result->files_searched = files_searched->valueint; + cJSON *nlid = cJSON_GetObjectItem(result, "next_language_id"); + global_language_id = nlid->valueint; - cJSON *files_matched = cJSON_GetObjectItemCaseSensitive(result, "files_matched"); - search_result->files_matched = files_matched->valueint; - - cJSON *query_match_found = cJSON_GetObjectItemCaseSensitive(result, "query_match_found"); - search_result->match_found = query_match_found->valueint; - - cJSON *recursive = cJSON_GetObjectItemCaseSensitive(result, "recursive_search"); - search_result->is_recursive = recursive->valueint; - checkbox_recursive.state = search_result->is_recursive; - - search_result->search_result_source_dir_len = strlen(search_result->directory_to_search); - - cJSON *file_list = cJSON_GetObjectItem(result, "match_list"); - cJSON *file; - cJSON_ArrayForEach(file, file_list) + cJSON *language_list = cJSON_GetObjectItem(result, "languages"); + cJSON *lang; + cJSON_ArrayForEach(lang, language_list) { - file_match new_match; - - //// - cJSON *path = cJSON_GetObjectItem(file, "path"); - new_match.file.path = memory_bucket_reserve(&search_result->mem_bucket, strlen(path->valuestring)+1); - string_copyn(new_match.file.path, path->valuestring, strlen(path->valuestring)+1); - - //// - cJSON *matched_filter = cJSON_GetObjectItem(file, "matched_filter"); - new_match.file.matched_filter = memory_bucket_reserve(&search_result->mem_bucket, strlen(matched_filter->valuestring)+1); - string_copyn(new_match.file.matched_filter, matched_filter->valuestring, strlen(matched_filter->valuestring)+1); + language new_language; //// - cJSON *word_offset = cJSON_GetObjectItem(file, "word_offset"); - new_match.word_match_offset = word_offset->valueint; + cJSON *langid = cJSON_GetObjectItem(lang, "id"); + new_language.id = langid->valueint; //// - cJSON *word_length = cJSON_GetObjectItem(file, "word_length"); - new_match.word_match_length = word_length->valueint; + cJSON *langname = cJSON_GetObjectItem(lang, "name"); + new_language.name = mem_alloc(MAX_INPUT_LENGTH); + string_copyn(new_language.name, langname->valuestring, MAX_INPUT_LENGTH); - //// - cJSON *file_error = cJSON_GetObjectItem(file, "file_error"); - new_match.file_error = file_error->valueint; + array_push(¤t_project->languages, &new_language); + } + + cJSON *term_list = cJSON_GetObjectItem(result, "terms"); + cJSON *term_dat; + cJSON_ArrayForEach(term_dat, term_list) + { + term new_term; //// - cJSON *line_nr = cJSON_GetObjectItem(file, "line_nr"); - new_match.line_nr = line_nr->valueint; + cJSON *term_datname = cJSON_GetObjectItem(term_dat, "name"); + new_term.name = mem_alloc(MAX_INPUT_LENGTH); + string_copyn(new_term.name, term_datname->valuestring, MAX_INPUT_LENGTH); - //// - cJSON *file_size = cJSON_GetObjectItem(file, "file_size"); - new_match.file_size = file_size->valueint; + new_term.translations = array_create(sizeof(translation)); + array_reserve(&new_term.translations, current_project->languages.length); - //// - cJSON *line_info = cJSON_GetObjectItem(file, "line_info"); - if (cJSON_IsString(line_info)) + cJSON *trans_list = cJSON_GetObjectItem(term_dat, "translations"); + cJSON *trans_dat; + cJSON_ArrayForEach(trans_dat, trans_list) { - new_match.line_info = memory_bucket_reserve(&search_result->mem_bucket, strlen(line_info->valuestring)+1); - string_copyn(new_match.line_info, line_info->valuestring, strlen(line_info->valuestring)+1); - search_result->match_found = true; - } - else - { - new_match.line_info = 0; - } - - // calculate highlight offsets - if (new_match.line_info) - { - new_match.word_match_offset_x = - calculate_text_width_upto(font_mini, new_match.line_info, new_match.word_match_offset); + translation new_translation; + + //// + cJSON *trans_datlanid = cJSON_GetObjectItem(trans_dat, "language_id"); + new_translation.language_id = trans_datlanid->valueint; + + //// + cJSON *trans_datname = cJSON_GetObjectItem(trans_dat, "value"); + new_translation.value = mem_alloc(MAX_INPUT_LENGTH); + + if (cJSON_IsString(trans_datname)) + { + new_translation.value = mem_alloc(MAX_INPUT_LENGTH); + string_copyn(new_translation.value, trans_datname->valuestring, MAX_INPUT_LENGTH); + } + else + new_translation.value = 0; - new_match.word_match_width = - calculate_text_width_from_upto(font_mini, new_match.line_info, new_match.word_match_offset, new_match.word_match_offset + new_match.word_match_length); + array_push(&new_term.translations, &new_translation); } - array_push(&search_result->matches, &new_match); + array_push(¤t_project->terms, &new_term); } return true; } -void import_results_from_file(char *path_buf) + +void load_project_from_file(char *path_buf) { char *file_extension = get_file_extension(path_buf); - if (!string_equals(file_extension, ".json") && !string_equals(file_extension, ".xml") && !string_equals(file_extension, ".yaml")) + if (!string_equals(file_extension, ".json")) { platform_show_message(main_window, localize("invalid_search_result_file"), localize("error_importing_results")); return; } - scroll_y = 0; file_content content = platform_read_file_content(path_buf, "r"); if (!content.content || content.file_error) @@ -310,30 +228,12 @@ void import_results_from_file(char *path_buf) return; } - search_result *new_result = create_empty_search_result(); - search_result *old_result = current_search_result; - current_search_result = new_result; - - thread cleanup_thread = thread_start(destroy_search_result_thread, old_result); - thread_detach(&cleanup_thread); - if (string_equals(file_extension, ".json")) { - bool result = read_json_file(content.content, content.content_length, new_result); + bool result = read_json_file(content.content, content.content_length); if (!result) goto failed_to_load_file; } - else - { - goto failed_to_load_file; - } - - new_result->walking_file_system = false; - new_result->done_finding_matches = true; - new_result->done_finding_files = true; - - snprintf(global_status_bar.result_status_text, MAX_INPUT_LENGTH, localize("files_matches_comparison"), current_search_result->matches.length, current_search_result->files_searched, current_search_result->find_duration_us/1000.0); - array_destroy(&new_result->files); platform_destroy_file_content(&content); return; @@ -342,7 +242,7 @@ void import_results_from_file(char *path_buf) platform_destroy_file_content(&content); } -static void* import_results_d(void *arg) +static void* load_project_d(void *arg) { char path_buf[MAX_INPUT_LENGTH]; path_buf[0] = 0; @@ -356,7 +256,7 @@ static void* import_results_d(void *arg) struct open_dialog_args *args = mem_alloc(sizeof(struct open_dialog_args)); args->buffer = path_buf; args->type = OPEN_FILE; - args->file_filter = SEARCH_RESULT_FILE_EXTENSION; + args->file_filter = SAVE_FILE_EXTENSION; args->start_path = start_path; args->default_save_file_extension = default_save_file_extension; @@ -365,16 +265,17 @@ static void* import_results_d(void *arg) if (string_equals(path_buf, "")) return 0; if (!platform_file_exists(path_buf)) return 0; - import_results_from_file(path_buf); + string_copyn(project_path, path_buf, MAX_INPUT_LENGTH); + load_project_from_file(path_buf); return 0; } -void import_results() +void load_project() { thread thr; thr.valid = false; while (!thr.valid) - thr = thread_start(import_results_d, 0); + thr = thread_start(load_project_d, 0); thread_detach(&thr); }
\ No newline at end of file @@ -7,10 +7,11 @@ #ifndef INCLUDE_SAVE #define INCLUDE_SAVE -#define SEARCH_RESULT_FILE_EXTENSION "*.json" +#define SAVE_FILE_EXTENSION "*.json" -bool export_results(search_result *result); -void import_results_from_file(char *path_buf); -void import_results(); +void load_project_from_file(char *path_buf); +void load_project(); +void save_project_to_file(char *path_buf); +void save_project(); #endif
\ No newline at end of file |
