From 16125f5605266e9fe017ee83310ee9d4c922ffb4 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sat, 11 Jan 2025 20:52:44 +0100 Subject: [PATCH] ui --- src/core/core.h | 8 +++---- src/core/core_ctx.h | 2 +- src/wasm_app/ui.c | 55 ++++++++++++++++++++++++++------------------- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/core/core.h b/src/core/core.h index 8d371d8..a3816e1 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -110,13 +110,13 @@ typedef double f64; #define debug_break() (debug__break(), 0) #if PLATFORM_WASM - #define THREAD_LOCAL + #define gb_thread #elif PLATFORM_GCC | PLATFORM_CLANG - #define THREAD_LOCAL __thread + #define gb_thread __thread #elif PLATFORM_CL - #define THREAD_LOCAL __declspec(thread) + #define gb_thread __declspec(thread) #else - #define THREAD_LOCAL _Thread_local + #define gb_thread _Thread_local #endif #if PLATFORM_CL diff --git a/src/core/core_ctx.h b/src/core/core_ctx.h index 9a08c24..92e2d60 100644 --- a/src/core/core_ctx.h +++ b/src/core/core_ctx.h @@ -13,7 +13,7 @@ struct thread_ctx_t { logger_t log; }; -THREAD_LOCAL thread_ctx_t tcx = { +gb_thread thread_ctx_t tcx = { .log = { .break_on_fatal = true, .log_proc = default_log_proc, diff --git a/src/wasm_app/ui.c b/src/wasm_app/ui.c index 75633b0..c940e03 100644 --- a/src/wasm_app/ui.c +++ b/src/wasm_app/ui.c @@ -2,8 +2,8 @@ ** [ ] Choosing a keying strategy from user code ** [ ] Using parents ** [ ] Using file and line -** -** +** [ ] Keyboard friendliness +** [ ] ui_em size ** */ @@ -117,10 +117,10 @@ gb ui_t *ui = NULL; gb_read_only ui_id_t ui_id_null; gb_read_only ui_box_t ui_box_null; -fn b32 ui_null_id(ui_id_t id) { return id.value == 0; } -fn b32 ui_null(ui_box_t *box) { return box->id.value == 0; } -fn b32 ui_hot(ui_box_t *box) { return !ui_null(box) && box->id.value == ui->hot.value; } -fn b32 ui_active(ui_box_t *box) { return !ui_null(box) && box->id.value == ui->active.value; } +fn b32 ui_is_null_id(ui_id_t id) { return id.value == 0; } +fn b32 ui_is_null_box(ui_box_t *box) { return box->id.value == 0; } +fn b32 ui_is_hot_box(ui_box_t *box) { return !ui_is_null_box(box) && box->id.value == ui->hot.value; } +fn b32 ui_is_active_box(ui_box_t *box) { return !ui_is_null_box(box) && box->id.value == ui->active.value; } #define ev_left(ev) ((ev)->mouse_button == app_mouse_button_left) #define ev_left_up(ev) ((ev)->kind == app_event_kind_mouse_up && ev_left(ev)) @@ -149,20 +149,23 @@ s8_t ui_get_hash_string(s8_t string) { return string; } -// @todo: we are not building a hierarchy, it's flat ! so this doesn't work!! fn ui_id_t ui_id_from_string(s8_t string) { u64 value = ht_hash_data(ui_get_hash_string(string)); ui_id_t id = {value}; return id; } -fn ui_id_t ui_id_from_id_stack(void) { - u64 value = 134; - for (i32 i = 0; i < ui->id_stack.len; i += 1) { - value = ui_hash_mix(value, ui->id_stack.data[i].value); +fn ui_id_t ui_find_valid_id(ui_box_t *box) { + for (ui_box_t *it = box; it; it = it->parent) { + if (!ui_is_null_box(it)) return it->id; } - ui_id_t id = {value}; - return id; + return ui_id_null; +} + +fn ui_id_t ui_id_from_parent(void) { + ui_id_t parent_id = ui_find_valid_id(ui->top); + if (ui_is_null_id(parent_id)) parent_id.value = 1423; + return parent_id; } fn ui_box_t *ui_find_box(ui_id_t id) { @@ -191,13 +194,19 @@ fn void ui_push_box(ui_box_t *box) { DLLQ_APPEND(ui->top->first, ui->top->last, box); } +fn s8_t ui_tprint_loc(ui_code_loc_t loc) { + return s8_printf(tcx.temp, "%s(%d)", loc.file, loc.line); +} + fn ui_box_t *ui_build_box_from_id(ui_code_loc_t loc, ui_id_t id) { ui_box_t *box = ui_find_box(id); if (box) { + expect (box->last_touched_event_id != ui->event->id) { + fatalf("likely ui id collision between: %S and %S", ui_tprint_loc(loc), ui_tprint_loc(box->loc)); + } memory_zero(box, offsetof(ui_box_t, id)); } else { box = ui_alloc_box(); - // @todo: we can't really make sure ids don't repeat can't we? DLLQ_APPEND_EX(ui->hash_first, ui->hash_last, box, hash_next, hash_prev); } box->loc = loc; @@ -217,7 +226,7 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, s8_t string) { id.value = ui_hash_mix(file_hash, line_hash); id.value = ui_hash_mix(id.value, cont_hash); } else if (ui->id_strategy == ui_id_strategy_hierarchy) { - ui_id_t id_from_stack = ui_id_from_id_stack(); + ui_id_t id_from_stack = ui_id_from_parent(); id.value = ui_hash_mix(string_id.value, id_from_stack.value); } else_is_invalid; @@ -233,21 +242,21 @@ fn ui_signal_t ui_signal_from_box(ui_box_t *box) { b32 move = ev->kind == app_event_kind_mouse_move; b32 inside = r2f32_contains(box->rect, ev->mouse_pos); - if (ui_active(box)) { + if (ui_is_active_box(box)) { if (ev_left_up(ev)) { - if (ui_hot(box)) { + if (ui_is_hot_box(box)) { result.clicked = true; } else { ui->active.value = 0; } } - } else if (ui_hot(box) && ev_left_down(ev)) { + } else if (ui_is_hot_box(box) && ev_left_down(ev)) { ui->active = box->id; } if (inside) { ui->hot.value = box->id.value; - } else if (!inside && ui_hot(box)) { + } else if (!inside && ui_is_hot_box(box)) { ui->hot = ui_id_null; } @@ -352,14 +361,14 @@ fn ui_signal_t ui_push_exp(ui_code_loc_t loc, char *str, ...) { if (signal.clicked) { + ui->indent_stack += 1; STACK_PUSH(ui->id_stack, box->id); - ui_push_indent(); } return signal; } fn void ui_pop_exp(void) { - ui_pop_indent(); + ui->indent_stack -= 1; STACK_POP(ui->id_stack); } @@ -549,10 +558,10 @@ fn void ui_draw(void) { ui_box_t *box = it.box; v4f32_t rect_color = primary_color_global; - if (ui_hot(box)) { + if (ui_is_hot_box(box)) { rect_color = secondary_color_global; } - if (ui_active(box)) { + if (ui_is_active_box(box)) { rect_color = accent1_color_global; }