ui_tree_table

This commit is contained in:
Krzosa Karol
2025-01-30 09:54:18 +01:00
parent 491f60b59e
commit be2537b73c
10 changed files with 112 additions and 38 deletions

View File

@@ -336,11 +336,13 @@ fn void w32_try_reloading_library(w32_library_t *lib, app_frame_t frame) {
s8_t base_name = s8_chop_last_period(lib->dll_name); s8_t base_name = s8_chop_last_period(lib->dll_name);
s8_t new_dll_name = s8_printf(tcx->temp, "%S_temp_%u.dll", base_name, random_value); s8_t new_dll_name = s8_printf(tcx->temp, "%S_temp_%u.dll", base_name, random_value);
os_copy(lib->dll_name, new_dll_name, true); b32 ok = os_copy(lib->dll_name, new_dll_name, true);
if (!ok) debugf("failed to copy from %S to %S", lib->dll_name, new_dll_name);
s8_t pdb_name = s8_printf(tcx->temp, "%S.pdb", base_name); s8_t pdb_name = s8_printf(tcx->temp, "%S.pdb", base_name);
s8_t new_pdb_name = s8_printf(tcx->temp, "%S_temp_%u.pdb", base_name, random_value); s8_t new_pdb_name = s8_printf(tcx->temp, "%S_temp_%u.pdb", base_name, random_value);
os_copy(pdb_name, new_pdb_name, true); ok = os_copy(pdb_name, new_pdb_name, true);
if (!ok) debugf("failed to copy from %S to %S", pdb_name, new_pdb_name);
HMODULE library = LoadLibraryA(new_dll_name.str); HMODULE library = LoadLibraryA(new_dll_name.str);
if (!library) { if (!library) {

View File

@@ -18,9 +18,10 @@ fn b32 os_vmem_decommit(void *p, usize size) {
} }
fn void os_error_box(char *str) { fn void os_error_box(char *str) {
MessageBoxA(NULL, str, "fatal error", MB_OK); OutputDebugStringA(str);
fprintf(stderr, "%s", str); fprintf(stderr, "%s", str);
fflush(stderr); fflush(stderr);
MessageBoxA(NULL, str, "fatal error", MB_OK);
} }
fn void os_console_log(char *str) { fn void os_console_log(char *str) {

View File

@@ -15,6 +15,7 @@ struct rn_font_t {
u32 first_char, last_char; u32 first_char, last_char;
u32 texture_id; u32 texture_id;
f32 computed_xchar_size;
f32 size; f32 size;
f32 descent; f32 descent;
f32 ascent; f32 ascent;

View File

@@ -50,6 +50,8 @@ fn void rn_reload_font(f32 font_size, f32 dpr) {
glTextureStorage2D(atlas->texture_id, 1, GL_R8, (GLsizei)atlas->size.x, (GLsizei)atlas->size.y); glTextureStorage2D(atlas->texture_id, 1, GL_R8, (GLsizei)atlas->size.x, (GLsizei)atlas->size.y);
glTextureSubImage2D(atlas->texture_id, 0, 0, 0, (GLsizei)atlas->size.x, (GLsizei)atlas->size.y, GL_RED, GL_UNSIGNED_BYTE, atlas->bitmap); glTextureSubImage2D(atlas->texture_id, 0, 0, 0, (GLsizei)atlas->size.x, (GLsizei)atlas->size.y, GL_RED, GL_UNSIGNED_BYTE, atlas->bitmap);
rn->main_font->texture_id = atlas->texture_id; rn->main_font->texture_id = atlas->texture_id;
rn->main_font->computed_xchar_size = rn_measure_string(rn->main_font, s8_lit("_")).x;
ma_end_scratch(scratch); ma_end_scratch(scratch);
} }

View File

@@ -109,6 +109,17 @@ 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_id_string(s8_t string) { ui_push_id(ui_id(string)); }
#define ui_set_top_ex(x) defer_block(ui_push_top_ex(x), ui_pop_top_ex())
fn void ui_push_top_ex(ui_box_t *box) {
assert(ui->top == ui->top);
ui->top = box;
}
fn ui_box_t *ui_pop_top_ex(void) {
ui_box_t *result = ui->top;
ui->top = ui->top->parent;
return result;
}
#define ui_set_top(x) defer_block(ui_push_top(x), ui_pop_top()) #define ui_set_top(x) defer_block(ui_push_top(x), ui_pop_top())
fn void ui_push_top(ui_box_t *new_top) { fn void ui_push_top(ui_box_t *new_top) {
assert(new_top->parent == ui->top); assert(new_top->parent == ui->top);
@@ -116,10 +127,12 @@ fn void ui_push_top(ui_box_t *new_top) {
ui_push_id(new_top->id); ui_push_id(new_top->id);
ui_push_rect(new_top->rect); ui_push_rect(new_top->rect);
} }
fn void ui_pop_top(void) { fn ui_box_t *ui_pop_top(void) {
ui_box_t *result = ui->top;
ui->top = ui->top->parent; ui->top = ui->top->parent;
ui_pop_id(); ui_pop_id();
ui_pop_rect(); ui_pop_rect();
return result;
} }
fn r2f32_t *ui_top_rectp(void) { fn r2f32_t *ui_top_rectp(void) {
@@ -132,15 +145,27 @@ fn void ui_set_children_sums(ui_box_t *box) {
} }
if (box->flags.children_sum_x) { if (box->flags.children_sum_x) {
f32 min = MIN(box->first->rect.min.x, box->last->rect.min.x); f32 min = box->rect.min.x;
f32 max = MAX(box->first->rect.max.x, box->last->rect.max.x); f32 max = box->rect.max.x;
if (box->first) {
f32 min_child = MIN(box->first->rect.min.x, box->last->rect.min.x);
f32 max_child = MAX(box->first->rect.max.x, box->last->rect.max.x);
min = MIN(box->rect.min.x, min_child);
max = MAX(box->rect.max.x, max_child);
}
box->rect.min.x = min; box->rect.min.x = min;
box->rect.max.x = max; box->rect.max.x = max;
} }
if (box->flags.children_sum_y) { if (box->flags.children_sum_y) {
f32 min = MIN(box->first->rect.min.y, box->last->rect.min.y); f32 min = box->rect.min.y;
f32 max = MAX(box->first->rect.max.y, box->last->rect.max.y); f32 max = box->rect.max.y;
if (box->first) {
f32 min_child = MIN(box->first->rect.min.y, box->last->rect.min.y);
f32 max_child = MAX(box->first->rect.max.y, box->last->rect.max.y);
min = MIN(box->rect.min.y, min_child);
max = MAX(box->rect.max.y, max_child);
}
box->rect.min.y = min; box->rect.min.y = min;
box->rect.max.y = max; box->rect.max.y = max;
} }
@@ -239,6 +264,19 @@ fn ui_box_t *ui_build_box_from_id(ui_code_loc_t loc, ui_box_flags_t flags, ui_id
box->text_align = ui_top_text_align(); box->text_align = ui_top_text_align();
box->border_thickness = ui_top_border_thickness(); box->border_thickness = ui_top_border_thickness();
box->string_pos_offset = ui_top_string_pos_offset(); box->string_pos_offset = ui_top_string_pos_offset();
// :ui_box_flags_t
ui_box_flags_t top_flags = ui_top_flags();
{
if(top_flags.draw_rect) box->flags.draw_rect = true;
if(top_flags.draw_border) box->flags.draw_border = true;
if(top_flags.draw_text) box->flags.draw_text = true;
if(top_flags.clip_rect) box->flags.clip_rect = true;
if(top_flags.children_sum_x) box->flags.children_sum_x = true;
if(top_flags.children_sum_y) box->flags.children_sum_y = true;
if(top_flags.keyboard_nav) box->flags.keyboard_nav = true;
}
ui_box_fill_with_colors(box); ui_box_fill_with_colors(box);
ui_push_box(ui->top, box); ui_push_box(ui->top, box);
return box; return box;
@@ -272,10 +310,12 @@ fn ui_box_t *ui__make_box(ui_box_params_t params) {
ui_id_t id = params.id; ui_id_t id = params.id;
if (ui_id_is_null(id) && params.null_id == false) { if (ui_id_is_null(id) && params.null_id == false) {
if (params.string.len != 0) { if (params.string.len != 0) {
id = ui_id(params.string); id = ui_id(ui_get_hash_string(params.string));
id.value = hash_mix(id.value, ui_hash_from_stack());
} }
if (ui_id_is_null(id)) { if (ui_id_is_null(id)) {
id = ui_id_from_loc(params.loc); id = ui_id_from_loc(params.loc);
id.value = hash_mix(id.value, ui_hash_from_stack());
} }
} }
ui_box_t *box = ui_build_box_from_id(params.loc, params.flags, id); ui_box_t *box = ui_build_box_from_id(params.loc, params.flags, id);
@@ -576,28 +616,44 @@ fn ui_box_t *ui__label(ui_code_loc_t loc, char *str, ...) {
return box; return box;
} }
#define ui_expander(...) defer_if (ui_begin_expander(__VA_ARGS__).clicked, ui_end_expander()) #define ui_tree_table() defer_block(ui_tree_table_begin(UILOC), ui_tree_table_end())
#define ui_begin_expander(...) ui__begin_expander(UILOC, __VA_ARGS__) fn void ui_tree_table_begin(ui_code_loc_t loc) {
fn ui_signal_t ui__begin_expander(ui_code_loc_t loc, char *str, ...) { ui_box_t *box = ui_box(.loc = loc, .rect = ui_next_rect(ui_top_lop(), ui_top_rectp(), v2f32_null), .flags = { .draw_border = true, .children_sum_y = true });
S8_FMT(tcx->temp, str, string); ui_push_top(box);
ui_box_t *box = ui_box(.loc = loc, .string = string, .flags = { .draw_text = true, .keyboard_nav = true });
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) {
ui_push_string_pos_offset(ui_top_string_pos_offset() + ui_em(0.5f));
ui_push_id(box->id);
}
return signal;
} }
fn void ui_end_expander(void) { fn void ui_tree_table_end(void) {
ui_pop_string_pos_offset(); ui_box_t *box = ui_pop_top();
ui_set_children_sums(box);
ui_next_rect(ui_top_lop(), ui_top_rectp(), r2f32_get_size(box->rect));
}
#define ui_tree_table_expandable(...) defer_if (ui_tree_table_push_expandable(UILOC, __VA_ARGS__).clicked, ui_tree_table_pop_expandable())
fn void ui_tree_table_pop_expandable(void) {
r2f32_add_left(ui_top_rectp(), ui_dm(1));
ui_tree_table_end();
ui_pop_id(); ui_pop_id();
} }
fn ui_signal_t ui_tree_table_push_expandable(ui_code_loc_t loc, char *str, ...) {
S8_FMT(tcx->temp, str, string);
ui_id_t id = ui_id(ui_get_hash_string(string));
ui_push_id(id);
ui_tree_table_begin(loc);
ui_box_t *box = ui_box(.loc = loc, .string = string, .flags = { .draw_rect = true, .draw_text = true, .keyboard_nav = true});
ui_signal_t button = ui_signal_from_box(box);
if (button.box->created_new) button.box->expanded = true;
if (button.clicked) button.box->expanded = !button.box->expanded;
button.clicked = button.box->expanded;
r2f32_cut_left(ui_top_rectp(), ui_dm(1));
if (button.clicked == false) {
ui_tree_table_pop_expandable();
}
if ( button.box->expanded) button.box->string = s8_printf(tcx->temp, "* %S", button.box->string);
if (!button.box->expanded) button.box->string = s8_printf(tcx->temp, "> %S", button.box->string);
return button;
}
fn ui_box_t *ui_get_prev_box(ui_box_t *box, b32 (*match)(ui_box_t *)) { fn ui_box_t *ui_get_prev_box(ui_box_t *box, b32 (*match)(ui_box_t *)) {
for (ui_box_t *it = box; it;) { for (ui_box_t *it = box; it;) {
@@ -917,7 +973,7 @@ fn void ui_serial_subtype(void *p, type_t *type, s8_t name) {
} }
if (type->kind == type_kind_array) { if (type->kind == type_kind_array) {
ui_expander("%S:", name) { ui_tree_table_expandable("%S:", name) {
for (i32 i = 0; i < type->count; i += 1) { for (i32 i = 0; i < type->count; i += 1) {
ma_temp_t scratch = ma_begin_scratch(); ma_temp_t scratch = ma_begin_scratch();
s8_t index_name = s8_printf(scratch.arena, "[%d]", i); s8_t index_name = s8_printf(scratch.arena, "[%d]", i);
@@ -930,7 +986,7 @@ fn void ui_serial_subtype(void *p, type_t *type, s8_t name) {
} }
if (type->kind == type_kind_struct) { if (type->kind == type_kind_struct) {
ui_expander("%S:", name) { ui_tree_table_expandable("%S:", name) {
for (i32 i = 0; i < type->count; i += 1) { for (i32 i = 0; i < type->count; i += 1) {
type_member_t *tm = type->members + i; type_member_t *tm = type->members + i;
void *tmp = ti_extract_member(p, tm); void *tmp = ti_extract_member(p, tm);
@@ -943,8 +999,8 @@ fn void ui_serial_subtype(void *p, type_t *type, s8_t name) {
} }
} }
fn void ui_serial_type(void *p, type_t *type) { fn void ui_serial_type(ui_code_loc_t loc, void *p, type_t *type) {
ui_serial_subtype(p, type, type->name); ui_set_id(ui_id_from_loc(loc)) ui_serial_subtype(p, type, type->name);
} }
fn void ui_reload(void) { fn void ui_reload(void) {
@@ -1064,10 +1120,8 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
} else_is_invalid; } else_is_invalid;
} }
ui_label("allocated boxes: %d", ui->allocated_boxes); ui_label("allocated boxes: %d", ui->allocated_boxes);
ui_serial_type(&ui_test_event, type(app_event_t)); ui_serial_type(UILOC, &ui_test_event, type(app_event_t));
ui_set_id(ui_id_from_loc(UILOC)) { ui_serial_type(UILOC, &ui_test_event, type(app_event_t));
ui_serial_type(&ui_test_event, type(app_event_t));
}
} }
locl f32 scroller_value; locl f32 scroller_value;
@@ -1419,7 +1473,6 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co
ui_label_button("a"); ui_label_button("a");
ui_label_button("memes"); ui_label_button("memes");
} }
} }

View File

@@ -78,6 +78,10 @@ fn void ui_push_rect(r2f32_t v) { ui_r2f32_node_t *n = ma_push_type(tcx->temp, u
fn void ui_pop_rect(void) { SLLS_POP(ui->rect_stack); } fn void ui_pop_rect(void) { SLLS_POP(ui->rect_stack); }
fn r2f32_t ui_top_rect(void) { return ui->rect_stack->value; } 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()) #define ui_set_rect(x) defer_block(ui_push_rect(x), ui_pop_rect())
fn void ui_push_flags(ui_box_flags_t v) { ui_box_flags_node_t *n = ma_push_type(tcx->temp, ui_box_flags_node_t); n->value = v; SLLS_PUSH(ui->flags_stack, n); }
fn void ui_pop_flags(void) { SLLS_POP(ui->flags_stack); }
fn ui_box_flags_t ui_top_flags(void) { return ui->flags_stack->value; }
#define ui_set_flags(x) defer_block(ui_push_flags(x), ui_pop_flags())
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_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 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; } fn v4f32_t ui_top_background_color(void) { return ui->background_color_stack->value; }
@@ -116,6 +120,7 @@ assert(ui->required_size_stack == NULL);
assert(ui->padding_stack == NULL); assert(ui->padding_stack == NULL);
assert(ui->string_pos_offset_stack == NULL); assert(ui->string_pos_offset_stack == NULL);
assert(ui->rect_stack == NULL); assert(ui->rect_stack == NULL);
assert(ui->flags_stack == NULL);
assert(ui->background_color_stack == NULL); assert(ui->background_color_stack == NULL);
assert(ui->bg_hot_color_stack == NULL); assert(ui->bg_hot_color_stack == NULL);
assert(ui->bg_active_color_stack == NULL); assert(ui->bg_active_color_stack == NULL);
@@ -131,6 +136,7 @@ ui_push_border_thickness(1.0f);
ui_push_text_align(ui_text_align_left); ui_push_text_align(ui_text_align_left);
ui_push_string_pos_offset(0); ui_push_string_pos_offset(0);
ui_push_rect(window_rect_from_frame(ui->frame)); ui_push_rect(window_rect_from_frame(ui->frame));
ui_push_flags((ui_box_flags_t){0});
ui_push_background_color(ui_color_table[ui_color_rect]); 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_hot_color(ui_color_table[ui_color_rect_hot]);
ui_push_bg_active_color(ui_color_table[ui_color_rect_active]); ui_push_bg_active_color(ui_color_table[ui_color_rect_active]);
@@ -146,6 +152,7 @@ ui_pop_border_thickness();
ui_pop_text_align(); ui_pop_text_align();
ui_pop_string_pos_offset(); ui_pop_string_pos_offset();
ui_pop_rect(); ui_pop_rect();
ui_pop_flags();
ui_pop_background_color(); ui_pop_background_color();
ui_pop_bg_hot_color(); ui_pop_bg_hot_color();
ui_pop_bg_active_color(); ui_pop_bg_active_color();

View File

@@ -20,6 +20,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_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_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_r2f32_node_t ui_r2f32_node_t; struct ui_r2f32_node_t { r2f32_t value; ui_r2f32_node_t *next; };
typedef struct ui_box_flags_node_t ui_box_flags_node_t; struct ui_box_flags_node_t { ui_box_flags_t value; ui_box_flags_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; }; 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 \ #define UI_DECL_BOX_MEMBERS \
f32 border_thickness;\ f32 border_thickness;\
@@ -28,6 +29,7 @@ f32 required_size;\
f32 padding;\ f32 padding;\
f32 string_pos_offset;\ f32 string_pos_offset;\
r2f32_t rect;\ r2f32_t rect;\
ui_box_flags_t flags;\
v4f32_t background_color;\ v4f32_t background_color;\
v4f32_t bg_hot_color;\ v4f32_t bg_hot_color;\
v4f32_t bg_active_color;\ v4f32_t bg_active_color;\
@@ -45,6 +47,7 @@ ui_f32_node_t *required_size_stack;\
ui_f32_node_t *padding_stack;\ ui_f32_node_t *padding_stack;\
ui_f32_node_t *string_pos_offset_stack;\ ui_f32_node_t *string_pos_offset_stack;\
ui_r2f32_node_t *rect_stack;\ ui_r2f32_node_t *rect_stack;\
ui_box_flags_node_t *flags_stack;\
ui_v4f32_node_t *background_color_stack;\ ui_v4f32_node_t *background_color_stack;\
ui_v4f32_node_t *bg_hot_color_stack;\ ui_v4f32_node_t *bg_hot_color_stack;\
ui_v4f32_node_t *bg_active_color_stack;\ ui_v4f32_node_t *bg_active_color_stack;\

View File

@@ -12,6 +12,7 @@ struct ui_id_t {
typedef struct ui_box_flags_t ui_box_flags_t; typedef struct ui_box_flags_t ui_box_flags_t;
struct ui_box_flags_t { struct ui_box_flags_t {
// :ui_box_flags_t - change those places when modifying this
b8 draw_rect: 1; b8 draw_rect: 1;
b8 draw_border: 1; b8 draw_border: 1;
b8 draw_text: 1; b8 draw_text: 1;
@@ -79,7 +80,6 @@ struct ui_box_t {
s8_t string; s8_t string;
v2f32_t string_size; v2f32_t string_size;
ui_box_flags_t flags;
b8 created_new; b8 created_new;
ui_custom_draw_t *custom_draw; ui_custom_draw_t *custom_draw;
ui_lop_t lop; ui_lop_t lop;
@@ -160,6 +160,7 @@ fn b32 ui_is_focused_box(ui_box_t *box) { return !ui_is_null_box(box) && box->id
#define UILOC (ui_code_loc_t){.file = __FILE__, .line = __LINE__, .counter = __COUNTER__} #define UILOC (ui_code_loc_t){.file = __FILE__, .line = __LINE__, .counter = __COUNTER__}
#define ui_em(x) ((x) * rn->main_font->size) #define ui_em(x) ((x) * rn->main_font->size)
#define ui_dm(V) ((V) * rn->main_font->computed_xchar_size)
#define ui_max 200000000.f #define ui_max 200000000.f
#define ui_children_sum 0 #define ui_children_sum 0
#define ui_box_flags(...) (ui_box_flag_t){__VA_ARGS__} #define ui_box_flags(...) (ui_box_flag_t){__VA_ARGS__}

View File

@@ -42,6 +42,7 @@ fn void mt_ui_stacks(ma_arena_t *arena, sb8_t *c, sb8_t *h) {
{ f32 padding 0 x } { f32 padding 0 x }
{ f32 string_pos_offset 0 0 } { f32 string_pos_offset 0 0 }
{ r2f32_t rect 0 `window_rect_from_frame(ui->frame)` } { r2f32_t rect 0 `window_rect_from_frame(ui->frame)` }
{ ui_box_flags_t flags 0 `(ui_box_flags_t){0}` }
{ v4f32_t background_color 0 `ui_color_table[ui_color_rect]` } { 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_hot_color 0 `ui_color_table[ui_color_rect_hot]` }
{ v4f32_t bg_active_color 0 `ui_color_table[ui_color_rect_active]` } { v4f32_t bg_active_color 0 `ui_color_table[ui_color_rect_active]` }

View File

@@ -10,6 +10,7 @@
[ ] drag and drop [ ] drag and drop
[ ] open file dialog [ ] open file dialog
[ ] os [ ] os
[ ] DELETE ALL PDBS\DLLS ON START
[?] wasm (explore) [?] wasm (explore)
[ ] win32 [ ] win32
[ ] linux [ ] linux
@@ -22,7 +23,8 @@
[ ] maybe copy package stuff to build? [ ] maybe copy package stuff to build?
[ ] ui [ ] ui
[ ] RECT STACK [ ] jumping between nodes (get_prev, get_next) needs a fix
[ ] bring back also the old expander?
[ ] table [ ] table
[ ] vertical scroll [ ] vertical scroll
[x] working [x] working
@@ -55,6 +57,7 @@
[ ] color picker [ ] color picker
[ ] slider [ ] slider
[ ] draw image in box ui [ ] draw image in box ui
[x] rect stack
[ ] core [ ] core
[ ] ast [ ] ast