fix scroll bar

This commit is contained in:
Krzosa Karol
2025-01-26 22:06:55 +01:00
parent 8ae6e15bf8
commit a8cf9bfee9
6 changed files with 151 additions and 77 deletions

View File

@@ -204,7 +204,7 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, ui_box_flags_t flags, s
}
if (box->flags.dont_compute_rect == false) {
r2f32_t rect = ui_next_rect(ui_top_lop(), &ui->top->rect, string_size);
ui_set_rect(box, rect, ui_top_lop());
ui_set_rect(box, rect);
}
box->string_pos_offset = ui_top_string_pos_offset();
return box;
@@ -503,7 +503,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_build_box_from_string(loc, (ui_box_flags_t){ .draw_text = true }, string);
ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_text = true, .draw_rect = true }, string);
return box;
}
@@ -915,7 +915,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
ui_begin_build(UILOC, ev, window_rect_from_frame(frame));
ui_box_t *top_box = ui_box0((ui_box_flags_t){.draw_rect = true, .clip_rect = true});
ui_set_rect(top_box, r2f32_cut_top(&ui->top->rect, ui_em(1.5f)), ui_lop_cut_top);
ui_set_rect(top_box, r2f32_cut_top(&ui->top->rect, ui_em(1.5f)));
ui_set_padding(ui_em(3))
ui_set_text_align(ui_text_align_center)
ui_set_lop(ui_lop_cut_left)
@@ -928,10 +928,10 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
if (ui_g_panel == 1) {
ui_box_t *scroller_box = ui_boxf((ui_box_flags_t){.draw_rect = true, .clip_rect = true}, "scrollbar");
ui_set_rect(scroller_box, r2f32_cut_right(&ui->top->rect, 10 * frame->dpr), ui_lop_cut_right);
ui_set_rect(scroller_box, r2f32_cut_right(&ui->top->rect, 10 * frame->dpr));
ui_box_t *item_box = ui_boxf((ui_box_flags_t){.draw_rect = true, .clip_rect = true}, "item_box");
ui_set_rect(item_box, r2f32_cut_left(&ui->top->rect, ui_max), ui_lop_cut_left);
ui_set_rect(item_box, r2f32_cut_left(&ui->top->rect, ui_max));
item_box->rect = r2f32_shrinks(item_box->rect, ui_em(1));
@@ -970,8 +970,7 @@ 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(&ui_test_event, type(app_event_t));
ui_set_id(ui_idf("a")) {
ui_serial_type(&ui_test_event, type(app_event_t));
ui_serial_type(&ui_test_event, type(app_event_t));
}
}
@@ -985,23 +984,34 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
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;
// f32 scroller_second = scrollable_space - scroller_percent;
r2f32_cut_top(&ui->top->rect, scroller_percent * scroller_box_size);
ui_box_t *box = ui_build_box_from_id(UILOC, (ui_box_flags_t){.draw_rect = true}, ui_idf("slider"));
box->background_color = ui_color_table[ui_color_scroller];
box->bg_hot_color = ui_color_table[ui_color_scroller_hot];
box->bg_active_color = ui_color_table[ui_color_scroller_active];
ui_set_rect(box, r2f32_cut_top(&ui->top->rect, scroller_size * scroller_box_size), ui_lop_cut_top);
ui_signal_t signal = ui_signal_from_box(box);
ui_box_t *upper_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "upper_box");
ui_box_t *slider_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "slider_box");
ui_box_t *down_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "down_box");
ui_set_rect(upper_box, r2f32_cut_top(&ui->top->rect, scroller_percent * scroller_box_size));
ui_set_rect(slider_box, r2f32_cut_top(&ui->top->rect, slider_box_size));
ui_set_rect(down_box, r2f32_cut_top(&ui->top->rect, ui_max));
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 = (all_items_size / item_box_size) / scrollable_space;
if (signal.dragging) {
scroller_value += signal.drag.y;
scroller_value = CLAMP(scroller_value, 0, all_items_size);
scroller_value += drag * coef;
}
if (upper_box_signal.clicked || down_box_signal.dragging) {
scroller_value = (ev->mouse_pos.y - upper_box->final_rect.min.y) * coef;
scroller_value -= (slider_box_size / 2) * coef;
}
if (ev->kind == app_event_kind_mouse_wheel) {
scroller_value -= ev->mouse_wheel_delta.y;
scroller_value = CLAMP(scroller_value, 0, all_items_size);
}
scroller_value = CLAMP(scroller_value, 0, all_items_size);
for (ui_box_t *it = item_box->first; it; it = it->next) {
ui_offset_box(it, v2f32(0, scroller_value));
@@ -1011,6 +1021,27 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
}
// ui_box_t *lister = ui_box0((ui_box_flags_t){.draw_rect = true, .clip_rect = true});
// ui_set_top(lister)
// ui_set_lop(ui_lop_cut_top) {
// v2f32_t max_size = v2f32_sub(frame->window_size, v2f32(ui_em(2), ui_em(2)));
// v2f32_t _lister_size = v2f32(ui_em(20), ui_em(40));
// 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);
// r2f32_t rect = r2f32_min_dim(pos, lister_size);
// ui_set_rect(lister, rect);
// lister->background_color.g += 100;
// locl char buff[128];
// locl ui_text_input_t text_input;
// if (text_input.str == NULL) {
// text_input.str = buff;
// text_input.cap = lengthof(buff);
// }
// ui_text_input(UILOC, &text_input);
// }
ui_end_build();
}

View File

@@ -153,7 +153,7 @@ fn b32 ui_is_focused_box(ui_box_t *box) { return !ui_is_null_box(box) && box->id
#define ev_left_up(ev) ((ev)->kind == app_event_kind_mouse_up && ev_left(ev))
#define ev_left_down(ev) ((ev)->kind == app_event_kind_mouse_down && ev_left(ev))
fn void ui_set_rect(ui_box_t *box, r2f32_t rect, ui_lop_t lop) { box->rect = box->full_rect = rect; box->lop = lop; }
fn void ui_set_rect(ui_box_t *box, r2f32_t rect) { box->rect = box->full_rect = rect; }
#define UILOC (ui_code_loc_t){.file = __FILE__, .line = __LINE__, .counter = __COUNTER__}
#define ui_em(x) ((x) * rn->main_font->size)