scroller applied to all

This commit is contained in:
Krzosa Karol
2025-02-01 08:16:39 +01:00
parent 644bb896ac
commit 942cff9a6b

View File

@@ -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,8 +994,9 @@ 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;
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);
@@ -1000,6 +1004,8 @@ fn ui_scroller_t ui_begin_scroller(ui_scroller_params_t p) {
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);
}
///////////////////////////////