hot reload working

This commit is contained in:
Krzosa Karol
2025-01-26 11:54:31 +01:00
parent 7831cc51d6
commit f98c8e3dfa
31 changed files with 415 additions and 219 deletions

View File

@@ -36,7 +36,7 @@ fn ui_caret_t ui_carets(i32 x) {
}
fn s8_t ui_tprint_loc(ui_code_loc_t loc) {
return s8_printf(tcx.temp, "%s(%d)", loc.file, loc.line);
return s8_printf(tcx->temp, "%s(%d)", loc.file, loc.line);
}
fn s8_t ui_get_display_string(s8_t string) {
@@ -59,6 +59,11 @@ fn ui_id_t ui_id_from_string(s8_t string) {
return result;
}
fn r2f32_t window_rect_from_frame(app_frame_t *frame) {
r2f32_t window_rect = r2f32(0, 0, frame->window_size.x, frame->window_size.y);
return window_rect;
}
fn u64 ui_hash_code_loc(ui_code_loc_t loc) {
u64 result = 4242843;
u64 file_hash = hash_data(s8_from_char(loc.file));
@@ -97,7 +102,7 @@ fn ui_id_t ui_id(s8_t string) {
}
fn ui_id_t ui_idf(char *str, ...) {
S8_FMT(tcx.temp, str, string);
S8_FMT(tcx->temp, str, string);
return ui_id(string);
}
@@ -189,7 +194,7 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, ui_box_flags_t flags, s
ui_id_t id = ui_id(string);
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);
v2f32_t string_size = rn_measure_string(rn->main_font, box->string);
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();
@@ -207,7 +212,7 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, ui_box_flags_t flags, s
#define ui_boxf(...) ui__boxf(UILOC, __VA_ARGS__)
fn ui_box_t *ui__boxf(ui_code_loc_t loc, ui_box_flags_t flags, char *str, ...) {
S8_FMT(tcx.temp, str, string);
S8_FMT(tcx->temp, str, string);
flags.dont_compute_rect = true;
ui_box_t *box = ui_build_box_from_string(loc, flags, string);
return box;
@@ -216,7 +221,7 @@ fn ui_box_t *ui__boxf(ui_code_loc_t loc, ui_box_flags_t flags, char *str, ...) {
#define ui_box0(...) ui_build_box_from_id(UILOC, __VA_ARGS__, ui_null_id)
#define ui_box0f(...) ui__box0f(UILOC, __VA_ARGS__)
fn ui_box_t *ui__box0f(ui_code_loc_t loc, ui_box_flags_t flags, char *str, ...) {
S8_FMT(tcx.temp, str, string);
S8_FMT(tcx->temp, str, string);
ui_box_t *box = ui_build_box_from_id(loc, flags, ui_null_id);
box->string = string;
return box;
@@ -270,7 +275,7 @@ fn ui_signal_t ui_signal_from_box(ui_box_t *box) {
}
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 = rn_measure_string(rn_state.main_font, string);
v2f32_t string_size = rn_measure_string(rn->main_font, string);
v2f32_t rect_size = r2f32_get_size(rect);
v2f32_t rect_string_diff = v2f32_sub(rect_size, string_size);
v2f32_t center_pos = v2f32_divs(rect_string_diff, 2);
@@ -309,16 +314,18 @@ fn ui_draw_compute_t ui_draw_compute(ui_box_t *box) {
f32 active_t = f32_ease_out_n(box->active_t, 50.f);
active_t = f32_clamp01(active_t);
co.background_color = v4f32_lerp(co.background_color, box->bg_active_color, 1.0);
co.text_color = v4f32_lerp(co.text_color, box->text_active_color, active_t);
// co.text_color = v4f32_lerp(co.text_color, box->text_active_color, active_t);
box->flags.draw_rect = true;
} else if (ui_is_hot_box(box)) {
f32 hot_t = f32_ease_out_n(box->hot_t, 3.f);
f32 hot_t = f32_ease_out_n(box->hot_t, 50.f);
hot_t = f32_clamp01(hot_t);
co.background_color = v4f32_lerp(co.background_color, box->bg_hot_color, hot_t);
co.text_color = v4f32_lerp(co.background_color, box->text_hot_color, hot_t);
} else if (ui_is_focused_box(box)) {
co.background_color = ui_color_table[ui_color_focused_rect_color];
// co.text_color = v4f32_lerp(co.background_color, box->text_hot_color, hot_t);
box->flags.draw_rect = true;
} else if (ui_is_focused_box(box)) {
co.background_color = ui_color_table[ui_color_focused_rect];
// co.text_color = v4f32_hsla_to_rgba((v4f32_t){0.1f, 0.6f, 0.7f, 1.0f});
box->flags.draw_rect = true;
}
return co;
@@ -332,15 +339,15 @@ fn void ui_text_input_draw(ui_box_t *box) {
ui_text_input_t *ti = box->text_input;
s8_t string = s8(ti->str, ti->len);
v2f32_t pos = ui_aligned_text_pos(box->string_pos_offset, box->text_align, co.rect, string);
rn_draw_string(rn_state.main_font, pos, co.text_color, string);
rn_draw_string(rn->main_font, pos, co.text_color, string);
ti->caret = ui_caret_clamp(ti->caret, 0, (i32)ti->len);
{
s8_t string_min = s8(ti->str, ti->caret.range.min);
s8_t string_max = s8(ti->str, ti->caret.range.max);
v2f32_t size_min = rn_measure_string(rn_state.main_font, string_min);
v2f32_t size_max = rn_measure_string(rn_state.main_font, string_max);
v2f32_t size_min = rn_measure_string(rn->main_font, string_min);
v2f32_t size_max = rn_measure_string(rn->main_font, string_max);
r2f32_t selection_rect = r2f32(co.rect.min.x + size_min.x, co.rect.min.y, co.rect.min.x + size_max.x, co.rect.min.y + ui_em(1));
rn_draw_rect(selection_rect, v4f32(1,1,1,0.5f));
@@ -363,7 +370,7 @@ fn void ui_default_draw_box(ui_box_t *box) {
}
if (box->flags.draw_text) {
v2f32_t text_pos = ui_aligned_text_pos(box->string_pos_offset, box->text_align, co.rect, box->string);
rn_draw_string(rn_state.main_font, text_pos, co.text_color, box->string);
rn_draw_string(rn->main_font, text_pos, co.text_color, box->string);
}
}
@@ -452,7 +459,7 @@ fn ui_signal_t ui_text_input(ui_code_loc_t loc, ui_text_input_t *ti) {
}
}
}
v2f32_t size = rn_measure_string(rn_state.main_font, s8_lit("_"));
v2f32_t size = rn_measure_string(rn->main_font, s8_lit("_"));
v2f32_t pos = v2f32_sub(ev->mouse_pos, box->final_rect.min);
i32 p = (i32)f32_round(pos.x / size.x);
if (ev->kind == app_event_kind_mouse_down && ev->mouse_button == app_mouse_button_left) {
@@ -468,7 +475,7 @@ fn ui_signal_t ui_text_input(ui_code_loc_t loc, ui_text_input_t *ti) {
#define ui_button(...) ui__button(UILOC, __VA_ARGS__)
fn ui_signal_t ui__button(ui_code_loc_t loc, char *str, ...) {
S8_FMT(tcx.temp, str, string);
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, .keyboard_nav = true }, string);
ui_signal_t signal = ui_signal_from_box(box);
return signal;
@@ -476,7 +483,7 @@ fn ui_signal_t ui__button(ui_code_loc_t loc, char *str, ...) {
#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);
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, .keyboard_nav = true }, string);
ui_signal_t signal = ui_signal_from_box(box);
if (signal.clicked) *value = value_clicked;
@@ -487,7 +494,7 @@ fn ui_signal_t ui__radio_button(ui_code_loc_t loc, i32 *value, i32 value_clicked
#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);
S8_FMT(tcx->temp, str, string);
ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_text = true, .keyboard_nav = true }, string);
ui_signal_t signal = ui_signal_from_box(box);
return signal;
@@ -495,7 +502,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);
S8_FMT(tcx->temp, str, string);
ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_text = true }, string);
return box;
}
@@ -503,14 +510,14 @@ fn ui_box_t *ui__label(ui_code_loc_t loc, char *str, ...) {
#define ui_expander(...) defer_if (ui_begin_expander(__VA_ARGS__).clicked, ui_end_expander())
#define ui_begin_expander(...) ui__begin_expander(UILOC, __VA_ARGS__)
fn ui_signal_t ui__begin_expander(ui_code_loc_t loc, char *str, ...) {
S8_FMT(tcx.temp, str, string);
S8_FMT(tcx->temp, str, string);
ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_text = true, .keyboard_nav = true }, string);
if (box->created_new) box->expanded = true;
ui_signal_t signal = ui_signal_from_box(box);
if (signal.clicked) box->expanded = !box->expanded;
signal.clicked = box->expanded;
if ( box->expanded) box->string = s8_printf(tcx.temp, "* %S", box->string);
if (!box->expanded) box->string = s8_printf(tcx.temp, "> %S", box->string);
if ( box->expanded) box->string = s8_printf(tcx->temp, "* %S", box->string);
if (!box->expanded) box->string = s8_printf(tcx->temp, "> %S", box->string);
if (box->expanded) {
ui_push_string_pos_offset(ui_top_string_pos_offset() + ui_em(0.5f));
ui_push_id(box->id);
@@ -663,7 +670,8 @@ fn void ui_draw(void) {
ui__draw_box(ui->frame, &ui->root);
}
fn void ui_begin_frame(app_frame_t *frame) {
fn void ui_begin_frame(ui_t *ui_context, app_frame_t *frame) {
ui = ui_context;
ui->frame = frame;
}
@@ -886,24 +894,24 @@ fn void ui_serial_subtype(void *p, type_t *type, s8_t name) {
fn void ui_serial_type(void *p, type_t *type) {
ui_serial_subtype(p, type, type->name);
}
//
fn void ui_demo_init(ma_arena_t *arena) {
ui = ma_push_type(arena, ui_t);
tcx->data[1] = ma_push_type(arena, ui_t);
ui = tcx->data[1];
ui->box_arena = ma_push_arena(arena, mib(1));
ui_init_colors();
}
gb i32 ui_g_panel = 1;
gb app_event_t ui_test_event;
fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_count) {
ui_begin_frame(frame);
ui_begin_frame(tcx->data[1], frame);
rn_begin_frame(tcx->data[0], frame);
for (app_event_t *ev = frame->first_event; ev; ev = ev->next) {
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_padding(ui_em(3))
ui_set_text_align(ui_text_align_center)
ui_set_lop(ui_lop_cut_left)
@@ -950,20 +958,20 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
ui_signal_t signal = ui_label_button("%S: %f##slider%S", tweak->name, *n, tweak->name);
if (signal.dragging) {
f32 size = tweak->max - tweak->min;
v2f32_t string_size = rn_measure_string(rn_state.main_font, signal.box->string);
v2f32_t string_size = rn_measure_string(rn->main_font, signal.box->string);
f32 delta = (signal.drag.x / string_size.x) * size;
*n = CLAMP(*n + delta, tweak->min, tweak->max);
}
} else_is_invalid;
}
ui_label("allocated boxes: %d", ui->allocated_boxes);
ui_serial_type(&ui_test_event, type(app_event_t));
// ui_serial_type(&ui_test_event, type(app_event_t));
}
locl f32 scroller_value;
defer_block(ui_push_top(scroller_box), ui_pop_top()) {
f32 item_count = (f32)item_box->node_count;
f32 all_items_size = item_count * rn_state.main_font->size;
f32 all_items_size = item_count * rn->main_font->size;
f32 item_box_size = r2f32_get_size(ui->top->full_rect).y;
f32 scroller_box_size = r2f32_get_size(scroller_box->full_rect).y;
f32 scroller_size = CLAMP(item_box_size / (all_items_size + frame->window_size.y), 0, 1.0f);
@@ -974,7 +982,9 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
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 = v4f32(1,0,1,1);
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);
if (signal.dragging) {
@@ -997,7 +1007,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
ui_end_build();
}
rn_begin(frame, white_color);
rn_begin(white_color);
ui_draw();
rn_end();