ui_text_input selection

This commit is contained in:
Krzosa Karol
2025-01-23 19:14:54 +01:00
parent 0b6ea60fa7
commit 39c9a9841e
2 changed files with 46 additions and 44 deletions

View File

@@ -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);