From 39c9a9841ecbaef77d75da1c58209bff93440502 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Thu, 23 Jan 2025 19:14:54 +0100 Subject: [PATCH] ui_text_input selection --- src/ui/ui.c | 54 +++++++++++++++++++++++++++++++++++++++++++++-------- src/ui/ui.h | 36 ----------------------------------- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/src/ui/ui.c b/src/ui/ui.c index 5ea118f..efd45db 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -1,3 +1,40 @@ +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}; +} + +fn i32 ui_caret_front(ui_caret_t c) { return c.e[c.ifront]; } +fn i32 ui_caret_back(ui_caret_t c) { return c.e[(c.ifront + 1) % 2]; } + +ui_caret_t ui_caret(i32 front, i32 back) { + ui_caret_t result = {0}; + if (front >= back) { + result.range.min = back; + result.range.max = front; + result.ifront = 1; + } else { + result.range.min = front; + result.range.max = back; + result.ifront = 0; + } + return result; +} + +ui_caret_t ui_caret_set_back(ui_caret_t caret, i32 back) { + i32 front = ui_caret_front(caret); + ui_caret_t result = ui_caret(front, back); + return result; +} + +ui_caret_t ui_caret_set_front(ui_caret_t caret, i32 front) { + i32 back = ui_caret_back(caret); + ui_caret_t result = ui_caret(front, back); + return result; +} + +fn ui_caret_t ui_carets(i32 x) { + return ui_caret(x, x); +} + fn s8_t ui_tprint_loc(ui_code_loc_t loc) { return s8_printf(tcx.temp, "%s(%d)", loc.file, loc.line); } @@ -242,7 +279,7 @@ fn void ui_text_input_draw(ui_box_t *box) { v2f32_t size_min = rn_measure_string(rn_state.main_font, string_min); v2f32_t size_max = rn_measure_string(rn_state.main_font, string_max); r2f32_t selection_rect = r2f32(rect.min.x + size_min.x, rect.min.y, rect.min.x + size_max.x, rect.min.y + ui_em(1)); - rn_draw_rect(selection_rect, v4f32(1,1,1,0.2f)); + rn_draw_rect(selection_rect, v4f32(1,1,1,0.5f)); v2f32_t size_front = ti->caret.ifront == 0 ? size_min : size_max; @@ -337,13 +374,14 @@ fn ui_signal_t ui_text_input(ui_code_loc_t loc, char *buffer, i32 buffer_size) { ti->caret = ui_carets(ui_caret_front(ti->caret) + 1); } } - } else if (signal.dragging) { - v2f32_t size = rn_measure_string(rn_state.main_font, s8_lit("_")); - v2f32_t pos = v2f32_sub(ev->mouse_pos, box->final_rect.min); - i32 p = (i32)f32_round(pos.x / size.x); - if (ev->kind == app_event_kind_mouse_down && ev->mouse_button == app_mouse_button_left) { - ti->caret = ui_carets(p); - } + } + v2f32_t size = rn_measure_string(rn_state.main_font, s8_lit("_")); + v2f32_t pos = v2f32_sub(ev->mouse_pos, box->final_rect.min); + i32 p = (i32)f32_round(pos.x / size.x); + if (ev->kind == app_event_kind_mouse_down && ev->mouse_button == app_mouse_button_left) { + ti->caret = ui_carets(p); + } + if (signal.dragging) { ti->caret = ui_caret_set_front(ti->caret, p); } ti->caret = ui_caret_clamp(ti->caret, 0, (i32)ti->len); diff --git a/src/ui/ui.h b/src/ui/ui.h index 16d3b2e..44e274e 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -52,42 +52,6 @@ struct ui_caret_t { i32 ifront; }; -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}; -} -fn i32 ui_caret_front(ui_caret_t c) { return c.e[c.ifront]; } -fn i32 ui_caret_back(ui_caret_t c) { return c.e[c.ifront ? 0 : 1]; } - -ui_caret_t ui_caret(i32 front, i32 back) { - ui_caret_t result = {0}; - if (front >= back) { - result.range.min = back; - result.range.max = front; - result.ifront = 1; - } else { - result.range.min = front; - result.range.max = back; - result.ifront = 0; - } - return result; -} - -ui_caret_t ui_caret_set_back(ui_caret_t caret, i32 back) { - i32 front = ui_caret_front(caret); - ui_caret_t result = ui_caret(front, back); - return result; -} - -ui_caret_t ui_caret_set_front(ui_caret_t caret, i32 front) { - i32 back = ui_caret_back(caret); - ui_caret_t result = ui_caret(front, back); - return result; -} - -fn ui_caret_t ui_carets(i32 x) { - return ui_caret(x, x); -} - typedef struct ui_text_input_t ui_text_input_t; struct ui_text_input_t { union {