improving scroller

This commit is contained in:
Krzosa Karol
2025-01-15 10:32:29 +01:00
parent 5f33455b97
commit c680d60b19
3 changed files with 86 additions and 34 deletions

View File

@@ -48,9 +48,10 @@ fn ui_box_t *ui_alloc_box(void) {
return box;
}
fn void ui_push_box(ui_box_t *box) {
box->parent = ui->top;
DLLQ_APPEND(ui->top->first, ui->top->last, box);
fn void ui_push(ui_box_t *parent, ui_box_t *box) {
box->parent = parent;
DLLQ_APPEND(parent->first, parent->last, box);
parent->node_count += 1;
}
fn void ui_set_semantic_size(ui_box_t *box, ui_size_t x, ui_size_t y) {
@@ -62,7 +63,7 @@ fn s8_t ui_tprint_loc(ui_code_loc_t loc) {
return s8_printf(tcx.temp, "%s(%d)", loc.file, loc.line);
}
fn ui_box_t *ui_build_box_from_id(ui_code_loc_t loc, ui_id_t id, ui_box_flag_t flags) {
fn ui_box_t *ui_build_box_from_id(ui_code_loc_t loc, ui_box_flag_t flags, ui_id_t id) {
ui_box_t *box = ui_find_box(id);
if (box) {
expect (box->last_touched_event_id != ui->event->id) {
@@ -78,7 +79,7 @@ fn ui_box_t *ui_build_box_from_id(ui_code_loc_t loc, ui_id_t id, ui_box_flag_t f
box->last_touched_event_id = ui->event->id;
box->id = id;
box->flags = flags;
ui_push_box(box);
ui_push(ui->top, box);
return box;
}
@@ -105,9 +106,9 @@ fn ui_id_t ui_gen_id(ui_id_strategy_t strat, ui_code_loc_t loc, s8_t string) {
return id;
}
fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, s8_t string, ui_box_flag_t flags) {
fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, ui_box_flag_t flags, s8_t string) {
ui_id_t id = ui_gen_id(ui->id_strategy, loc, ui_get_hash_string(string));
ui_box_t *box = ui_build_box_from_id(loc, id, flags);
ui_box_t *box = ui_build_box_from_id(loc, flags, id);
box->string = ui_get_display_string(string);
return box;
}
@@ -188,7 +189,7 @@ fn void ui_begin_frame(app_frame_t *frame) {
ui->frame = frame;
}
fn void ui_push_top(ui_box_t *box) {
fn void ui_push_parent(ui_box_t *box) {
ui->top = box;
}
@@ -199,22 +200,22 @@ fn ui_box_t *ui_pop_parent(void) {
}
fn ui_box_t *ui_spacer(ui_code_loc_t loc, ui_size_t x, ui_size_t y) {
ui_box_t *box = ui_build_box_from_id(loc, ui_null_id, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_border));
ui_box_t *box = ui_build_box_from_id(loc, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_border), ui_null_id);
ui_set_semantic_size(box, x, y);
return box;
}
fn ui_signal_t ui_scroller_button(ui_code_loc_t loc, ui_size_t x, ui_size_t y) {
ui_id_t id = ui_gen_id(flag2(ui_id_strategy_use_code_loc, ui_id_strategy_use_string), loc, s8_lit("spacer"));
ui_box_t *box = ui_build_box_from_id(loc, id, flag3(ui_box_flag_draw_scroller, ui_box_flag_draw_rect, ui_box_flag_draw_border));
ui_box_t *box = ui_build_box_from_id(loc, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_border), id);
ui_set_semantic_size(box, x, y);
ui_signal_t signal = ui_signal_from_box(box);
return signal;
}
fn ui_box_t *ui_push_container(ui_code_loc_t loc, ui_size_t x, ui_size_t y) {
ui_box_t *box = ui_build_box_from_id(loc, ui_null_id, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_border));
ui_push_top(box);
ui_box_t *box = ui_build_box_from_id(loc, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_border), ui_null_id);
ui_push_parent(box);
ui_set_semantic_size(box, x, y);
box->grow_axis = ui_axis2_y;
return box;
@@ -234,7 +235,7 @@ fn void ui_set_indented_string(ui_box_t *box, s8_t string) { box->string = s8_pr
fn ui_signal_t ui_push_exp(ui_code_loc_t loc, char *str, ...) {
S8_FMT(tcx.temp, str, string);
ui_box_t *box = ui_build_box_from_string(loc, string, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_text));
ui_box_t *box = ui_build_box_from_string(loc, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_text), string);
ui_set_semantic_size(box, ui_percent(1), ui_text());
if (box->created_new) box->expanded = true;
@@ -261,7 +262,7 @@ fn void ui_pop_exp(void) {
fn ui_box_t *ui_label(ui_code_loc_t loc, char *fmt, ...) {
S8_FMT(tcx.temp, fmt, string);
ui_box_t *box = ui_build_box_from_id(loc, ui_null_id, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_text));
ui_box_t *box = ui_build_box_from_id(loc, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_text), ui_null_id);
ui_set_indented_string(box, string);
ui_set_semantic_size(box, ui_text(), ui_text());
return box;
@@ -300,7 +301,6 @@ fn void ui_layout(void) {
for (ui_axis2_t axis = 0; axis < ui_axis2_count; axis += 1) {
ui_size_t sem = box->semantic_size[axis];
if (sem.kind == ui_size_kind_percent_of_parent) {
assert(sem.value >= 0 && sem.value <= 1.0);
assert(parent->semantic_size[axis].kind == ui_size_kind_pixels ||
parent->semantic_size[axis].kind == ui_size_kind_text_content ||
parent->semantic_size[axis].kind == ui_size_kind_percent_of_parent);
@@ -382,8 +382,5 @@ fn void ui_draw(void) {
if (is_flag_set(box->flags, ui_box_flag_draw_text)) {
rn_draw_string(font, box->rect.min, black_color_global, box->string);
}
if (is_flag_set(box->flags, ui_box_flag_draw_scroller)) {
rn_draw_string(font, box->rect.min, black_color_global, s8_lit("s"));
}
}
}