radio button and tab switcher
This commit is contained in:
29
src/ui/ui.c
29
src/ui/ui.c
@@ -127,6 +127,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->text_align_stack->value;
|
||||
box->border_thickness = ui->border_thickness_stack->value;
|
||||
if (ui->background_color_stack) box->background_color = ui->background_color_stack->value;
|
||||
ui_push_box(ui->top, box);
|
||||
return box;
|
||||
}
|
||||
@@ -197,6 +198,16 @@ fn ui_signal_t ui__button(ui_code_loc_t loc, char *str, ...) {
|
||||
return signal;
|
||||
}
|
||||
|
||||
#define ui_radio_button(...) ui__radio_button(UILOC, __VA_ARGS__)
|
||||
fn ui_signal_t ui__radio_button(ui_code_loc_t loc, i32 *value, i32 value_clicked, char *str, ...) {
|
||||
S8_FMT(tcx.temp, str, string);
|
||||
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 = accent1_color_global;
|
||||
return signal;
|
||||
}
|
||||
|
||||
#define ui_label_button(...) ui__label_button(UILOC, __VA_ARGS__)
|
||||
fn ui_signal_t ui__label_button(ui_code_loc_t loc, char *str, ...) {
|
||||
S8_FMT(tcx.temp, str, string);
|
||||
@@ -288,6 +299,7 @@ fn void ui__draw_box(app_frame_t *frame, ui_box_t *box) {
|
||||
r2f32_t rect = box->final_rect;
|
||||
|
||||
v4f32_t rect_color = primary_color_global;
|
||||
if (!v4f32_is_null(box->background_color)) rect_color = box->background_color;
|
||||
v4f32_t text_color = black_color_global;
|
||||
if (ui_is_hot_box(box)) {
|
||||
rect_color = secondary_color_global;
|
||||
@@ -547,14 +559,28 @@ fn void ui_demo_init(ma_arena_t *arena) {
|
||||
ui->box_arena = ma_push_arena(arena, mib(1));
|
||||
}
|
||||
|
||||
gb i32 ui_g_panel = 1;
|
||||
gb app_event_t ui_test_event;
|
||||
fn void ui_demo_update(app_frame_t *frame) {
|
||||
ui_begin_frame(frame);
|
||||
for (app_event_t *ev = frame->first_event; ev; ev = ev->next) {
|
||||
ui_begin_build(UILOC, ev, window_rect_from_frame(frame));
|
||||
|
||||
ui->top->rect = r2f32_shrinks(ui->top->rect, 200);
|
||||
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)));
|
||||
|
||||
ui_set_padding(v2f32(50, 0))
|
||||
ui_set_text_align(ui_text_align_center)
|
||||
ui_set_lop(ui_lop_cut_left)
|
||||
ui_set_top(top_box) {
|
||||
ui_radio_button(&ui_g_panel, 1, "1");
|
||||
ui_radio_button(&ui_g_panel, 2, "2");
|
||||
}
|
||||
|
||||
ui->top->rect = r2f32_shrinks(ui->top->rect, 100);
|
||||
|
||||
|
||||
if (ui_g_panel == 1) {
|
||||
ui_box_t *scroller_box = ui_box0((ui_box_flags_t){.draw_rect = true, .clip_rect = true});
|
||||
ui_set_rect(scroller_box, r2f32_cut_right(&ui->top->rect, ui_em(0.5f)));
|
||||
|
||||
@@ -632,6 +658,7 @@ fn void ui_demo_update(app_frame_t *frame) {
|
||||
ui_offset_box(it, v2f32(0, scroller_value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ui_end_build();
|
||||
}
|
||||
|
||||
@@ -20,6 +20,9 @@ fn void ui_pop_required_height(void) { SLLS_POP(ui->required_height_stack); }
|
||||
fn void ui_push_padding(v2f32_t v) { ui_v2f32_node_t *n = ma_push_type(tcx.temp, ui_v2f32_node_t); n->value = v; SLLS_PUSH(ui->padding_stack, n); }
|
||||
fn void ui_pop_padding(void) { SLLS_POP(ui->padding_stack); }
|
||||
#define ui_set_padding(x) defer_block(ui_push_padding(x), ui_pop_padding())
|
||||
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); }
|
||||
#define ui_set_background_color(x) defer_block(ui_push_background_color(x), ui_pop_background_color())
|
||||
fn void ui_assert_stacks_are_null(void) {
|
||||
assert(ui->id_stack == NULL);
|
||||
assert(ui->lop_stack == NULL);
|
||||
@@ -28,4 +31,5 @@ assert(ui->text_align_stack == NULL);
|
||||
assert(ui->required_width_stack == NULL);
|
||||
assert(ui->required_height_stack == NULL);
|
||||
assert(ui->padding_stack == NULL);
|
||||
assert(ui->background_color_stack == NULL);
|
||||
}
|
||||
@@ -4,6 +4,7 @@ typedef struct ui_lop_node_t ui_lop_node_t; struct ui_lop_node_t { ui_lop_t valu
|
||||
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_v2f32_node_t ui_v2f32_node_t; struct ui_v2f32_node_t { v2f32_t value; ui_v2f32_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;\
|
||||
@@ -11,6 +12,7 @@ ui_text_align_t text_align;\
|
||||
f32 required_width;\
|
||||
f32 required_height;\
|
||||
v2f32_t padding;\
|
||||
v4f32_t background_color;\
|
||||
|
||||
#define UI_DECL_STACKS \
|
||||
ui_id_node_t *id_stack;\
|
||||
@@ -20,3 +22,4 @@ ui_text_align_node_t *text_align_stack;\
|
||||
ui_f32_node_t *required_width_stack;\
|
||||
ui_f32_node_t *required_height_stack;\
|
||||
ui_v2f32_node_t *padding_stack;\
|
||||
ui_v4f32_node_t *background_color_stack;\
|
||||
|
||||
@@ -17,6 +17,7 @@ void mt_ui(ma_arena_t *arena) {
|
||||
{s8_lit("f32") , s8_lit("required_width")} ,
|
||||
{s8_lit("f32") , s8_lit("required_height")} ,
|
||||
{s8_lit("v2f32_t") , s8_lit("padding")} ,
|
||||
{s8_lit("v4f32_t") , s8_lit("background_color")} ,
|
||||
};
|
||||
|
||||
///////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user