From 942cff9a6b8670893c76b790f6ff6ea1812263b3 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sat, 1 Feb 2025 08:16:39 +0100 Subject: [PATCH] scroller applied to all --- src/ui/ui.c | 83 ++++++++++++++++++++--------------------------------- 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/src/ui/ui.c b/src/ui/ui.c index ec54032..d564d1f 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -966,8 +966,11 @@ struct ui_scroller_params_t { struct { b8 enabled; f32 *value; + // @option1: efficient scroll f32 item_pixels; i32 item_count; + // @option2: non efficient + f32 max_size; } verti; }; @@ -991,15 +994,18 @@ fn ui_scroller_t ui_begin_scroller(ui_scroller_params_t p) { if (p.verti.enabled) { r.verti.box = ui_box(.rect = r2f32_cut_right(&p.parent->rect, ui_dm(0.5f)), .flags = {.draw_rect = true}); r2f32_cut_bottom(&r.verti.box->rect, ui_dm(0.5f)); - r.verti.item_box_pixels = r2f32_get_size(p.parent->rect).y; - f32 visible_item_count = f32_ceil(r.verti.item_box_pixels / p.verti.item_pixels); - 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; - r.verti.istart = CLAMP(istart, 0, (i32)p.verti.item_count); - r.verti.iend = CLAMP(iend, 0, (i32)p.verti.item_count); + if (p.verti.item_count) { + f32 visible_item_count = f32_ceil(r.verti.item_box_pixels / p.verti.item_pixels); + 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; + r.verti.istart = CLAMP(istart, 0, (i32)p.verti.item_count); + r.verti.iend = CLAMP(iend, 0, (i32)p.verti.item_count); + r.p.verti.max_size = r.p.verti.item_pixels * r.p.verti.item_count; + } } if (p.hori.enabled) { @@ -1016,7 +1022,7 @@ fn void ui_cut_top_scroller_offset(ui_scroller_t s) { fn void ui_end_scroller(ui_scroller_t s) { if (s.p.verti.enabled) ui_set_top(s.verti.box) { f32 scroller_rect_pixels = r2f32_get_size(s.verti.box->rect).y; - f32 all_items_size = s.p.verti.item_pixels * s.p.verti.item_count; + f32 all_items_size = s.p.verti.max_size; f32 scroller_size = f32_clamp01(s.verti.item_box_pixels / (all_items_size + s.verti.item_box_pixels)); f32 scrollable_space = (1 - scroller_size); f32 scroller_value_norm = s.p.verti.value[0] / (all_items_size); @@ -1080,7 +1086,6 @@ 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)); @@ -1239,11 +1244,17 @@ 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 *scroller_box = ui_box(r2f32_cut_right(ui_top_rectp(), 10 * frame->dpr), {.draw_rect = true}); - ui_box_t *bottom_scroller = ui_box(r2f32_cut_bottom(ui_top_rectp(), 10 * frame->dpr), {.draw_rect = true}); ui_box_t *item_box = ui_box(r2f32_cut_left(ui_top_rectp(), ui_max), {.draw_rect = true, .clip_rect = true}); - r2f32_t scroll_rect = {0}; + static f32 verti_scroller_value; + ui_scroller_t scroller = ui_begin_scroller((ui_scroller_params_t){ + .parent = item_box, + .verti = { + .enabled = true, + .value = &verti_scroller_value, + }, + }); + ui_set_text_align(ui_text_align_left) ui_set_top(item_box) { ui_top_rectp()[0] = r2f32_shrinks(ui_top_rect(), ui_em(1)); @@ -1271,49 +1282,17 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co ui_label("allocated boxes: %d", ui->allocated_boxes); ui_serial_type(UILOC, &ui_test_event, type(app_event_t)); ui_serial_type(UILOC, &ui_test_event, type(app_event_t)); + ui_serial_type(UILOC, &ui_test_event, type(app_event_t)); + ui_serial_type(UILOC, &ui_test_event, type(app_event_t)); + ui_serial_type(UILOC, &ui_test_event, type(app_event_t)); + ui_serial_type(UILOC, &ui_test_event, type(app_event_t)); + ui_serial_type(UILOC, &ui_test_event, type(app_event_t)); - scroll_rect = r2f32_fix(ui_top_rect()); + r2f32_t scroll_rect = r2f32_fix(ui_top_rect()); + scroller.p.verti.max_size = r2f32_get_size(scroll_rect).y; } - locl f32 scroller_value; - ui_set_top(scroller_box) { - f32 all_items_size = r2f32_get_size(scroll_rect).y; - f32 item_box_size = r2f32_get_size(item_box->rect).y; - f32 scroller_box_size = r2f32_get_size(scroller_box->rect).y; - f32 scroller_size = CLAMP(item_box_size / (all_items_size + frame->window_size.y), 0, 1.0f); - f32 scrollable_space = (1 - scroller_size); - f32 scroller_norm = scroller_value / (all_items_size); - f32 scroller_percent = scroller_norm * scrollable_space; - f32 slider_box_size = scroller_size * scroller_box_size; - - ui_box_t *upper_box = ui_box(r2f32_cut_top(ui_top_rectp(), scroller_percent * scroller_box_size), {.draw_rect = true}); - ui_box_t *slider_box = ui_box(r2f32_cut_top(ui_top_rectp(), slider_box_size), {.draw_rect = true}); - ui_box_t *down_box = ui_box(r2f32_cut_top(ui_top_rectp(), ui_max), {.draw_rect = true}); - slider_box->background_color = ui_color_table[ui_color_scroller]; - slider_box->bg_hot_color = ui_color_table[ui_color_scroller_hot]; - slider_box->bg_active_color = ui_color_table[ui_color_scroller_active]; - ui_signal_t signal = ui_signal_from_box(slider_box); - ui_signal_t upper_box_signal = ui_signal_from_box(upper_box); - ui_signal_t down_box_signal = ui_signal_from_box(down_box); - f32 drag = ev->mouse_delta.y; - f32 coef = f32_safe_ratio0(all_items_size / item_box_size, scrollable_space); - if (signal.dragging) { - scroller_value += drag * coef; - scroller_value = CLAMP(scroller_value, 0, all_items_size); - } - if (upper_box_signal.dragging || down_box_signal.dragging) { - scroller_value = (ev->mouse_pos.y - upper_box->final_rect.min.y) * coef; - scroller_value -= (slider_box_size / 2) * coef; - scroller_value = CLAMP(scroller_value, 0, all_items_size); - } - if (ev->kind == app_event_kind_mouse_wheel) { - scroller_value -= ev->mouse_wheel_delta.y; - scroller_value = CLAMP(scroller_value, 0, all_items_size); - } - - } - - ui_offset_children(item_box, v2f32(0, scroller_value)); + ui_end_scroller(scroller); } ///////////////////////////////