refactor padding, required size. Working on colors

This commit is contained in:
Krzosa Karol
2025-01-23 09:25:41 +01:00
parent 057d6b6f50
commit 157baab5b9
7 changed files with 134 additions and 68 deletions

View File

@@ -92,6 +92,18 @@ fn void ui_push_box(ui_box_t *parent, ui_box_t *box) {
parent->node_count += 1;
}
fn ui_axis2_t ui_axis_from_lop(ui_lop_t op) {
switch (op) {
case ui_lop_cut_top: return ui_axis2_y; break;
case ui_lop_cut_bottom: return ui_axis2_y; break;
case ui_lop_cut_left: return ui_axis2_x; break;
case ui_lop_cut_right: return ui_axis2_x; break;
case ui_lop_idle: return ui_axis2_invalid; break;
default_is_invalid;
}
return ui_axis2_invalid;
}
fn r2f32_t ui_next_rect(ui_lop_t op, r2f32_t *rect, v2f32_t required_size) {
switch (op) {
case ui_lop_cut_top: return r2f32_cut_top_no_squash(rect, required_size.y); break;
@@ -127,9 +139,7 @@ fn ui_box_t *ui_build_box_from_id(ui_code_loc_t loc, ui_box_flags_t flags, ui_id
box->flags = flags;
box->text_align = ui_top_text_align();
box->border_thickness = ui_top_border_thickness();
box->background_color = ui_top_background_color();
box->text_color = ui_top_text_color();
box->border_color = ui_top_border_color();
ui_box_fill_with_colors(box);
ui_push_box(ui->top, box);
return box;
}
@@ -139,10 +149,13 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, ui_box_flags_t flags, s
ui_box_t *box = ui_build_box_from_id(loc, flags, id);
box->string = ui_get_display_string(string);
v2f32_t string_size = rn_measure_string(rn_state.main_font, box->string);
// @todo: this is un0intuitive
if (ui->required_width_stack) string_size.x = ui->required_width_stack->value;
if (ui->required_height_stack) string_size.y = ui->required_height_stack->value;
if (ui->padding_stack) string_size = v2f32_add(string_size, ui->padding_stack->value);
ui_axis2_t axis = ui_axis_from_lop(ui_top_lop());
if (ui->required_size_stack && (axis == ui_axis2_x || axis == ui_axis2_y)) {
string_size.e[axis] = ui_top_required_size();
}
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->lop_stack->value, &ui->top->rect, string_size);
ui_set_rect(box, rect);
return box;
@@ -205,7 +218,8 @@ fn ui_signal_t ui__radio_button(ui_code_loc_t loc, i32 *value, i32 value_clicked
ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_border = true, .draw_rect = true, .draw_text = true }, string);
ui_signal_t signal = ui_signal_from_box(box);
if (signal.clicked) *value = value_clicked;
if (*value == value_clicked) box->background_color = ui_top_radio_color();
// @todo?
if (*value == value_clicked) box->background_color = ui_top_bg_active_color();
return signal;
}
@@ -294,18 +308,15 @@ fn void ui__draw_box(app_frame_t *frame, ui_box_t *box) {
v4f32_t border_color = box->border_color;
if (ui_is_active_box(box)) {
f32 active_t = f32_clamp01(f32_ease_out_n(box->active_t, 50.f));
// background_color = v4f32_lerp(background_color, v4f32(1,1,1,1), 1.0);
text_color = v4f32_lerp(text_color, v4f32(1,1,1,1), active_t);
f32 active_t = f32_ease_out_n(box->active_t, 50.f);
active_t = f32_clamp01(active_t);
background_color = v4f32_lerp(background_color, box->bg_active_color, 1.0);
text_color = v4f32_lerp(text_color, box->text_active_color, active_t);
} else if (ui_is_hot_box(box)) {
f32 hot_t = f32_ease_out_n(box->hot_t, 25.f);
v4f32_t hsla_rect = v4f32_rgba_to_hsla(background_color);
hsla_rect.s = f32_lerp(hsla_rect.s, 1.0f, hot_t);
background_color = v4f32_hsla_to_rgba(hsla_rect);
v4f32_t hsla_text = v4f32_rgba_to_hsla(text_color);
hsla_text = v4f32_lerp(hsla_text, v4f32(0.2f, 0.3f, 0.3f, 1.0f), hot_t);
text_color = v4f32_hsla_to_rgba(hsla_text);
f32 hot_t = f32_ease_out_n(box->hot_t, 3.f);
hot_t = f32_clamp01(hot_t);
background_color = v4f32_lerp(background_color, box->bg_hot_color, hot_t);
text_color = v4f32_lerp(background_color, box->text_hot_color, hot_t);
}
@@ -583,7 +594,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
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_set_padding(v2f32(ui_em(3), 0))
ui_set_padding(ui_em(3))
ui_set_text_align(ui_text_align_center)
ui_set_lop(ui_lop_cut_left)
ui_set_top(top_box) {