diff options
Diffstat (limited to 'src/mo_edit.c')
| -rw-r--r-- | src/mo_edit.c | 860 |
1 files changed, 0 insertions, 860 deletions
diff --git a/src/mo_edit.c b/src/mo_edit.c deleted file mode 100644 index 134da15..0000000 --- a/src/mo_edit.c +++ /dev/null @@ -1,860 +0,0 @@ -/* -* BSD 2-Clause “Simplified” License -* Copyright (c) 2019, Aldrik Ramaekers, aldrik.ramaekers@protonmail.com -* All rights reserved. -*/ - -#include "config.h" -#include "project_base.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 -// TODO(Aldrik): language mo file name preview when entering name -// TODO(Aldrik): option to mark languages with colors -// TODO(Aldrik): change save icon -// TODO(Aldrik): press tab to go to next translation textbox -// TODO(Aldrik): scissor on textbox in scroll -// TODO(Aldrik): delete file of language when deleting language -// TODO(Aldrik): confirmation on deletion of term and language -// TODO(Aldrik): creating a new term when term name textbox is selected doesnt overwrite new name -// TODO(Aldrik): deleting the term selected doesnt select a valid term -// TODO(Aldrik): reset textbox vertical scroll when new term is selected -// TODO(Aldrik): ctrl+x to select+delete selection -// TODO(Aldrik): ctrl+del to delete up to space char - -s32 global_language_id = 1; -char project_path[MAX_INPUT_LENGTH]; - -#define MAX_LANGUAGE_COUNT 100 - -typedef struct t_language -{ - char *name; - s32 id; -} language; - -typedef struct t_translation -{ - s32 language_id; - char *value; -} translation; - -typedef struct t_term -{ - char *name; - array translations; -} term; - -typedef struct t_translation_project -{ - array languages; - array terms; - int selected_term_index; -} 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; -button_state btn_new_project; -button_state btn_new_language; -button_state btn_summary; -button_state btn_set_term_name; -dropdown_state dd_available_countries; -textbox_state tb_filter; -textbox_state tb_new_term; -textbox_state tb_new_language; -textbox_state tb_translation_list[MAX_LANGUAGE_COUNT]; - -image *set_img; -image *add_img; -image *list_img; -image *exclaim_img; -image *delete_img; -image *logo_small_img; - -font *font_medium; -font *font_small; -font *font_mini; -s32 scroll_y = 0; - -#include "settings.h" -#include "settings.c" - -static void load_assets() -{ - list_img = assets_load_image(_binary____data_imgs_list_png_start, - _binary____data_imgs_list_png_end, false); - exclaim_img = assets_load_image(_binary____data_imgs_exclaim_png_start, - _binary____data_imgs_exclaim_png_end, false); - logo_small_img = assets_load_image(_binary____data_imgs_logo_64_png_start, - _binary____data_imgs_logo_64_png_end, true); - delete_img = assets_load_image(_binary____data_imgs_delete_png_start, - _binary____data_imgs_delete_png_end, false); - add_img = assets_load_image(_binary____data_imgs_add_png_start, - _binary____data_imgs_add_png_end, false); - set_img = assets_load_image(_binary____data_imgs_set_png_start, - _binary____data_imgs_set_png_end, false); - - font_medium = assets_load_font(_binary____data_fonts_mono_ttf_start, - _binary____data_fonts_mono_ttf_end, 18); - font_small = assets_load_font(_binary____data_fonts_mono_ttf_start, - _binary____data_fonts_mono_ttf_end, 15); - font_mini = assets_load_font(_binary____data_fonts_mono_ttf_start, - _binary____data_fonts_mono_ttf_end, 12); -} - -bool term_has_missing_translations(term *t) -{ - for (s32 i = 0; i < t->translations.length; i++) - { - translation *tr = array_at(&t->translations, i); - if (string_equals(tr->value, "")) return true; - } - - return false; -} - -s32 get_translated_count_for_language(s32 language_id) -{ - s32 count = 0; - for (s32 i = 0; i < current_project->terms.length; i++) - { - term *t = array_at(¤t_project->terms, i); - - for (s32 x = 0; x < t->translations.length; x++) - { - translation *tr = array_at(&t->translations, x); - - if (tr->language_id == language_id && !string_equals(tr->value, "")) - { - count++; - break; - } - } - } - - return count; -} - -bool term_name_is_available(char *name) -{ - for (s32 i = 0; i < current_project->terms.length; i++) - { - term *tr = array_at(¤t_project->terms, i); - - if (string_equals(tr->name, name)) - { - return false; - } - } - - return true; -} - -language* get_language_by_id(s32 language_id) -{ - for (s32 i = 0; i < current_project->languages.length; i++) - { - language *l = array_at(¤t_project->languages, i); - if (l->id == language_id) - { - return l; - } - } - return 0; -} - -s32 add_language_to_project(char *buffer) -{ - if (string_equals(buffer, "")) - { - // TODO(Aldrik): localize - platform_show_message(main_window, "Language name cannot be empty", "Invalid info"); - return -1; - } - - char *val = mem_alloc(MAX_INPUT_LENGTH); - string_copyn(val, buffer, MAX_INPUT_LENGTH); - - language l; - l.name = val; - l.id = global_language_id++; - - s32 index = array_push(¤t_project->languages, &l); - - for (s32 x = 0; x < current_project->terms.length; x++) - { - term *t = array_at(¤t_project->terms, x); - - translation new_t; - new_t.value = mem_alloc(MAX_INPUT_LENGTH); - string_copyn(new_t.value, "", MAX_INPUT_LENGTH); - new_t.language_id = l.id; - - array_push(&t->translations, &new_t); - } - - return l.id; -} - -void set_term_name(s32 index, char *name) -{ - if (strlen(name) > 0) - { - term *t = array_at(¤t_project->terms, index); - string_copyn(t->name, name, MAX_TERM_NAME_LENGTH); - } - else - { - platform_show_message(main_window, localize("term_name_cannot_be_empty"), localize("invalid_input")); - } -} - -void remove_term_from_project(s32 index) -{ - term *t = array_at(¤t_project->terms, index); - mem_free(t->name); - for (s32 i = 0; i < t->translations.length; i++) - { - translation *tr = array_at(&t->translations, i); - mem_free(tr->value); - } - array_destroy(&t->translations); - array_remove_at(¤t_project->terms, index); -} - -void remove_language_from_project(s32 language_id) -{ - for (s32 i = 0; i < current_project->languages.length; i++) - { - language *l = array_at(¤t_project->languages, i); - if (l->id == language_id) - { - array_remove_at(¤t_project->languages, i); - break; - } - } - - for (s32 x = 0; x < current_project->terms.length; x++) - { - term *tr = array_at(¤t_project->terms, x); - - for (s32 i = 0; i < tr->translations.length; i++) - { - translation *t = array_at(&tr->translations, i); - - if (t->language_id == language_id) - { - mem_free(t->value); - array_remove_at(&tr->translations, i); - break; - } - } - } -} - -void select_term(s32 index) -{ - current_project->selected_term_index = index; - term *t = array_at(¤t_project->terms, index); - ui_set_textbox_text(&tb_new_term, t->name); - - for (s32 i = 0; i < current_project->languages.length; i++) - { - translation *tr = array_at(&t->translations, i); - textbox_state *tb = &tb_translation_list[i]; - tb->state = false; - - if (tr->value) - { - ui_set_textbox_text(tb, tr->value); - } - else - { - ui_set_textbox_text(tb, ""); - } - } -} - -s32 add_term_to_project() -{ - tb_filter.state = 0; - ui_set_textbox_text(&tb_filter, ""); - - term t; - t.name = mem_alloc(MAX_TERM_NAME_LENGTH); - - s32 count = 0; - do - { - char buffer[MAX_TERM_NAME_LENGTH]; - sprintf(buffer, "term_%d", count); - string_copyn(t.name, buffer, MAX_TERM_NAME_LENGTH); - count++; - } - while(!term_name_is_available(t.name)); - - t.translations = array_create(sizeof(translation)); - array_reserve(&t.translations, current_project->languages.length); - - for (s32 i = 0; i < current_project->languages.length; i++) - { - language *l = array_at(¤t_project->languages, i); - - translation tr; - tr.value = mem_alloc(MAX_INPUT_LENGTH); - string_copyn(tr.value, "", MAX_INPUT_LENGTH); - tr.language_id = l->id; - array_push(&t.translations, &tr); - } - - return array_push(¤t_project->terms, &t); -} - -void save_term_changes() -{ - set_term_name(current_project->selected_term_index, tb_new_term.buffer); - - term *t = array_at(¤t_project->terms, current_project->selected_term_index); - - for (s32 i = 0; i < current_project->languages.length; i++) - { - translation *tr = array_at(&t->translations, i); - textbox_state *tb = &tb_translation_list[i]; - - string_copyn(tr->value, tb->buffer, MAX_INPUT_LENGTH); - } -} - -void start_new_project() -{ - global_language_id = 1; - current_project = mem_alloc(sizeof(translation_project)); - - current_project->terms = array_create(sizeof(term)); - array_reserve(¤t_project->terms, 100); - current_project->terms.reserve_jump = 100; - - current_project->languages = array_create(sizeof(language)); - array_reserve(¤t_project->languages, 100); - current_project->languages.reserve_jump = 100; - - current_project->selected_term_index = -1; -} - -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); - - if (platform_directory_exists(project_path)) - { - load_project_from_folder(project_path); - } - else - { - string_copyn(project_path, "", MAX_INPUT_LENGTH); - } - } - - if (locale_id) - set_locale(locale_id); - else - set_locale("en"); -} - -#if defined(OS_LINUX) || defined(OS_WIN) -int main(int argc, char **argv) -{ - platform_init(argc, argv); - - bool is_command_line_run = (argc > 1); - if (is_command_line_run) - { - handle_command_line_arguments(argc, argv); - return 0; - } - - char config_path_buffer[PATH_MAX]; - get_config_save_location(config_path_buffer); - - // load config - settings_config config = settings_config_load_from_file(config_path_buffer); - - s32 window_w = settings_config_get_number(&config, "WINDOW_WIDTH"); - s32 window_h = settings_config_get_number(&config, "WINDOW_HEIGHT"); - if (window_w < 800 || window_h < 600) - { - window_w = 800; - window_h = 600; - } - - platform_window window = platform_open_window("mo-edit", window_w, window_h, 0, 0, 800, 600); - main_window = &window; - - settings_page_create(); - - load_available_localizations(); - set_locale("en"); - - load_assets(); - - keyboard_input keyboard = keyboard_input_create(); - mouse_input mouse = mouse_input_create(); - - camera camera; - camera.x = 0; - camera.y = 0; - camera.rotation = 0; - - ui_create(&window, &keyboard, &mouse, &camera, font_small); - term_scroll = ui_create_scroll(1); - lang_scroll = ui_create_scroll(1); - trans_scroll = ui_create_scroll(1); - btn_summary = ui_create_button(); - btn_set_term_name = ui_create_button(); - btn_new_project = ui_create_button(); - btn_new_language = ui_create_button(); - tb_filter = ui_create_textbox(MAX_INPUT_LENGTH); - tb_new_term = ui_create_textbox(MAX_TERM_NAME_LENGTH); - tb_new_language = ui_create_textbox(MAX_INPUT_LENGTH); - - for (s32 i = 0; i < MAX_LANGUAGE_COUNT; i++) - tb_translation_list[i] = ui_create_textbox(MAX_INPUT_LENGTH); - - // asset worker - thread asset_queue_worker1 = thread_start(assets_queue_worker, NULL); - thread asset_queue_worker2 = thread_start(assets_queue_worker, NULL); - thread_detach(&asset_queue_worker1); - thread_detach(&asset_queue_worker2); - - load_config(&config); - - while(window.is_open) { - u64 last_stamp = platform_get_time(TIME_FULL, TIME_US); - platform_handle_events(&window, &mouse, &keyboard); - platform_set_cursor(&window, CURSOR_DEFAULT); - - settings_page_update_render(); - - platform_window_make_current(&window); - - static bool icon_loaded = false; - if (!icon_loaded && logo_small_img->loaded) - { - icon_loaded = true; - platform_set_icon(&window, logo_small_img); - } - - if (global_asset_collection.queue.queue.length == 0 && !global_asset_collection.done_loading_assets) - { - global_asset_collection.done_loading_assets = true; - } - - global_ui_context.layout.active_window = &window; - global_ui_context.keyboard = &keyboard; - global_ui_context.mouse = &mouse; - - render_clear(); - camera_apply_transformations(&window, &camera); - - global_ui_context.layout.width = global_ui_context.layout.active_window->width; - // begin ui - - ui_begin(1); - { - render_rectangle(0, 0, main_window->width, main_window->height, global_ui_context.style.background); - - ui_begin_menu_bar(); - { - if (ui_push_menu(localize("file"))) - { - if (ui_push_menu_item(localize("load_project"), "Ctrl + O")) - { - load_project(); - } - if (ui_push_menu_item(localize("save_project"), "Ctrl + S")) - { - if (string_equals(project_path, "")) - save_project(); - else - save_project_to_folder(project_path); - } - if (ui_push_menu_item(localize("save_project_as"), "Ctrl + E")) - { - save_project(); - } - ui_push_menu_item_separator(); - if (ui_push_menu_item(localize("quit"), "Ctrl + Q")) - { - window.is_open = false; - } - } - } - ui_end_menu_bar(); - - - // TODO(Aldrik): make this a setting, resizable panel - global_ui_context.layout.width = 300; - ui_push_vertical_dragbar(); - - if (current_project) - { - ui_block_begin(LAYOUT_HORIZONTAL); - { - if (ui_push_button_image(&btn_summary, "", list_img)) - { - current_project->selected_term_index = -1; - } - - ui_push_textf_width(font_medium, localize("terms"), global_ui_context.layout.width-150); - - if (ui_push_button_image(&btn_summary, "", add_img)) - { - select_term(add_term_to_project()); - } - - //ui_push_button_image(&btn_summary, "", delete_img); - - } - ui_block_end(); - - ui_block_begin(LAYOUT_HORIZONTAL); - { - TEXTBOX_WIDTH = 280; - ui_push_textbox(&tb_filter, localize("filter_terms")); - } - ui_block_end(); - - ui_push_separator(); - - term_scroll.height = main_window->height-global_ui_context.layout.offset_y; - ui_scroll_begin(&term_scroll); - { - for (s32 i = 0; i < current_project->terms.length; i++) - { - term *t = array_at(¤t_project->terms, i); - - if (!strlen(tb_filter.buffer) || string_contains(t->name, tb_filter.buffer)) - { - bool removed = false; - if (ui_push_button_image(&btn_summary, "", delete_img)) - { - removed = true; - } - - //ui_push_image(exclaim_img, 14, 14, 1, rgb(255,255,255)); - - if (i == current_project->selected_term_index) - { - ui_push_rect(10, global_ui_context.style.textbox_active_border); - } - else if (term_has_missing_translations(t)) - { - ui_push_rect(10, MISSING_TRANSLATION_COLOR); - } - else - { - ui_push_rect(10, global_ui_context.style.background); - } - - if (ui_push_text_width(t->name, global_ui_context.layout.width-100, true)) - { - select_term(i); - } - - ui_block_end(); - - if (removed) - { - remove_term_from_project(i); - --i; - - if (current_project->selected_term_index >= 0) - current_project->selected_term_index--; - } - } - } - } - ui_scroll_end(); - } - else - { - if (ui_push_button(&btn_new_project, localize("create_new_project"))) - { - start_new_project(); - } - } - - global_ui_context.layout.width = main_window->width - 310; - - global_ui_context.layout.offset_x = 310; - global_ui_context.layout.offset_y = MENU_BAR_HEIGHT + WIDGET_PADDING; - - if (current_project && current_project->selected_term_index >= 0) - { - if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_S)) - { - save_term_changes(); - } - - term *t = array_at(¤t_project->terms, - current_project->selected_term_index); - - ui_block_begin(LAYOUT_HORIZONTAL); - { - // editor - - if (string_equals(tb_new_term.buffer, t->name)) - ui_push_rect(10, global_ui_context.style.background); - else - ui_push_rect(10, UNSAVED_CHANGES_COLOR); - - ui_push_textbox(&tb_new_term, localize("term_name")); - - if (ui_push_button_image(&btn_set_term_name, "", set_img)) - { - save_term_changes(); - } - } - ui_block_end(); - - global_ui_context.layout.offset_x = 310; - ui_push_separator(); - - trans_scroll.height = main_window->height-global_ui_context.layout.offset_y; - - ui_scroll_begin(&trans_scroll); - { - if (!current_project->languages.length) - { - ui_push_text(localize("no_languages_added")); - } - else - { - for (s32 i = 0; i < t->translations.length; i++) - { - translation *tr = array_at(&t->translations, i); - - TEXTBOX_WIDTH = global_ui_context.layout.width - 130; - - if (!strlen(tb_translation_list[i].buffer)) - { - ui_push_rect(10, MISSING_TRANSLATION_COLOR); - } - else if (string_equals(tb_translation_list[i].buffer, - tr->value)) - { - ui_push_rect(10, global_ui_context.style.background); - } - else - { - ui_push_rect(10, UNSAVED_CHANGES_COLOR); - } - - ui_push_textbox(&tb_translation_list[i], ""); - - language *l = get_language_by_id(tr->language_id); - ui_push_text(l->name); - - global_ui_context.layout.offset_y += TEXTBOX_HEIGHT + WIDGET_PADDING; - global_ui_context.layout.offset_x = 310; - } - } - } - ui_scroll_end(); - } - else if (current_project) - { - // overview - ui_block_begin(LAYOUT_HORIZONTAL); - { - ui_push_textf_width(font_medium, localize("overview"), 100); - - char info_text[60]; - sprintf(info_text, localize("info_text"), current_project->terms.length, current_project->languages.length); - - color c = global_ui_context.style.foreground; - global_ui_context.style.foreground = rgb(110,110,110); - ui_push_textf(font_small, info_text); - global_ui_context.style.foreground = c; - } - ui_block_end(); - - ui_push_separator(); - - ui_block_begin(LAYOUT_HORIZONTAL); - { - bool selected = tb_new_language.state; - ui_push_textbox(&tb_new_language, localize("add_language")); - - if (keyboard_is_key_pressed(&keyboard, KEY_ENTER) && selected) - { - add_language_to_project(tb_new_language.buffer); - ui_set_textbox_text(&tb_new_language, ""); - keyboard_set_input_text(&keyboard, ""); - tb_new_language.state = true; - } - - if (ui_push_button(&btn_new_language, localize("add"))) - { - add_language_to_project(tb_new_language.buffer); - ui_set_textbox_text(&tb_new_language, ""); - keyboard_set_input_text(&keyboard, ""); - tb_new_language.state = true; - } - } - ui_block_end(); - - if (dd_available_countries.selected_index >= 0) - ui_push_separator(); - - // languages - lang_scroll.height = main_window->height-global_ui_context.layout.offset_y; - ui_scroll_begin(&lang_scroll); - { - for (s32 i = 0; i < current_project->languages.length; i++) - { - button_state btn_remove = ui_create_button(); - - bool pressed = false; - if (ui_push_button_image(&btn_remove, "", delete_img)) - { - pressed = true; - } - - language *l = array_at(¤t_project->languages, i); - ui_push_text_width(l->name, global_ui_context.layout.width-200, false); - - color c = global_ui_context.style.foreground; - global_ui_context.style.foreground = rgb(110,110,110); - - char stats[50]; - sprintf(stats, localize("translated_stats"), get_translated_count_for_language(l->id), current_project->terms.length); - ui_push_text(stats); - - global_ui_context.style.foreground = c; - - if (pressed) - { - remove_language_from_project(l->id); - i--; - } - - ui_block_end(); - } - } - ui_scroll_end(); - } - else - { - render_text(font_medium, 330, 50, localize("create_a_new_project"), global_ui_context.style.foreground); - render_text_cutoff(font_small, 330, 70, - localize("no_project_loaded_info"), global_ui_context.style.foreground, 400); - - render_rectangle(330, 200, 10, 25, UNSAVED_CHANGES_COLOR); - render_text(font_small, 350, 208, localize("unsaved_changes"), global_ui_context.style.foreground); - - render_rectangle(330, 240, 10, 25, MISSING_TRANSLATION_COLOR); - render_text(font_small, 350, 248, localize("missing_translation"), global_ui_context.style.foreground); - } - - if (keyboard_is_key_down(&keyboard, KEY_LEFT_CONTROL) && keyboard_is_key_pressed(&keyboard, KEY_O)) - { - 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_folder(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_Q)) - { - window.is_open = false; - } - } - ui_end(); - // end ui - - assets_do_post_process(); - platform_window_swap_buffers(&window); - - u64 current_stamp = platform_get_time(TIME_FULL, TIME_US); - u64 diff = current_stamp - last_stamp; - float diff_ms = diff / 1000.0f; - last_stamp = current_stamp; - - if (diff_ms < TARGET_FRAMERATE) - { - double time_to_wait = (TARGET_FRAMERATE) - diff_ms; - thread_sleep(time_to_wait*1000); - } - } - - settings_page_hide_without_save(); - - // write config file - 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); - settings_config_set_number(&config, "WINDOW_HEIGHT", win_size.y); - - if (global_localization.active_localization != 0) - { - char *current_locale_id = locale_get_id(); - if (current_locale_id) - { - settings_config_set_string(&config, "LOCALE", current_locale_id); - } - } - - settings_config_write_to_file(&config, config_path_buffer); - settings_config_destroy(&config); - - settings_page_destroy(); - - destroy_available_localizations(); - -#if 0 - // cleanup ui - ui_destroy_textbox(&textbox_path); - ui_destroy_textbox(&textbox_search_text); - ui_destroy_textbox(&textbox_file_filter); -#endif - ui_destroy(); - - // delete assets - assets_destroy_image(list_img); - assets_destroy_image(logo_small_img); - assets_destroy_image(delete_img); - assets_destroy_image(add_img); - - assets_destroy_font(font_small); - assets_destroy_font(font_mini); - - keyboard_input_destroy(&keyboard); - platform_destroy_window(&window); - - platform_destroy(); - - return 0; -} -#endif
\ No newline at end of file |
