This commit is contained in:
Krzosa Karol
2025-02-05 09:35:43 +01:00
parent 99317440b3
commit 47e6dbaf79

View File

@@ -622,7 +622,7 @@ fn ui_signal_t ui__label_button(ui_code_loc_t loc, char *str, ...) {
#define ui_label(...) ui__label(UILOC, __VA_ARGS__)
fn ui_box_t *ui__label(ui_code_loc_t loc, char *str, ...) {
S8_FMT(tcx->temp, str, string);
ui_box_t *box = ui_box(.loc = loc, .string = string, .flags = {.draw_text = true, .animate_appear = true});
ui_box_t *box = ui_box(.loc = loc, .string = string, .flags = {.draw_text = true});
return box;
}
@@ -1047,7 +1047,7 @@ fn ui_scroller_t ui_begin_scroller(ui_code_loc_t loc, ui_scroller_params_t p) {
f32 render_start_count = f32_floor(p.verti.value[0] / p.verti.item_pixels);
i32 istart = (i32)render_start_count;
i32 iend = (i32)render_start_count + (i32)visible_item_count;
i32 iend = (i32)render_start_count + (i32)visible_item_count + 1;
s.verti.istart = CLAMP(istart, 0, (i32)p.verti.item_count);
s.verti.iend = CLAMP(iend, 0, (i32)p.verti.item_count);
}
@@ -1065,6 +1065,11 @@ fn void ui_cut_top_scroller_offset(ui_scroller_t s) {
r2f32_cut_top_no_squash(ui_top_rectp(), (f32)s.verti.istart * s.p.verti.item_pixels);
}
fn v2f32_t ui_scroller_get_scroll_value(ui_scroller_t *s) {
v2f32_t result = v2f32(s->p.hori.value ? s->p.hori.value[0] : 0, s->p.verti.value ? s->p.verti.value[0] : 0);
return result;
}
fn void ui_end_scroller(ui_scroller_t s) {
if (s.p.verti.enabled && s.p.verti.item_count == 0) {
ui_scroller_calc_vertical(s);
@@ -1105,7 +1110,7 @@ fn void ui_end_scroller(ui_scroller_t s) {
s.p.hori.value[0] = CLAMP(s.p.hori.value[0], 0, s.p.hori.max_size);
}
}
ui_offset_children(s.p.parent, v2f32(s.p.hori.value ? s.p.hori.value[0] : 0, s.p.verti.value ? s.p.verti.value[0] : 0));
ui_offset_children(s.p.parent, ui_scroller_get_scroll_value(&s));
}
///////////////////////////////
@@ -1235,8 +1240,91 @@ fn void ui_init(ma_arena_t *arena) {
ui_reload();
}
gb app_event_t ui_test_event;
fn r2f32_t ui_get_centered_rect(v2f32_t parent_rect_size, v2f32_t size) {
v2f32_t max_size = v2f32_sub(parent_rect_size, v2f32(ui_em(2), ui_em(2)));
v2f32_t lister_size = v2f32_clamp(size, v2f32_null, max_size);
v2f32_t pos = v2f32_divs(v2f32_sub(parent_rect_size, lister_size), 2.0);
pos.y *= 0.05f;
r2f32_t rect = r2f32_min_dim(pos, lister_size);
return rect;
}
gb i32 ui_g_panel = 1;
fn void ui_demo_everything_lister(void) {
app_event_t *ev = ui->event;
app_frame_t *frame = ui->frame;
ui_id_t lister_id = ui_id_from_loc(UILOC);
locl b32 lister_open;
b32 lister_just_opened = false;
if (ev->kind == app_event_kind_key_down && ev->key == app_key_p && ev->ctrl) {
lister_open = !lister_open;
if (lister_open) lister_just_opened = true;
}
s8_t cmds[] = {
s8_lit("show data tab"),
s8_lit("show log tab"),
s8_lit("show menus tab"),
};
if (lister_open) {
r2f32_t rect = ui_get_centered_rect(frame->window_size, v2f32(ui_dm(50), ui_em(25)));
ui_box_t *lister = ui_box(.id = lister_id, .rect = rect, .flags = {.animate_appear = true, .draw_rect = true, .draw_border = 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_lop(ui_lop_cut_top) {
locl char buff[128];
locl ui_text_input_t text_input;
text_input.str = buff;
text_input.cap = lengthof(buff);
ui_signal_t ti_sig = ui_text_input(&text_input, true);
if (lister_just_opened) text_input.len = 0;
ma_temp_t scratch = ma_begin_scratch();
s8_t needle = s8(text_input.str, text_input.len);
fuzzy_pair_t *pairs = fuzzy_rate_array(scratch.arena, needle, cmds, lengthof(cmds));
b32 set_focus = lister_just_opened || ti_sig.text_changed;
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) {
ui_signal_t sig = ui_button(cmds[pairs[i].index].str);
if (set_focus) {
ui->focus = sig.box->id;
set_focus = false;
}
}
}
if (ti_sig.text_commit) {
fuzzy_pair_t *pair = &pairs[0];
ui_g_panel = (i32)pair->index + 1;
ui_text_clear(&text_input);
lister_open = false;
}
ma_end_scratch(scratch);
}
ui_end_scroller(scroller);
}
}
gb app_event_t ui_test_event;
fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_count) {
ui_begin_frame(frame);
rn_begin_frame(frame);
@@ -1266,7 +1354,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
///////////////////////////////
// Data panel
if (ui_g_panel == 1) {
ui_box_t *item_box = ui_box(r2f32_cut_left(ui_top_rectp(), ui_max), {.draw_rect = true, .clip_rect = true});
ui_box_t *item_box = ui_box(r2f32_cut_left(ui_top_rectp(), ui_max), {.draw_rect = true, .clip_rect = true, .animate_appear = true});
static f32 verti_scroller_value;
ui_scroller_t scroller = ui_begin_scroller(UILOC, (ui_scroller_params_t){
@@ -1453,7 +1541,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
}
}
ui_box_t *item_box = ui_box(.rect = r2f32_cut_left(ui_top_rectp(), ui_max), .flags = {.draw_rect = true, .clip_rect = true});
ui_box_t *item_box = ui_box(.rect = r2f32_cut_left(ui_top_rectp(), ui_max), .flags = {.draw_rect = true, .clip_rect = true, .animate_appear = true});
locl f32 right_scroller_value;
locl f32 bottom_scroller_value;
@@ -1483,7 +1571,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
///////////////////////////////
// Menus panel
if (ui_g_panel == 3) {
ui_box_t *item_box = ui_box(.rect = r2f32_cut_left(ui_top_rectp(), ui_max), .flags = {.draw_rect = true, .clip_rect = true});
ui_box_t *item_box = ui_box(.rect = r2f32_cut_left(ui_top_rectp(), ui_max), .flags = {.draw_rect = true, .clip_rect = true, .animate_appear = true});
ui_set_top(item_box) {
ui_label("right click to bring up the context menu!");
}
@@ -1500,7 +1588,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
}
if (context_menu_open) {
ui_box_t *menu = ui_box(.rect = r2f32_min_dim(menu_pos, v2f32(ui_em(10), ui_children_sum)), .flags = {.draw_border = true, .draw_rect = true, .children_sum_y = true});
ui_box_t *menu = ui_box(.rect = r2f32_min_dim(menu_pos, v2f32(ui_em(10), ui_children_sum)), .flags = {.draw_border = true, .draw_rect = true, .children_sum_y = true, .animate_appear = true});
ui_set_top(menu)
ui_set_text_align(ui_text_align_left)
ui_set_string_pos_offset(ui_em(1))
@@ -1508,7 +1596,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
ui_label_button("file");
ui_label_button("memes");
r2f32_cut_left(ui_top_rectp(), ui_em(1));
ui_box_t *a = ui_box(.flags = {.draw_border = true, .draw_rect = true, .children_sum_y = true});
ui_box_t *a = ui_box(.flags = {.draw_border = true, .draw_rect = true, .children_sum_y = true, .animate_appear = true});
ui_set_top(a) {
ui_label_button("a");
ui_label_button("memes");
@@ -1527,83 +1615,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
}
///////////////////////////////
// Everything lister
ui_id_t lister_id = ui_id_from_loc(UILOC);
locl b32 lister_open;
b32 lister_just_opened = false;
if (ev->kind == app_event_kind_key_down && ev->key == app_key_p && ev->ctrl) {
lister_open = !lister_open;
if (lister_open) lister_just_opened = true;
}
s8_t cmds[] = {
s8_lit("show data tab"),
s8_lit("show log tab"),
s8_lit("show menus tab"),
};
if (lister_open) {
v2f32_t max_size = v2f32_sub(frame->window_size, v2f32(ui_em(2), ui_em(2)));
v2f32_t _lister_size = v2f32(ui_dm(50), ui_em(25));
v2f32_t lister_size = v2f32_clamp(_lister_size, v2f32_null, max_size);
v2f32_t pos = v2f32_divs(v2f32_sub(frame->window_size, lister_size), 2.0);
pos.y *= 0.05f;
r2f32_t rect = r2f32_min_dim(pos, lister_size);
ui_box_t *lister = ui_box(.id = lister_id, .rect = rect, .flags = {.animate_appear = true, .draw_rect = true, .draw_border = 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_lop(ui_lop_cut_top) {
locl char buff[128];
locl ui_text_input_t text_input;
text_input.str = buff;
text_input.cap = lengthof(buff);
ui_signal_t ti_sig = ui_text_input(&text_input, true);
if (lister_just_opened) text_input.len = 0;
ma_temp_t scratch = ma_begin_scratch();
s8_t needle = s8(text_input.str, text_input.len);
fuzzy_pair_t *pairs = fuzzy_rate_array(scratch.arena, needle, cmds, lengthof(cmds));
b32 set_focus = lister_just_opened || ti_sig.text_changed;
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) {
ui_signal_t sig = ui_button(cmds[pairs[i].index].str);
if (set_focus) {
ui->focus = sig.box->id;
set_focus = false;
}
}
}
if (ti_sig.text_commit) {
fuzzy_pair_t *pair = &pairs[0];
ui_g_panel = (i32)pair->index + 1;
ui_text_clear(&text_input);
lister_open = false;
}
ma_end_scratch(scratch);
}
ui_end_scroller(scroller);
}
ui_demo_everything_lister();
ui_end_build();
}