diff --git a/build_file.c b/build_file.c index 55c9799..32afd59 100644 --- a/build_file.c +++ b/build_file.c @@ -19,8 +19,7 @@ #include "src/app/app.meta.c" #include "src/ui/ui.meta.c" #include "src/render/render.meta.c" -#include "src/wasm_app/wasm_app.meta.c" -#include "src/text_editor/text_editor.meta.c" +#include "src/prototype/prototype.meta.c" #include "src/testing/testing.meta.c" void build_testing_target(void) { @@ -69,26 +68,12 @@ void build_win32_app_base_target(void) { if (ok != 0) exit(ok); } -void build_text_editor_dll_target(void) { - if (!cache_code_modified(s8("../src/text_editor/text_editor_main.c"), s8("app.dll"))) { - return; - } - int ok = os_systemf( - "cl ../src/text_editor/text_editor_main.c -Fe:app.dll -Fd:app.pdb" - " -I ../src /DAPP_IS_DLL" - " /Zi /FC /nologo /Oi" - " /WX /W3 /wd4200 /diagnostics:column" - " /link /incremental:no /DEBUG:FULL /DLL" - ); - if (ok != 0) exit(ok); -} - void build_prototype_dll_target(void) { - if (!cache_code_modified(s8("../src/wasm_app/main.c"), s8("app.dll"))) { + if (!cache_code_modified(s8("../src/prototype/main.c"), s8("app.dll"))) { return; } int ok = os_systemf( - "cl ../src/wasm_app/main.c -Fe:app.dll -Fd:app.pdb" + "cl ../src/prototype/main.c -Fe:app.dll -Fd:app.pdb" " -I ../src /DAPP_IS_DLL" " /Zi /FC /nologo /Oi" " /WX /W3 /wd4200 /diagnostics:column" @@ -99,13 +84,13 @@ void build_prototype_dll_target(void) { void build_prototype_wasm_target(void) { b32 html_code_modified = cache_code_modified(s8("../src/app/app_wasm.html"), s8("../package/index.html")); - b32 wasm_code_modified = cache_code_modified(s8("../src/wasm_app/main.c"), s8("main.wasm")); + b32 wasm_code_modified = cache_code_modified(s8("../src/prototype/main.c"), s8("main.wasm")); if (html_code_modified) { os_copy("../src/app/app_wasm.html", "../package/index.html", os_copy_overwrite); } if (wasm_code_modified) { int ok = os_systemf( - "clang ../src/wasm_app/main.c -o main.wasm" + "clang ../src/prototype/main.c -o main.wasm" " -Oz -g -I../src" " -Wall -Wno-missing-braces -Wno-single-bit-bitfield-constant-conversion -Wno-unsequenced -Wno-initializer-overrides" " -fdiagnostics-absolute-paths -fdiagnostics-format=msvc" @@ -118,12 +103,12 @@ void build_prototype_wasm_target(void) { } void build_prototype_standalone_target(void) { - if (!cache_code_modified(s8("../src/wasm_app/main.c"), s8("standalone_app.exe"))) { + if (!cache_code_modified(s8("../src/prototype/main.c"), s8("standalone_app.exe"))) { return; } int ok = os_systemf( - "cl ../src/wasm_app/main.c -Fe:standalone_app.exe -Fd:standalone_app.pdb" + "cl ../src/prototype/main.c -Fe:standalone_app.exe -Fd:standalone_app.pdb" " -I ../src" " /Zi /FC /nologo /Oi" " /WX /W3 /wd4200 /diagnostics:column" @@ -159,15 +144,13 @@ int main(int argc, char **argv) { generate_math_code(tcx->temp); generate_ui_code(tcx->temp); generate_app_code(tcx->temp); - generate_wasm_app_code(tcx->temp); + generate_prototype_code(tcx->temp); generate_render_code(tcx->temp); generate_testing_code(tcx->temp); - generate_text_editor_code(tcx->temp); b32 run_win32_app_base_target = true; b32 run_testing_target = true; - b32 run_text_editor_dll_target = true; - b32 run_prototype_dll_target = false; + b32 run_prototype_dll_target = true; b32 run_prototype_wasm_target = false; b32 run_prototype_standalone_target = false; b32 run_server = false; @@ -192,10 +175,6 @@ int main(int argc, char **argv) { build_win32_app_base_target(); } - if (run_text_editor_dll_target) { - build_text_editor_dll_target(); - } - if (run_prototype_wasm_target) { build_prototype_wasm_target(); } diff --git a/init.project.lua b/init.project.lua new file mode 100644 index 0000000..859ffa6 --- /dev/null +++ b/init.project.lua @@ -0,0 +1,5 @@ +function CC(cmd) + Cmd { working_dir = GetProjectPath(), destination = "console", cmd = cmd } +end + + diff --git a/src/app/app_win32.c b/src/app/app_win32.c index 4c75033..1323577 100644 --- a/src/app/app_win32.c +++ b/src/app/app_win32.c @@ -463,7 +463,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n w32_library_t lib = {0}; lib.dll_name = s8("app.dll"); lib.update_fn_name = s8("app_update"); - tcx->data[tcx_slot_app] = w32_load_opengl_fn; + tcx->app_ctx = w32_load_opengl_fn; // Set VSync if (wglSwapIntervalEXT) { diff --git a/src/core/core_ctx.c b/src/core/core_ctx.c index 16f0813..0343140 100644 --- a/src/core/core_ctx.c +++ b/src/core/core_ctx.c @@ -7,6 +7,7 @@ gb_thread thread_ctx_t global_thread_context = { .log_proc = default_log_proc, } }; +gb_thread thread_ctx_t *tcx; fn void core_init(void) { tcx = &global_thread_context; diff --git a/src/core/core_ctx.h b/src/core/core_ctx.h index 25ac551..1b45429 100644 --- a/src/core/core_ctx.h +++ b/src/core/core_ctx.h @@ -9,14 +9,12 @@ struct thread_ctx_t { // and which functions have state ma_arena_t perm; - void *data[32]; - logger_t log; -}; + void *app_ctx; + void *rn_ctx; + void *ui_ctx; + void *te_ctx; -enum { - tcx_slot_rn, - tcx_slot_ui, - tcx_slot_app, + logger_t log; }; typedef enum { @@ -36,5 +34,6 @@ fn alo_t malo(ma_arena_t *arena); fn alo_t malot(ma_temp_t temp); fn void dealloc(alo_t alo, void *ptr); fn void *alloc_size(alo_t alo, size_t size); +fn int tcx_alloc_id(void); -gb_thread thread_ctx_t *tcx; +extern gb_thread thread_ctx_t *tcx; diff --git a/src/meta/build_tool.c b/src/meta/build_tool.c index 1661b15..72589c7 100644 --- a/src/meta/build_tool.c +++ b/src/meta/build_tool.c @@ -2884,7 +2884,7 @@ OS_API OS_Result os_write_file(S8_String path, S8_String string) { OS_API int os_systemf(const char *string, ...) { MA_Temp scratch = MA_GetScratch(); S8_FORMAT(scratch.arena, string, result); - IO_Printf("%.*s\n", S8_Expand(result)); + // IO_Printf("%.*s\n", S8_Expand(result)); int error_code = system(result.str); MA_ReleaseScratch(scratch); return error_code; diff --git a/src/wasm_app/main.c b/src/prototype/main.c similarity index 80% rename from src/wasm_app/main.c rename to src/prototype/main.c index 90b7559..aa0ebcf 100644 --- a/src/wasm_app/main.c +++ b/src/prototype/main.c @@ -9,12 +9,13 @@ #include "render/render.c" #include "ui/ui.c" -#include "wasm_app.gen.c" +#include "transcript_browser.c" +#include "prototype.gen.c" fn_export b32 app_update(thread_ctx_t *thread_ctx, app_frame_t *frame) { tcx = thread_ctx; if (frame->first_event->kind == app_event_kind_init) { - run_all_tests(); + // run_all_tests(); mt_tweak_f32(font_size, 30, 4, 200); mt_tweak_f32(_font_size, 30, 30, 30); @@ -36,6 +37,7 @@ fn_export b32 app_update(thread_ctx_t *thread_ctx, app_frame_t *frame) { _font_size = font_size; rn_reload_font(font_size, frame->dpr); } - ui_demo_update(frame, tweak_table, lengthof(tweak_table)); + // ui_demo_update(frame, tweak_table, lengthof(tweak_table)); + transcript_browser_update(frame, tweak_table, lengthof(tweak_table)); return true; } diff --git a/src/wasm_app/wasm_app.gen.c b/src/prototype/prototype.gen.c similarity index 79% rename from src/wasm_app/wasm_app.gen.c rename to src/prototype/prototype.gen.c index 37bc685..4e9c88d 100644 --- a/src/wasm_app/wasm_app.gen.c +++ b/src/prototype/prototype.gen.c @@ -1,4 +1,4 @@ -// automatically generated using: C:\dev\wasm\src/wasm_app/wasm_app.meta.c +// automatically generated using: C:\dev\wasm\src/prototype/prototype.meta.c gb f32 font_size = 30; gb f32 _font_size = 30; gb_read_only mt_tweak_t tweak_table[] = { @@ -12,4 +12,5 @@ void run_all_tests(void) { test_intern_table(); test_array(); ui_test_text_replace(); + buffer16_test(); }// run_all_tests() diff --git a/src/wasm_app/wasm_app.meta.c b/src/prototype/prototype.meta.c similarity index 97% rename from src/wasm_app/wasm_app.meta.c rename to src/prototype/prototype.meta.c index fbbf11e..c60f034 100644 --- a/src/wasm_app/wasm_app.meta.c +++ b/src/prototype/prototype.meta.c @@ -1,7 +1,7 @@ -void generate_wasm_app_code(ma_arena_t *arena) { +void generate_prototype_code(ma_arena_t *arena) { sb8_t *include_paths = sb8(arena); sb8_append(include_paths, OS_GetAbsolutePath(&Perm, s8("../src"))); - mt_files_t files = mt_lex_files(arena, s8("../src/wasm_app/main.c"), include_paths); + mt_files_t files = mt_lex_files(arena, s8("../src/prototype/main.c"), include_paths); typedef struct cg_tweak_t cg_tweak_t; struct cg_tweak_t { diff --git a/src/prototype/transcript_browser.c b/src/prototype/transcript_browser.c new file mode 100644 index 0000000..a7319e7 --- /dev/null +++ b/src/prototype/transcript_browser.c @@ -0,0 +1,94 @@ +fn void transcript_browser_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_count) { + ui_begin_frame(frame); + rn_begin_frame(frame); + + + s8_t cmds[] = { + s8("show data tab"), + s8("show log tab"), + s8("show menus tab"), + s8("show menus tab2"), + s8("show menus tab3"), + s8("show menus tab4"), + s8("show menus tab5"), + s8("show menus tab6"), + s8("show menus tab8"), + s8("show menus tab7"), + s8("show menus tab9"), + s8("show menus tab0"), + s8("show menus tab11"), + s8("show menus tab22"), + s8("show menus tab33"), + s8("show menus tab44"), + s8("show menus tab55"), + s8("show menus tab66"), + }; + + for (app_event_t *ev = frame->first_event; ev; ev = ev->next) { + ui_begin_build(UILOC, ev, window_rect_from_frame(frame)); + + locl b8 set_focus; + locl char buff[128]; + locl ui_text_input_t text_input; + ui_signal_t text_input_sig; + text_input.str = buff; + text_input.cap = lengthof(buff); + + ui_box_t *top_box = ui_box(.null_id = true, .rect = r2f32_cut_top(ui_top_rectp(), ui_em(1.0f)), .flags = {.draw_rect = true, .clip_rect = true}); + ui_set_text_align(ui_text_align_left) + ui_set_lop(ui_lop_cut_top) + ui_set_top(top_box) { + text_input_sig = ui_text_input(&text_input, .sim_even_if_no_focus = true, .keyboard_nav = false); + } + + ma_temp_t scratch = ma_begin_scratch(); + s8_t needle = s8_make(text_input.str, text_input.len); + fuzzy_pair_t *pairs = s8_fuzzy_rate_array(scratch.arena, needle, cmds, lengthof(cmds)); + if (text_input_sig.text_changed) { + set_focus = true; + } + + ui_box_t *lister = ui_box(.null_id = true, .rect = r2f32_cut_top(ui_top_rectp(), ui_max), .flags = {.draw_rect = true, .clip_rect = true}); + locl f32 verti_scroller_value; + ui_scroller_t scroller = ui_begin_scroller(UILOC, (ui_scroller_params_t){ + .parent = lister, + .verti = { + .enabled = true, + .value = &verti_scroller_value, + .item_pixels = ui_em(1), + .item_count = (i32)lengthof(cmds), + }, + }); + + ui_set_top(lister) + ui_set_string_pos_offset(ui_dm(1)) { + ui_cut_top_scroller_offset(scroller); + for (i32 i = scroller.verti.istart; i < scroller.verti.iend; i += 1) { + s8_t text = cmds[pairs[i].index]; + ui_box_t *box = ui_box(.string = text, .flags = { .draw_rect = true, .draw_text = true, .keyboard_nav = true }); + ui_signal_from_box(box); + + if (set_focus) { + ui->focus = box->id; + set_focus = false; + } + } + } + + if (text_input_sig.text_commit) { + fuzzy_pair_t *pair = &pairs[0]; + // ui_g_panel = (i32)pair->index + 1; + ui_text_clear(&text_input); + set_focus = true; + } + + ui_end_scroller(scroller); + ui_end_build(); + ma_end_scratch(scratch); + } + + rn_begin(white_color); + ui_draw(); + rn_end(); + ui_end_frame(); +} \ No newline at end of file diff --git a/src/render/render_opengl.c b/src/render/render_opengl.c index a19e923..16e786f 100644 --- a/src/render/render_opengl.c +++ b/src/render/render_opengl.c @@ -56,14 +56,14 @@ fn void rn_reload_font(f32 font_size, f32 dpr) { } fn void rn_reload(void) { - if (!gladLoadGLLoader((GLADloadproc)tcx->data[tcx_slot_app])) { + if (!gladLoadGLLoader((GLADloadproc)tcx->app_ctx)) { fatalf("couldn't load opengl!"); } } fn void rn_init(ma_arena_t *perm, f32 font_size, f32 dpr) { - tcx->data[tcx_slot_rn] = ma_push_type(perm, rn_state_t); - rn = tcx->data[tcx_slot_rn]; + tcx->rn_ctx = ma_push_type(perm, rn_state_t); + rn = tcx->rn_ctx; rn_reload(); @@ -140,7 +140,7 @@ fn void rn_init(ma_arena_t *perm, f32 font_size, f32 dpr) { } void rn_begin_frame(app_frame_t *frame) { - rn = tcx->data[tcx_slot_rn]; + rn = tcx->rn_ctx; rn->frame = frame; } diff --git a/src/testing/testing_main.c b/src/testing/testing_main.c index 81f53c0..3e16d73 100644 --- a/src/testing/testing_main.c +++ b/src/testing/testing_main.c @@ -145,4 +145,4 @@ int main() { test_s8(); os_test(); return 0; -} \ No newline at end of file +} diff --git a/src/text_editor/text_editor.gen.c b/src/text_editor/text_editor.gen.c deleted file mode 100644 index 9fddced..0000000 --- a/src/text_editor/text_editor.gen.c +++ /dev/null @@ -1,15 +0,0 @@ -// automatically generated using: C:\dev\wasm\src/text_editor/text_editor.meta.c -gb f32 font_size = 30; -gb f32 _font_size = 30; -gb_read_only mt_tweak_t tweak_table[] = { - {type(f32), s8_const("font_size"), &font_size, 4, 200}, - {type(f32), s8_const("_font_size"), &_font_size, 30, 30}, - -}; -void run_all_tests(void) { - test_string16(); - test_hash_table(); - test_intern_table(); - test_array(); - buffer16_test(); -}// run_all_tests() diff --git a/src/text_editor/text_editor.meta.c b/src/text_editor/text_editor.meta.c deleted file mode 100644 index bf1420c..0000000 --- a/src/text_editor/text_editor.meta.c +++ /dev/null @@ -1,122 +0,0 @@ -void generate_text_editor_code(ma_arena_t *arena) { - sb8_t *include_paths = sb8(arena); - sb8_append(include_paths, OS_GetAbsolutePath(&Perm, s8("../src"))); - mt_files_t files = mt_lex_files(arena, s8("../src/text_editor/text_editor_main.c"), include_paths); - - typedef struct cg_tweak_t cg_tweak_t; - struct cg_tweak_t { - cg_tweak_t *next; - type_t *type; - s8_t name; - s8_t value; - s8_t min, max; - }; - - cg_tweak_t *first_tweak = NULL; - cg_tweak_t *last_tweak = NULL; - - sb8_t *tests = sb8_serial_begin(arena); - - sb8_t *sb_embeds = sb8_serial_begin(arena); - sb8_printf(sb_embeds, "// automatically generated using: " __FILE__ "\n"); - for (mt_file_t *it = files.first; it; it = it->next) { - parser_t *par = parser_make(arena, it->tokens.data); - for (;par->at->kind != lex_kind_eof;) { - b32 matched = false; - - if (par->at->inside_macro == false && parser_matchi(par, s8("fn_test"))) { - parser_expecti(par, s8("void")); - lex_t *ident = parser_match(par, lex_kind_ident); - sb8_append(tests, ident->string); - matched = true; - } - - if (par->at->inside_macro == false && parser_matchi(par, s8("mt_embed_file"))) { - parser_expect(par, lex_kind_open_paren); - lex_t *var_name = parser_expect(par, lex_kind_ident); - parser_expect(par, lex_kind_comma); - lex_t *path = parser_expect(par, lex_kind_string); - parser_expect(par, lex_kind_close_paren); - s8_t relpath = s8_printf(arena, "../%S", path->string); - s8_t content = OS_ReadFile(&Perm, relpath); - - sb8_printf(sb_embeds, "gb_read_only "); - mt_serial_to_cbyte_array_ex(sb_embeds, content, s8_printf(arena, "%S_data", var_name->string)); - sb8_printf(sb_embeds, "gb_read_only s8_t %S = s8_array_lit(%S_data);\n", var_name->string, var_name->string); - matched = true; - } - - if (par->at->inside_macro == false && parser_matchi(par, s8("mt_tweak_b32"))) { - cg_tweak_t *tweak = ma_push_type(arena, cg_tweak_t); - tweak->type = type(b32); - tweak->min = tweak->max = s8("0"); - parser_expect(par, lex_kind_open_paren); - tweak->name = parser_expect(par, lex_kind_ident)->string; - parser_expect(par, lex_kind_comma); - tweak->value = parser_next(par)->string; - parser_expect(par, lex_kind_close_paren); - SLLQ_APPEND(first_tweak, last_tweak, tweak); - matched = true; - } - - if (par->at->inside_macro == false && parser_matchi(par, s8("mt_tweak_f32"))) { - cg_tweak_t *tweak = ma_push_type(arena, cg_tweak_t); - tweak->type = type(f32); - parser_expect(par, lex_kind_open_paren); - tweak->name = parser_expect(par, lex_kind_ident)->string; - parser_expect(par, lex_kind_comma); - tweak->value = parser_next(par)->string; - parser_expect(par, lex_kind_comma); - tweak->min = parser_next(par)->string; - parser_expect(par, lex_kind_comma); - tweak->max = parser_next(par)->string; - parser_expect(par, lex_kind_close_paren); - SLLQ_APPEND(first_tweak, last_tweak, tweak); - matched = true; - } - - if (par->at->inside_macro == false && parser_matchi(par, s8("mt_tweak_color"))) { - cg_tweak_t *tweak = ma_push_type(arena, cg_tweak_t); - tweak->type = type(v4f32_t); - tweak->min = s8("0.0f"); - tweak->max = s8("1.0f"); - parser_expect(par, lex_kind_open_paren); - tweak->name = parser_expect(par, lex_kind_ident)->string; - parser_expect(par, lex_kind_comma); - tweak->value = parser_next(par)->string; - while (par->at->kind != lex_kind_close_paren && par->at->kind != lex_kind_eof) parser_next(par); - lex_t *end = parser_expect(par, lex_kind_close_paren); - tweak->value.len = (i64)(end->str - tweak->value.str); - SLLQ_APPEND(first_tweak, last_tweak, tweak); - matched = true; - } - - if (!matched) { - parser_next(par); - } - } - } - - - - if (first_tweak != NULL) { - for (cg_tweak_t *it = first_tweak; it; it = it->next) { - sb8_printf(sb_embeds, "gb %S %S = %S;\n", it->type->name, it->name, it->value); - } - sb8_printf(sb_embeds, "gb_read_only mt_tweak_t tweak_table[] = {\n"); - for (cg_tweak_t *it = first_tweak; it; it = it->next) { - sb8_printf(sb_embeds, " {type(%S), s8_const(\"%S\"), &%S, %S, %S},\n", it->type->name, it->name, it->name, it->min, it->max); - } - sb8_printf(sb_embeds, "\n};\n"); - } - - sb8_printf(sb_embeds, "void run_all_tests(void) {\n"); - for (sb8_node_t *it = tests->first; it; it = it->next) { - sb8_printf(sb_embeds, " %S();\n", it->string); - } - sb8_printf(sb_embeds, "}// run_all_tests()\n"); - - - s8_t embeds = sb8_serial_end(arena, sb_embeds); - os_write_file(mt_cpath(arena), embeds); -} \ No newline at end of file diff --git a/src/text_editor/text_editor_main.c b/src/text_editor/text_editor_main.c deleted file mode 100644 index 6ade677..0000000 --- a/src/text_editor/text_editor_main.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "core/core.h" -#include "os/os.h" -#include "app/app.h" -#include "profiler/profiler.h" -#include "buffer16.h" -// #include "ui/ui.h" - - -#include "core/core.c" -#include "os/os.c" -#include "app/app.c" -#include "profiler/profiler.c" -#include "render/render.c" -#include "buffer16.c" -// #include "ui/ui.c" - -#include "text_editor.gen.c" - -/*todo: - * OK Create a complete string16 library - * OK (Win32) Win32 SDL_GetPrefPath, create configuration directory, get path - * Array - * - * - * - * Win32 upload icon -**/ - -fn_export b32 app_update(thread_ctx_t *thread_ctx, app_frame_t *frame) { - tcx = thread_ctx; - if (frame->first_event->kind == app_event_kind_init) { - run_all_tests(); - - mt_tweak_f32(font_size, 30, 4, 200); - mt_tweak_f32(_font_size, 30, 30, 30); - - rn_init(&tcx->perm, font_size, frame->dpr); - return true; - } else if (frame->first_event->kind == app_event_kind_reload) { - rn_reload(); - - return true; - } else if (frame->first_event->kind == app_event_kind_unload) { - return true; - } - - if (!f32_are_equal(font_size, _font_size)) { - _font_size = font_size; - rn_reload_font(font_size, frame->dpr); - } - - rn_begin_frame(frame); - rn_begin(white_color); - rn_end(); - - - return true; -} diff --git a/src/text_editor/buffer16.c b/src/ui/buffer16.c similarity index 99% rename from src/text_editor/buffer16.c rename to src/ui/buffer16.c index 9adc33d..7a7cfed 100644 --- a/src/text_editor/buffer16.c +++ b/src/ui/buffer16.c @@ -2,6 +2,9 @@ gb i64 buffer_raw_ids; +fn void buffer16_dealloc_history_entries(buffer16_t *buffer, array_history16_t *entries); +fn void buffer16_dealloc_history_array(buffer16_t *buffer, array_history16_t *entries); +fn void buffer16_multi_cursor_apply_edits(buffer16_t *buffer, array_edit16_t edits); /////////////////////////////// // caret helpers diff --git a/src/text_editor/buffer16.h b/src/ui/buffer16.h similarity index 89% rename from src/text_editor/buffer16.h rename to src/ui/buffer16.h index bb58012..117eab1 100644 --- a/src/text_editor/buffer16.h +++ b/src/ui/buffer16.h @@ -62,6 +62,20 @@ struct buffer16_t { alo_t alo; }; + +typedef struct view_id_t view_id_t; +struct view_id_t { i64 e; }; +typedef struct view_t view_t; +struct view_t { + view_id_t id; + buffer16_id_t active_buffer; + v2i32_t scroll; + array_caret_t carets; + + caret_t main_caret_on_begin_frame; + b32 update_scroll; +}; + const b32 dont_kill_selection = false; const b32 kill_selection = true; @@ -111,19 +125,12 @@ fn void buffer16_raw_replace_text(buffer16_t *buffer, r1i64_t range, s // buffer multicursor + history fn void buffer16_init(alo_t alo, buffer16_t *buffer, s8_t name, i64 size); fn void buffer16_deinit(buffer16_t *buffer); -fn void buffer16_add_edit(array_edit16_t *edits, r1i64_t range, s16_t string); fn array_edit16_t buffer16_begin_edit(alo_t alo, buffer16_t *buffer, array_caret_t *carets); +fn void buffer16_add_edit(array_edit16_t *edits, r1i64_t range, s16_t string); fn void buffer16_end_edit(buffer16_t *buffer, array_edit16_t *edits, array_caret_t *carets, b32 kill_selection); fn void buffer16_merge_carets(buffer16_t *buffer, array_caret_t *carets); fn void buffer16_adjust_carets(array_edit16_t *edits, array_caret_t *carets); +fn void buffer16_pre_begin_edit_save_caret_history(buffer16_t *buffer, array_caret_t *carets); fn void buffer16_redo_edit(buffer16_t *buffer, array_caret_t *carets); fn void buffer16_undo_edit(buffer16_t *buffer, array_caret_t *carets); - -fn void buffer16_save_history_before_merge_cursor(buffer16_t *buffer, array_history16_t *stack, array_caret_t *carets); -fn void buffer16_save_history_before_apply_edits(buffer16_t *buffer, array_history16_t *stack, array_edit16_t *edits); -fn void buffer16_pre_begin_edit_save_caret_history(buffer16_t *buffer, array_caret_t *carets); - -fn void buffer16_dealloc_history_entries(buffer16_t *buffer, array_history16_t *entries); -fn void buffer16_dealloc_history_array(buffer16_t *buffer, array_history16_t *entries); -fn void buffer16_multi_cursor_apply_edits(buffer16_t *buffer, array_edit16_t edits); diff --git a/src/ui/ui.c b/src/ui/ui.c index 2af5ff8..9815a8f 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -1,4 +1,5 @@ #include "ui.gen.c" +#include "buffer16.c" fn ui_caret_t ui_caret_clamp(ui_caret_t c, i32 min, i32 max) { return (ui_caret_t){CLAMP(c.e[0],min,max), CLAMP(c.e[1],min,max), c.ifront}; @@ -517,15 +518,15 @@ fn_test void ui_test_text_replace(void) { assert(s8_are_equal(ti.string, s8("qaer"))); } -#define ui_text_input(...) ui__text_input(UILOC, __VA_ARGS__) -fn ui_signal_t ui__text_input(ui_code_loc_t loc, ui_text_input_t *ti, b32 sim_even_if_no_focus) { - ui_box_t *box = ui_box(.loc = loc, .string = s8("text_input"), .flags = { .draw_border = true, .draw_rect = true, .draw_text = true, .keyboard_nav = true }); +#define ui_text_input(ti, ...) ui__text_input(UILOC, ti, (ui_box_flags_t){ .draw_border = true, .draw_rect = true, .draw_text = true, .keyboard_nav = true, __VA_ARGS__ }) +fn ui_signal_t ui__text_input(ui_code_loc_t loc, ui_text_input_t *ti, ui_box_flags_t flags) { + ui_box_t *box = ui_box(.loc = loc, .string = s8("text_input"), .flags = flags); box->text_input = ti; box->custom_draw = ui_text_input_draw; ui_signal_t signal = ui_signal_from_box(box); - b32 sim = sim_even_if_no_focus || ui_is_focused_box(box); + b32 sim = flags.sim_even_if_no_focus || ui_is_focused_box(box); if (sim) { app_event_t *ev = ui->event; i32 sel_size = r1i32_size(ti->caret.range); @@ -1198,7 +1199,7 @@ fn void ui_draw(void) { } fn void ui_begin_frame(app_frame_t *frame) { - ui = tcx->data[tcx_slot_ui]; + ui = tcx->ui_ctx; ui->frame = frame; } @@ -1234,8 +1235,8 @@ fn void ui_reload(void) { } fn void ui_init(ma_arena_t *arena) { - tcx->data[tcx_slot_ui] = ma_push_type(arena, ui_t); - ui = tcx->data[tcx_slot_ui]; + tcx->ui_ctx = ma_push_type(arena, ui_t); + ui = tcx->ui_ctx; ui->box_arena = ma_push_arena(arena, mib(1)); ui_reload(); } @@ -1288,7 +1289,7 @@ fn void ui_demo_everything_lister(void) { locl ui_text_input_t text_input; text_input.str = buff; text_input.cap = lengthof(buff); - ui_signal_t ti_sig = ui_text_input(&text_input, true); + ui_signal_t ti_sig = ui_text_input(&text_input, .sim_even_if_no_focus = true); if (lister_just_opened) text_input.len = 0; ma_temp_t scratch = ma_begin_scratch(); diff --git a/src/ui/ui.h b/src/ui/ui.h index af29593..9597558 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -1,3 +1,5 @@ +#include "buffer16.h" + typedef struct ui_code_loc_t ui_code_loc_t; struct ui_code_loc_t { char *file; @@ -22,6 +24,8 @@ struct ui_box_flags_t { b8 children_sum_x: 1; b8 children_sum_y: 1; b8 keyboard_nav: 1; + + b8 sim_even_if_no_focus: 1; }; typedef enum { @@ -101,6 +105,7 @@ struct ui_box_t { b32 expanded; ui_text_input_t *text_input; + view_id_t view; }; typedef struct ui_signal_t ui_signal_t;