begin prototype, transcript browser
This commit is contained in:
39
build_file.c
39
build_file.c
@@ -19,8 +19,7 @@
|
|||||||
#include "src/app/app.meta.c"
|
#include "src/app/app.meta.c"
|
||||||
#include "src/ui/ui.meta.c"
|
#include "src/ui/ui.meta.c"
|
||||||
#include "src/render/render.meta.c"
|
#include "src/render/render.meta.c"
|
||||||
#include "src/wasm_app/wasm_app.meta.c"
|
#include "src/prototype/prototype.meta.c"
|
||||||
#include "src/text_editor/text_editor.meta.c"
|
|
||||||
#include "src/testing/testing.meta.c"
|
#include "src/testing/testing.meta.c"
|
||||||
|
|
||||||
void build_testing_target(void) {
|
void build_testing_target(void) {
|
||||||
@@ -69,26 +68,12 @@ void build_win32_app_base_target(void) {
|
|||||||
if (ok != 0) exit(ok);
|
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) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
int ok = os_systemf(
|
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"
|
" -I ../src /DAPP_IS_DLL"
|
||||||
" /Zi /FC /nologo /Oi"
|
" /Zi /FC /nologo /Oi"
|
||||||
" /WX /W3 /wd4200 /diagnostics:column"
|
" /WX /W3 /wd4200 /diagnostics:column"
|
||||||
@@ -99,13 +84,13 @@ void build_prototype_dll_target(void) {
|
|||||||
|
|
||||||
void build_prototype_wasm_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 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) {
|
if (html_code_modified) {
|
||||||
os_copy("../src/app/app_wasm.html", "../package/index.html", os_copy_overwrite);
|
os_copy("../src/app/app_wasm.html", "../package/index.html", os_copy_overwrite);
|
||||||
}
|
}
|
||||||
if (wasm_code_modified) {
|
if (wasm_code_modified) {
|
||||||
int ok = os_systemf(
|
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"
|
" -Oz -g -I../src"
|
||||||
" -Wall -Wno-missing-braces -Wno-single-bit-bitfield-constant-conversion -Wno-unsequenced -Wno-initializer-overrides"
|
" -Wall -Wno-missing-braces -Wno-single-bit-bitfield-constant-conversion -Wno-unsequenced -Wno-initializer-overrides"
|
||||||
" -fdiagnostics-absolute-paths -fdiagnostics-format=msvc"
|
" -fdiagnostics-absolute-paths -fdiagnostics-format=msvc"
|
||||||
@@ -118,12 +103,12 @@ void build_prototype_wasm_target(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void build_prototype_standalone_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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ok = os_systemf(
|
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"
|
" -I ../src"
|
||||||
" /Zi /FC /nologo /Oi"
|
" /Zi /FC /nologo /Oi"
|
||||||
" /WX /W3 /wd4200 /diagnostics:column"
|
" /WX /W3 /wd4200 /diagnostics:column"
|
||||||
@@ -159,15 +144,13 @@ int main(int argc, char **argv) {
|
|||||||
generate_math_code(tcx->temp);
|
generate_math_code(tcx->temp);
|
||||||
generate_ui_code(tcx->temp);
|
generate_ui_code(tcx->temp);
|
||||||
generate_app_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_render_code(tcx->temp);
|
||||||
generate_testing_code(tcx->temp);
|
generate_testing_code(tcx->temp);
|
||||||
generate_text_editor_code(tcx->temp);
|
|
||||||
|
|
||||||
b32 run_win32_app_base_target = true;
|
b32 run_win32_app_base_target = true;
|
||||||
b32 run_testing_target = true;
|
b32 run_testing_target = true;
|
||||||
b32 run_text_editor_dll_target = true;
|
b32 run_prototype_dll_target = true;
|
||||||
b32 run_prototype_dll_target = false;
|
|
||||||
b32 run_prototype_wasm_target = false;
|
b32 run_prototype_wasm_target = false;
|
||||||
b32 run_prototype_standalone_target = false;
|
b32 run_prototype_standalone_target = false;
|
||||||
b32 run_server = false;
|
b32 run_server = false;
|
||||||
@@ -192,10 +175,6 @@ int main(int argc, char **argv) {
|
|||||||
build_win32_app_base_target();
|
build_win32_app_base_target();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (run_text_editor_dll_target) {
|
|
||||||
build_text_editor_dll_target();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (run_prototype_wasm_target) {
|
if (run_prototype_wasm_target) {
|
||||||
build_prototype_wasm_target();
|
build_prototype_wasm_target();
|
||||||
}
|
}
|
||||||
|
|||||||
5
init.project.lua
Normal file
5
init.project.lua
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
function CC(cmd)
|
||||||
|
Cmd { working_dir = GetProjectPath(), destination = "console", cmd = cmd }
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -463,7 +463,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n
|
|||||||
w32_library_t lib = {0};
|
w32_library_t lib = {0};
|
||||||
lib.dll_name = s8("app.dll");
|
lib.dll_name = s8("app.dll");
|
||||||
lib.update_fn_name = s8("app_update");
|
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
|
// Set VSync
|
||||||
if (wglSwapIntervalEXT) {
|
if (wglSwapIntervalEXT) {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ gb_thread thread_ctx_t global_thread_context = {
|
|||||||
.log_proc = default_log_proc,
|
.log_proc = default_log_proc,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
gb_thread thread_ctx_t *tcx;
|
||||||
|
|
||||||
fn void core_init(void) {
|
fn void core_init(void) {
|
||||||
tcx = &global_thread_context;
|
tcx = &global_thread_context;
|
||||||
|
|||||||
@@ -9,14 +9,12 @@ struct thread_ctx_t {
|
|||||||
// and which functions have state
|
// and which functions have state
|
||||||
ma_arena_t perm;
|
ma_arena_t perm;
|
||||||
|
|
||||||
void *data[32];
|
void *app_ctx;
|
||||||
logger_t log;
|
void *rn_ctx;
|
||||||
};
|
void *ui_ctx;
|
||||||
|
void *te_ctx;
|
||||||
|
|
||||||
enum {
|
logger_t log;
|
||||||
tcx_slot_rn,
|
|
||||||
tcx_slot_ui,
|
|
||||||
tcx_slot_app,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -36,5 +34,6 @@ fn alo_t malo(ma_arena_t *arena);
|
|||||||
fn alo_t malot(ma_temp_t temp);
|
fn alo_t malot(ma_temp_t temp);
|
||||||
fn void dealloc(alo_t alo, void *ptr);
|
fn void dealloc(alo_t alo, void *ptr);
|
||||||
fn void *alloc_size(alo_t alo, size_t size);
|
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;
|
||||||
|
|||||||
@@ -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, ...) {
|
OS_API int os_systemf(const char *string, ...) {
|
||||||
MA_Temp scratch = MA_GetScratch();
|
MA_Temp scratch = MA_GetScratch();
|
||||||
S8_FORMAT(scratch.arena, string, result);
|
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);
|
int error_code = system(result.str);
|
||||||
MA_ReleaseScratch(scratch);
|
MA_ReleaseScratch(scratch);
|
||||||
return error_code;
|
return error_code;
|
||||||
|
|||||||
@@ -9,12 +9,13 @@
|
|||||||
#include "render/render.c"
|
#include "render/render.c"
|
||||||
#include "ui/ui.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) {
|
fn_export b32 app_update(thread_ctx_t *thread_ctx, app_frame_t *frame) {
|
||||||
tcx = thread_ctx;
|
tcx = thread_ctx;
|
||||||
if (frame->first_event->kind == app_event_kind_init) {
|
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, 4, 200);
|
||||||
mt_tweak_f32(_font_size, 30, 30, 30);
|
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;
|
_font_size = font_size;
|
||||||
rn_reload_font(font_size, frame->dpr);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -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 f32 _font_size = 30;
|
gb f32 _font_size = 30;
|
||||||
gb_read_only mt_tweak_t tweak_table[] = {
|
gb_read_only mt_tweak_t tweak_table[] = {
|
||||||
@@ -12,4 +12,5 @@ void run_all_tests(void) {
|
|||||||
test_intern_table();
|
test_intern_table();
|
||||||
test_array();
|
test_array();
|
||||||
ui_test_text_replace();
|
ui_test_text_replace();
|
||||||
|
buffer16_test();
|
||||||
}// run_all_tests()
|
}// run_all_tests()
|
||||||
@@ -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_t *include_paths = sb8(arena);
|
||||||
sb8_append(include_paths, OS_GetAbsolutePath(&Perm, s8("../src")));
|
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;
|
typedef struct cg_tweak_t cg_tweak_t;
|
||||||
struct cg_tweak_t {
|
struct cg_tweak_t {
|
||||||
94
src/prototype/transcript_browser.c
Normal file
94
src/prototype/transcript_browser.c
Normal file
@@ -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();
|
||||||
|
}
|
||||||
@@ -56,14 +56,14 @@ fn void rn_reload_font(f32 font_size, f32 dpr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn void rn_reload(void) {
|
fn void rn_reload(void) {
|
||||||
if (!gladLoadGLLoader((GLADloadproc)tcx->data[tcx_slot_app])) {
|
if (!gladLoadGLLoader((GLADloadproc)tcx->app_ctx)) {
|
||||||
fatalf("couldn't load opengl!");
|
fatalf("couldn't load opengl!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn void rn_init(ma_arena_t *perm, f32 font_size, f32 dpr) {
|
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);
|
tcx->rn_ctx = ma_push_type(perm, rn_state_t);
|
||||||
rn = tcx->data[tcx_slot_rn];
|
rn = tcx->rn_ctx;
|
||||||
|
|
||||||
rn_reload();
|
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) {
|
void rn_begin_frame(app_frame_t *frame) {
|
||||||
rn = tcx->data[tcx_slot_rn];
|
rn = tcx->rn_ctx;
|
||||||
rn->frame = frame;
|
rn->frame = frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
gb i64 buffer_raw_ids;
|
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
|
// caret helpers
|
||||||
@@ -62,6 +62,20 @@ struct buffer16_t {
|
|||||||
alo_t alo;
|
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 dont_kill_selection = false;
|
||||||
const b32 kill_selection = true;
|
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
|
// buffer multicursor + history
|
||||||
fn void buffer16_init(alo_t alo, buffer16_t *buffer, s8_t name, i64 size);
|
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_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 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_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_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_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_redo_edit(buffer16_t *buffer, array_caret_t *carets);
|
||||||
fn void buffer16_undo_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);
|
|
||||||
17
src/ui/ui.c
17
src/ui/ui.c
@@ -1,4 +1,5 @@
|
|||||||
#include "ui.gen.c"
|
#include "ui.gen.c"
|
||||||
|
#include "buffer16.c"
|
||||||
|
|
||||||
fn ui_caret_t ui_caret_clamp(ui_caret_t c, i32 min, i32 max) {
|
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};
|
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")));
|
assert(s8_are_equal(ti.string, s8("qaer")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ui_text_input(...) ui__text_input(UILOC, __VA_ARGS__)
|
#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, b32 sim_even_if_no_focus) {
|
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 = { .draw_border = true, .draw_rect = true, .draw_text = true, .keyboard_nav = true });
|
ui_box_t *box = ui_box(.loc = loc, .string = s8("text_input"), .flags = flags);
|
||||||
|
|
||||||
box->text_input = ti;
|
box->text_input = ti;
|
||||||
box->custom_draw = ui_text_input_draw;
|
box->custom_draw = ui_text_input_draw;
|
||||||
ui_signal_t signal = ui_signal_from_box(box);
|
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) {
|
if (sim) {
|
||||||
app_event_t *ev = ui->event;
|
app_event_t *ev = ui->event;
|
||||||
i32 sel_size = r1i32_size(ti->caret.range);
|
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) {
|
fn void ui_begin_frame(app_frame_t *frame) {
|
||||||
ui = tcx->data[tcx_slot_ui];
|
ui = tcx->ui_ctx;
|
||||||
ui->frame = frame;
|
ui->frame = frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1234,8 +1235,8 @@ fn void ui_reload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn void ui_init(ma_arena_t *arena) {
|
fn void ui_init(ma_arena_t *arena) {
|
||||||
tcx->data[tcx_slot_ui] = ma_push_type(arena, ui_t);
|
tcx->ui_ctx = ma_push_type(arena, ui_t);
|
||||||
ui = tcx->data[tcx_slot_ui];
|
ui = tcx->ui_ctx;
|
||||||
ui->box_arena = ma_push_arena(arena, mib(1));
|
ui->box_arena = ma_push_arena(arena, mib(1));
|
||||||
ui_reload();
|
ui_reload();
|
||||||
}
|
}
|
||||||
@@ -1288,7 +1289,7 @@ fn void ui_demo_everything_lister(void) {
|
|||||||
locl ui_text_input_t text_input;
|
locl ui_text_input_t text_input;
|
||||||
text_input.str = buff;
|
text_input.str = buff;
|
||||||
text_input.cap = lengthof(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;
|
if (lister_just_opened) text_input.len = 0;
|
||||||
|
|
||||||
ma_temp_t scratch = ma_begin_scratch();
|
ma_temp_t scratch = ma_begin_scratch();
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#include "buffer16.h"
|
||||||
|
|
||||||
typedef struct ui_code_loc_t ui_code_loc_t;
|
typedef struct ui_code_loc_t ui_code_loc_t;
|
||||||
struct ui_code_loc_t {
|
struct ui_code_loc_t {
|
||||||
char *file;
|
char *file;
|
||||||
@@ -22,6 +24,8 @@ struct ui_box_flags_t {
|
|||||||
b8 children_sum_x: 1;
|
b8 children_sum_x: 1;
|
||||||
b8 children_sum_y: 1;
|
b8 children_sum_y: 1;
|
||||||
b8 keyboard_nav: 1;
|
b8 keyboard_nav: 1;
|
||||||
|
|
||||||
|
b8 sim_even_if_no_focus: 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -101,6 +105,7 @@ struct ui_box_t {
|
|||||||
b32 expanded;
|
b32 expanded;
|
||||||
|
|
||||||
ui_text_input_t *text_input;
|
ui_text_input_t *text_input;
|
||||||
|
view_id_t view;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ui_signal_t ui_signal_t;
|
typedef struct ui_signal_t ui_signal_t;
|
||||||
|
|||||||
Reference in New Issue
Block a user