From e806637b10c32d5a525d4369f9bc55d1916a3de1 Mon Sep 17 00:00:00 2001 From: Patrick Cleavelin Date: Sat, 16 Mar 2024 17:56:00 -0500 Subject: [PATCH] create elements? --- src/ed_array.h | 1 - src/ui.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/ed_array.h b/src/ed_array.h index 40ddd27..dac74d2 100644 --- a/src/ed_array.h +++ b/src/ed_array.h @@ -23,7 +23,6 @@ void T ## PushArray(array(T) *arr, T value) {\ arr->data[arr->size] = value;\ arr->size += 1;\ } else {\ - // TODO: resize array fprintf(stderr, "failed to push to u8 array, size+num > capacity\n");\ }\ }; diff --git a/src/ui.h b/src/ui.h index 48a0220..bef6861 100644 --- a/src/ui.h +++ b/src/ui.h @@ -3,6 +3,8 @@ #ifndef ED_UI_INCLUDED #define ED_UI_INCLUDED +#define MAX_UI_ELEMENTS 2048 + #include #include #include @@ -34,7 +36,7 @@ typedef struct { ui_axis axis; ui_semantic_size semantic_size[2]; uint32_t computed_size[2]; - uint32_t computed_pos[2]; + uint32_t computed_pos[2]; } ui_size; // UI Element data persisted across frames @@ -77,18 +79,74 @@ arrayTemplate(ui_element_frame_data); typedef struct { ed_ht cached_elements; array(ui_element_frame_data) frame_elements; + + size_t frame_index; + + size_t current_parent; } ui_context; #ifdef ED_UI_IMPLEMENTATION ui_context init_ui_context() { - ed_ht cached_elements = ht_create(32, sizeof(ui_element_cache_data)); + ed_ht cached_elements = ht_create(MAX_UI_ELEMENTS, sizeof(ui_element_cache_data)); + array(ui_element_frame_data) frame_elements = newArray(ui_element_frame_data, MAX_UI_ELEMENTS); return (ui_context) { .cached_elements = cached_elements, + .frame_elements = frame_elements, + .frame_index = 0, }; } +static ui_element_frame_data *_ui_element_last(ui_context *cx, size_t parent_index) { + size_t last_index = cx->frame_elements.data[parent_index].last; + + if (last_index) { + return &cx->frame_elements.data[last_index]; + } + + return NULL; +} + +size_t ui_element(ui_context *cx, string label) { + ui_element_frame_data frame_data = (ui_element_frame_data) { + .index = cx->frame_elements.size, + // TODO: don't just set this to label, because then elements + // with the same label can't be created together + .key = label, + .label = label, + .first = 0, + .last = 0, + .next = 0, + .prev = cx->frame_elements.data[cx->current_parent].last, + .parent = cx->current_parent, + }; + + // Get cached element data + ui_element_cache_data *cache_data = ht_get(&cx->cached_elements, label); + if (cache_data) { + cache_data->last_instantiated_index = cx->frame_index; + + frame_data.size = cache_data->size; + } else { + assert("couldn't insert into ui element cache" && ht_set(&cx->cached_elements, label, &(ui_element_cache_data) { + .label = label, + .size = { 0 }, + .last_instantiated_index = cx->frame_index, + })); + } + + pushArray(ui_element_frame_data, &cx->frame_elements, frame_data); + + if (frame_data.prev) { + cx->frame_elements.data[frame_data.prev].next = frame_data.index; + } + if (cx->frame_elements.data[cx->current_parent].first == 0) { + cx->frame_elements.data[cx->current_parent].first = frame_data.index; + } + cx->frame_elements.data[cx->current_parent].last = frame_data.index; +} + #endif #endif