diff --git a/src/ui/ui.c b/src/ui/ui.c index ce252b9..617e231 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -108,9 +108,50 @@ fn ui_id_t ui_idf(char *str, ...) { } fn void ui_push_id_string(s8_t string) { ui_push_id(ui_id(string)); } -fn void ui_push_top(ui_box_t *new_top) { assert(new_top->parent == ui->top); ui->top = new_top; ui_push_id(new_top->id); } -fn void ui_pop_top(void) { ui->top = ui->top->parent; ui_pop_id(); } + #define ui_set_top(x) defer_block(ui_push_top(x), ui_pop_top()) +fn void ui_push_top(ui_box_t *new_top) { + assert(new_top->parent == ui->top); + ui->top = new_top; + ui_push_id(new_top->id); + ui_push_rect(new_top->rect); +} +fn void ui_pop_top(void) { + ui->top = ui->top->parent; + ui_pop_id(); + ui_pop_rect(); +} + +fn r2f32_t *ui_top_rectp(void) { + return &ui->rect_stack->value; +} + +fn void ui_set_children_sums(ui_box_t *box) { + for (ui_box_t *it = box->first; it; it = it->next) { + ui_set_children_sums(it); + } + + if (box->flags.children_sum_x) { + f32 min = MIN(box->first->rect.min.x, box->last->rect.min.x); + f32 max = MAX(box->first->rect.max.x, box->last->rect.max.x); + box->rect.min.x = min; + box->rect.max.x = max; + } + + if (box->flags.children_sum_y) { + f32 min = MIN(box->first->rect.min.y, box->last->rect.min.y); + f32 max = MAX(box->first->rect.max.y, box->last->rect.max.y); + box->rect.min.y = min; + box->rect.max.y = max; + } +} + +fn void ui_clear_appear_t(ui_box_t *box) { + box->appear_t = 0; + for (ui_box_t *it = box->first; it; it = it->next) { + ui_clear_appear_t(it); + } +} fn ui_box_t *ui_alloc_box(void) { ui_box_t *box = NULL; @@ -164,7 +205,6 @@ fn r2f32_t ui_next_rect(ui_lop_t op, r2f32_t *rect, v2f32_t required_size) { } fn void ui_offset_one_box(ui_box_t *box, v2f32_t offset) { - box->full_rect = r2f32_sub_v2f32(box->full_rect, offset); box->rect = r2f32_sub_v2f32(box->rect, offset); } @@ -214,8 +254,7 @@ fn void ui_box_auto_rect(ui_box_t *box) { if (ui->padding_stack && (axis == ui_axis2_x || axis == ui_axis2_y)) { string_size.e[axis] += ui_top_padding(); } - r2f32_t rect = ui_next_rect(ui_top_lop(), &ui->top->rect, string_size); - ui_set_rect(box, rect); + box->rect = ui_next_rect(ui_top_lop(), ui_top_rectp(), string_size); } typedef struct ui_box_params_t ui_box_params_t; @@ -244,7 +283,7 @@ fn ui_box_t *ui__make_box(ui_box_params_t params) { if (r2f32_is_null(params.rect)) { ui_box_auto_rect(box); } else { - ui_set_rect(box, params.rect); + box->rect = params.rect; } return box; @@ -301,16 +340,6 @@ fn ui_signal_t ui_signal_from_box(ui_box_t *box) { return result; } -fn void ui_set_to_be_determined(ui_box_t *box, ui_axis2_t axis) { - if (axis == ui_axis2_x) { - box->full_rect.min.x = box->rect.max.x; - box->full_rect.max.x = box->rect.min.x; - } else if (axis == ui_axis2_y) { - box->full_rect.min.y = box->rect.max.y; - box->full_rect.max.y = box->rect.min.y; - } else_is_invalid; -} - fn v2f32_t ui_aligned_text_pos(f32 offset, ui_text_align_t text_align, r2f32_t rect, s8_t string, v2f32_t string_size) { v2f32_t rect_size = r2f32_get_size(rect); v2f32_t rect_string_diff = v2f32_sub(rect_size, string_size); @@ -335,7 +364,7 @@ struct ui_draw_compute_t { fn ui_draw_compute_t ui_draw_compute(ui_box_t *box) { ui_draw_compute_t co = {0}; - co.rect = box->full_rect; + co.rect = box->rect; f32 appear_t = f32_ease_out_n(f32_clamp01(box->appear_t * 2), 10); if (!ui_id_is_null(box->id)) { v2f32_t size = v2f32_muls(r2f32_get_size(co.rect), 0.15f); @@ -628,12 +657,13 @@ fn void ui_begin_build(ui_code_loc_t loc, app_event_t *ev, r2f32_t window_rect) ui_push_init_values(); zero_struct(&ui->root); - ui->root.full_rect = ui->root.rect = window_rect; ui->top = &ui->root; ui->root.loc = loc; } fn void ui_end_build(void) { + ui_set_children_sums(&ui->root); + { app_event_t *ev = ui->event; ui_box_t *focus_box = ui_find_box(ui->focus); @@ -664,7 +694,7 @@ fn void ui_end_build(void) { } fn void ui__draw_box(app_frame_t *frame, ui_box_t *box) { - box->final_rect = r2f32_intersect(box->full_rect, ui->clip_rect); + box->final_rect = r2f32_intersect(box->rect, ui->clip_rect); if (box->custom_draw) { box->custom_draw(box); } else { @@ -673,7 +703,7 @@ fn void ui__draw_box(app_frame_t *frame, ui_box_t *box) { r2f32_t prev_clip_rect = ui->clip_rect; if (box->flags.clip_rect) { - ui->clip_rect = box->full_rect; + ui->clip_rect = box->rect; rn_set_clip(ui->clip_rect); } for (ui_box_t *it = box->first; it; it = it->next) { @@ -965,7 +995,6 @@ fn void ui_end_reversal(void) { } } - gb app_event_t ui_test_event; gb i32 ui_g_panel = 2; fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_count) { @@ -982,7 +1011,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co ui_g_panel = 3; } - ui_box_t *top_box = ui_box(.null_id = true, .rect = r2f32_cut_top(&ui->top->rect, ui_em(1.5f)), .flags = {.draw_rect = true, .clip_rect = true}); + ui_box_t *top_box = ui_box(.null_id = true, .rect = r2f32_cut_top(ui_top_rectp(), ui_em(1.5f)), .flags = {.draw_rect = true, .clip_rect = true}); ui_set_padding(ui_em(3)) ui_set_text_align(ui_text_align_center) ui_set_lop(ui_lop_cut_left) @@ -992,19 +1021,19 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co ui_radio_button(&ui_g_panel, 3, "menus"); } - ui->top->rect = r2f32_shrinks(ui->top->rect, ui_em(1)); + ui_top_rectp()[0] = r2f32_shrinks(ui_top_rect(), ui_em(1)); /////////////////////////////// // Data panel if (ui_g_panel == 1) { - ui_box_t *scroller_box = ui_box(r2f32_cut_right(&ui->top->rect, 10 * frame->dpr), {.draw_rect = true}); - ui_box_t *bottom_scroller = ui_box(r2f32_cut_bottom(&ui->top->rect, 10 * frame->dpr), {.draw_rect = true}); - ui_box_t *item_box = ui_box(r2f32_cut_left(&ui->top->rect, ui_max), {.draw_rect = true, .clip_rect = true}); - item_box->rect = r2f32_shrinks(item_box->rect, ui_em(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}); 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)); locl char buff[128]; locl ui_text_input_t text_input; if (text_input.str == NULL) { @@ -1046,17 +1075,17 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co f32 item_count = (f32)item_box->node_count; f32 one_item_y_size = ui_em(1); f32 all_items_size = item_count * one_item_y_size; - f32 item_box_size = r2f32_get_size(item_box->full_rect).y; - f32 scroller_box_size = r2f32_get_size(scroller_box->full_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->rect, scroller_percent * scroller_box_size), {.draw_rect = true}); - ui_box_t *slider_box = ui_box(r2f32_cut_top(&ui->top->rect, slider_box_size), {.draw_rect = true}); - ui_box_t *down_box = ui_box(r2f32_cut_top(&ui->top->rect, ui_max), {.draw_rect = true}); + 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]; @@ -1087,15 +1116,15 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co max_size = MAX(max_size, it->string_size.x); } - f32 scroller_rect_pixels = r2f32_get_size(bottom_scroller->full_rect).x; + f32 scroller_rect_pixels = r2f32_get_size(bottom_scroller->rect).x; f32 scroller_button_size_norm = f32_clamp01(scroller_rect_pixels / max_size); f32 scrollable_space = (1.f - scroller_button_size_norm); f32 scroller_value_norm = bottom_scroller_value / max_size; f32 scroller_value_n = scroller_value_norm * scrollable_space; - ui_box_t *left_box = ui_box(r2f32_cut_left(&ui->top->rect, scroller_value_n * scroller_rect_pixels), {.draw_rect = true}); - ui_box_t *slider_box = ui_box(r2f32_cut_left(&ui->top->rect, scroller_button_size_norm * scroller_rect_pixels), {.draw_rect = true}); - ui_box_t *down_box = ui_box(r2f32_cut_left(&ui->top->rect, ui_max), {.draw_rect = true}); + ui_box_t *left_box = ui_box(r2f32_cut_left(ui_top_rectp(), scroller_value_n * scroller_rect_pixels), {.draw_rect = true}); + ui_box_t *slider_box = ui_box(r2f32_cut_left(ui_top_rectp(), scroller_button_size_norm * scroller_rect_pixels), {.draw_rect = true}); + ui_box_t *down_box = ui_box(r2f32_cut_left(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]; @@ -1109,8 +1138,8 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co bottom_scroller_value += ev->mouse_delta.x * coef; } if (left_box_sig.dragging || right_box_sig.dragging) { - bottom_scroller_value = (ev->mouse_pos.x - left_box->full_rect.min.x) * coef; - bottom_scroller_value -= (r2f32_get_size(slider_box->full_rect).x / 2) * coef; + bottom_scroller_value = (ev->mouse_pos.x - left_box->rect.min.x) * coef; + bottom_scroller_value -= (r2f32_get_size(slider_box->rect).x / 2) * coef; } if (ev->kind == app_event_kind_mouse_wheel) { bottom_scroller_value -= ev->mouse_wheel_delta.x; @@ -1258,15 +1287,15 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co } } - ui_box_t *right_scroller = ui_box(.rect = r2f32_cut_right(&ui->top->rect, 10 * frame->dpr), .flags = {.draw_rect = true}); - ui_box_t *bottom_scroller = ui_box(.rect = r2f32_cut_bottom(&ui->top->rect, 10 * frame->dpr), .flags = {.draw_rect = true}); - ui_box_t *item_box = ui_box(.rect = r2f32_cut_left(&ui->top->rect, ui_max), .flags = {.draw_rect = true, .clip_rect = true}); + ui_box_t *right_scroller = ui_box(.rect = r2f32_cut_right(ui_top_rectp(), 10 * frame->dpr), .flags = {.draw_rect = true}); + ui_box_t *bottom_scroller = ui_box(.rect = r2f32_cut_bottom(ui_top_rectp(), 10 * frame->dpr), .flags = {.draw_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}); locl f32 right_scroller_value; f32 one_item_y_size = ui_em(1); f32 all_items_size = item_count * one_item_y_size; - f32 item_box_pixels = r2f32_get_size(item_box->full_rect).y; + f32 item_box_pixels = r2f32_get_size(item_box->rect).y; f32 visible_item_count = f32_ceil(item_box_pixels / one_item_y_size); f32 render_start_count = f32_floor(right_scroller_value / one_item_y_size); @@ -1275,8 +1304,8 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co istart = CLAMP(istart, 0, (i32)item_count); iend = CLAMP(iend, 0, (i32)item_count); - r2f32_cut_top_no_squash(&item_box->rect, render_start_count * one_item_y_size); ui_set_top(item_box) { + r2f32_cut_top_no_squash(ui_top_rectp(), render_start_count * one_item_y_size); for (i32 i = istart; i full_rect).y; + f32 scroller_rect_pixels = r2f32_get_size(right_scroller->rect).y; f32 scroller_size = f32_clamp01(item_box_pixels / (all_items_size + frame->window_size.y)); f32 scrollable_space = (1 - scroller_size); f32 scroller_value_norm = right_scroller_value / (all_items_size); f32 scroller_value_n = scroller_value_norm * scrollable_space; - ui_box_t *upper_box = ui_box(r2f32_cut_top(&ui->top->rect, scroller_value_n * scroller_rect_pixels), {.draw_rect = true}); - ui_box_t *slider_box = ui_box(r2f32_cut_top(&ui->top->rect, scroller_size * scroller_rect_pixels), {.draw_rect = true}); - ui_box_t *down_box = ui_box(r2f32_cut_top(&ui->top->rect, ui_max), {.draw_rect = true}); + ui_box_t *upper_box = ui_box(r2f32_cut_top(ui_top_rectp(), scroller_value_n * scroller_rect_pixels), {.draw_rect = true}); + ui_box_t *slider_box = ui_box(r2f32_cut_top(ui_top_rectp(), scroller_size * scroller_rect_pixels), {.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]; @@ -1305,8 +1334,8 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co right_scroller_value += drag * coef; } if (upper_box_signal.dragging || down_box_signal.dragging) { - right_scroller_value = (ev->mouse_pos.y - upper_box->full_rect.min.y) * coef; - right_scroller_value -= (r2f32_get_size(slider_box->full_rect).y / 2) * coef; + right_scroller_value = (ev->mouse_pos.y - upper_box->rect.min.y) * coef; + right_scroller_value -= (r2f32_get_size(slider_box->rect).y / 2) * coef; } if (ev->kind == app_event_kind_mouse_wheel) { right_scroller_value -= ev->mouse_wheel_delta.y; @@ -1321,15 +1350,15 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co max_size = MAX(max_size, it->string_size.x); } - f32 scroller_rect_pixels = r2f32_get_size(bottom_scroller->full_rect).x; + f32 scroller_rect_pixels = r2f32_get_size(bottom_scroller->rect).x; f32 scroller_button_size_norm = f32_clamp01(scroller_rect_pixels / max_size); f32 scrollable_space = (1.f - scroller_button_size_norm); f32 scroller_value_norm = bottom_scroller_value / max_size; f32 scroller_value_n = scroller_value_norm * scrollable_space; - ui_box_t *left_box = ui_box(r2f32_cut_left(&ui->top->rect, scroller_value_n * scroller_rect_pixels), {.draw_rect = true}); - ui_box_t *slider_box = ui_box(r2f32_cut_left(&ui->top->rect, scroller_button_size_norm * scroller_rect_pixels), {.draw_rect = true}); - ui_box_t *down_box = ui_box(r2f32_cut_left(&ui->top->rect, ui_max), {.draw_rect = true}); + ui_box_t *left_box = ui_box(r2f32_cut_left(ui_top_rectp(), scroller_value_n * scroller_rect_pixels), {.draw_rect = true}); + ui_box_t *slider_box = ui_box(r2f32_cut_left(ui_top_rectp(), scroller_button_size_norm * scroller_rect_pixels), {.draw_rect = true}); + ui_box_t *down_box = ui_box(r2f32_cut_left(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]; @@ -1343,8 +1372,8 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co bottom_scroller_value += ev->mouse_delta.x * coef; } if (left_box_sig.dragging || right_box_sig.dragging) { - bottom_scroller_value = (ev->mouse_pos.x - left_box->full_rect.min.x) * coef; - bottom_scroller_value -= (r2f32_get_size(slider_box->full_rect).x / 2) * coef; + bottom_scroller_value = (ev->mouse_pos.x - left_box->rect.min.x) * coef; + bottom_scroller_value -= (r2f32_get_size(slider_box->rect).x / 2) * coef; } if (ev->kind == app_event_kind_mouse_wheel) { bottom_scroller_value -= ev->mouse_wheel_delta.x; @@ -1360,7 +1389,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->rect, 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}); ui_set_top(item_box) { ui_label("right click to bring up the context menu!"); } @@ -1377,25 +1406,28 @@ 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_to_be_determined)), .flags = {.draw_border = true, .draw_rect = 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}); ui_set_top(menu) ui_set_text_align(ui_text_align_left) ui_set_string_pos_offset(ui_em(1)) ui_set_padding(ui_em(0.2f)) { 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_set_top(a) { + ui_label_button("a"); + ui_label_button("memes"); + } + } - ui_set_to_be_determined(menu, ui_axis2_y); - if (ev_left_down(ev) && !r2f32_contains(menu->full_rect, ev->mouse_pos)) { + if (ev_left_down(ev) && !r2f32_contains(menu->final_rect, ev->mouse_pos)) { context_menu_open = 0; } if (ev_right_down(ev)) { - menu->appear_t = 0; - for (ui_box_t *it = menu->first; it; it = it->next) { - it->appear_t = 0; - } + ui_clear_appear_t(menu); } } } diff --git a/src/ui/ui.gen.c b/src/ui/ui.gen.c index 7720a22..d95ac55 100644 --- a/src/ui/ui.gen.c +++ b/src/ui/ui.gen.c @@ -74,6 +74,10 @@ fn void ui_push_string_pos_offset(f32 v) { ui_f32_node_t *n = ma_push_type(tcx-> fn void ui_pop_string_pos_offset(void) { SLLS_POP(ui->string_pos_offset_stack); } fn f32 ui_top_string_pos_offset(void) { return ui->string_pos_offset_stack->value; } #define ui_set_string_pos_offset(x) defer_block(ui_push_string_pos_offset(x), ui_pop_string_pos_offset()) +fn void ui_push_rect(r2f32_t v) { ui_r2f32_node_t *n = ma_push_type(tcx->temp, ui_r2f32_node_t); n->value = v; SLLS_PUSH(ui->rect_stack, n); } +fn void ui_pop_rect(void) { SLLS_POP(ui->rect_stack); } +fn r2f32_t ui_top_rect(void) { return ui->rect_stack->value; } +#define ui_set_rect(x) defer_block(ui_push_rect(x), ui_pop_rect()) fn void ui_push_background_color(v4f32_t v) { ui_v4f32_node_t *n = ma_push_type(tcx->temp, ui_v4f32_node_t); n->value = v; SLLS_PUSH(ui->background_color_stack, n); } fn void ui_pop_background_color(void) { SLLS_POP(ui->background_color_stack); } fn v4f32_t ui_top_background_color(void) { return ui->background_color_stack->value; } @@ -111,6 +115,7 @@ assert(ui->text_align_stack == NULL); assert(ui->required_size_stack == NULL); assert(ui->padding_stack == NULL); assert(ui->string_pos_offset_stack == NULL); +assert(ui->rect_stack == NULL); assert(ui->background_color_stack == NULL); assert(ui->bg_hot_color_stack == NULL); assert(ui->bg_active_color_stack == NULL); @@ -125,6 +130,7 @@ ui_push_lop(ui_lop_cut_top); ui_push_border_thickness(1.0f); ui_push_text_align(ui_text_align_left); ui_push_string_pos_offset(0); +ui_push_rect(window_rect_from_frame(ui->frame)); ui_push_background_color(ui_color_table[ui_color_rect]); ui_push_bg_hot_color(ui_color_table[ui_color_rect_hot]); ui_push_bg_active_color(ui_color_table[ui_color_rect_active]); @@ -139,6 +145,7 @@ ui_pop_lop(); ui_pop_border_thickness(); ui_pop_text_align(); ui_pop_string_pos_offset(); +ui_pop_rect(); ui_pop_background_color(); ui_pop_bg_hot_color(); ui_pop_bg_active_color(); diff --git a/src/ui/ui.gen.h b/src/ui/ui.gen.h index 4078edf..5ccbc6d 100644 --- a/src/ui/ui.gen.h +++ b/src/ui/ui.gen.h @@ -19,6 +19,7 @@ typedef struct ui_id_node_t ui_id_node_t; struct ui_id_node_t { ui_id_t value; u typedef struct ui_lop_node_t ui_lop_node_t; struct ui_lop_node_t { ui_lop_t value; ui_lop_node_t *next; }; typedef struct ui_f32_node_t ui_f32_node_t; struct ui_f32_node_t { f32 value; ui_f32_node_t *next; }; typedef struct ui_text_align_node_t ui_text_align_node_t; struct ui_text_align_node_t { ui_text_align_t value; ui_text_align_node_t *next; }; +typedef struct ui_r2f32_node_t ui_r2f32_node_t; struct ui_r2f32_node_t { r2f32_t value; ui_r2f32_node_t *next; }; typedef struct ui_v4f32_node_t ui_v4f32_node_t; struct ui_v4f32_node_t { v4f32_t value; ui_v4f32_node_t *next; }; #define UI_DECL_BOX_MEMBERS \ f32 border_thickness;\ @@ -26,6 +27,7 @@ ui_text_align_t text_align;\ f32 required_size;\ f32 padding;\ f32 string_pos_offset;\ +r2f32_t rect;\ v4f32_t background_color;\ v4f32_t bg_hot_color;\ v4f32_t bg_active_color;\ @@ -42,6 +44,7 @@ ui_text_align_node_t *text_align_stack;\ ui_f32_node_t *required_size_stack;\ ui_f32_node_t *padding_stack;\ ui_f32_node_t *string_pos_offset_stack;\ +ui_r2f32_node_t *rect_stack;\ ui_v4f32_node_t *background_color_stack;\ ui_v4f32_node_t *bg_hot_color_stack;\ ui_v4f32_node_t *bg_active_color_stack;\ diff --git a/src/ui/ui.h b/src/ui/ui.h index ac50e5a..ccbe13d 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -17,6 +17,8 @@ struct ui_box_flags_t { b8 draw_text: 1; b8 clip_rect: 1; + b8 children_sum_x: 1; + b8 children_sum_y: 1; b8 keyboard_nav: 1; }; @@ -83,9 +85,6 @@ struct ui_box_t { ui_lop_t lop; UI_DECL_BOX_MEMBERS - r2f32_t full_rect; - r2f32_t rect; - // state ui_id_t id; ui_box_t *hash_next; @@ -159,14 +158,13 @@ fn b32 ui_is_focused_box(ui_box_t *box) { return !ui_is_null_box(box) && box->id #define ev_right_up(ev) ((ev)->kind == app_event_kind_mouse_up && ev_right(ev)) #define ev_right_down(ev) ((ev)->kind == app_event_kind_mouse_down && ev_right(ev)) - -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) #define ui_max 200000000.f -#define ui_to_be_determined 0 +#define ui_children_sum 0 #define ui_box_flags(...) (ui_box_flag_t){__VA_ARGS__} fn ui_id_t ui_id(s8_t string); fn ui_id_t ui_idf(char *str, ...); + +fn r2f32_t window_rect_from_frame(app_frame_t *frame); diff --git a/src/ui/ui.meta.c b/src/ui/ui.meta.c index 39a51e1..7dd9c0a 100644 --- a/src/ui/ui.meta.c +++ b/src/ui/ui.meta.c @@ -41,6 +41,7 @@ fn void mt_ui_stacks(ma_arena_t *arena, sb8_t *c, sb8_t *h) { { f32 required_size 0 x } { f32 padding 0 x } { f32 string_pos_offset 0 0 } + { r2f32_t rect 0 `window_rect_from_frame(ui->frame)` } { v4f32_t background_color 0 `ui_color_table[ui_color_rect]` } { v4f32_t bg_hot_color 0 `ui_color_table[ui_color_rect_hot]` } { v4f32_t bg_active_color 0 `ui_color_table[ui_color_rect_active]` } diff --git a/todo.txt b/todo.txt index c3aa758..bc1480d 100644 --- a/todo.txt +++ b/todo.txt @@ -22,6 +22,7 @@ [ ] maybe copy package stuff to build? [ ] ui + [ ] RECT STACK [ ] table [ ] vertical scroll [x] working @@ -56,7 +57,6 @@ [ ] draw image in box ui [ ] core - [x] safe cast [ ] ast [ ] move to core layer at some point as the abstract format for different types of serialization [ ] use bit fields instead of ast_flag @@ -79,3 +79,4 @@ [ ] s8_bin [x] hash table [x] intern table + [x] safe cast