ui_text_input selection
This commit is contained in:
42
src/ui/ui.c
42
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);
|
||||
}
|
||||
if (signal.dragging) {
|
||||
ti->caret = ui_caret_set_front(ti->caret, p);
|
||||
}
|
||||
ti->caret = ui_caret_clamp(ti->caret, 0, (i32)ti->len);
|
||||
|
||||
36
src/ui/ui.h
36
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 {
|
||||
|
||||
Reference in New Issue
Block a user