summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-10-30 16:07:10 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-10-30 16:07:10 -0400
commit66fbcabd9d930a91f0c1a97a1e725d8d435d22da (patch)
treecd9cc86211ef6ef15d7a6908d1ffd82891c5f5b3
parentf986f2b422d9167604964108b7f2e71f77b6da14 (diff)
pke: static ui handle removed children, validation
-rw-r--r--src/static-ui.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/static-ui.cpp b/src/static-ui.cpp
index 72bd298..505f4bc 100644
--- a/src/static-ui.cpp
+++ b/src/static-ui.cpp
@@ -286,6 +286,8 @@ bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<
box->internal.parent->internal.children[i] = box->internal.parent->internal.children[i+1];
}
box->internal.parent->internal.h_children -= 1;
+ pke_ui_teardown_box_recursive(box, 0);
+ pke_ui_master.should_update_buffer = true;
return false;
}
@@ -486,6 +488,7 @@ bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<
void pke_ui_recalc_sizes_recursive(pk_arr_t<pke_ui_box_instance_buffer_item> &arr, pk_arr_t<std::pair<pke_ui_box*,pke_ui_box_instance_buffer_item>> &tmp_txtr_buffer, pke_ui_box *box) {
PKE_UI_BOX_FLAG_T flags_masked;
uint8_t flex_count = 0;
+ uint8_t unreal_count = 0;
float available_size = 0;
pke_ui_flex_params flex_params{};
flex_params.px_per_unit = 0;
@@ -501,13 +504,23 @@ void pke_ui_recalc_sizes_recursive(pk_arr_t<pke_ui_box_instance_buffer_item> &ar
}
for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) {
+ if (box->internal.children[i]->isMarkedForRemoval == true) {
+ unreal_count += 1;
+ continue;
+ }
if (PK_HAS_FLAG(box->internal.children[i]->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX)) {
flex_count += 1;
+
+ if (box->internal.children[i]->flex_weight <= 0 || !(box->internal.children[i]->flex_weight == box->internal.children[i]->flex_weight)) {
+ fprintf(stderr, "[%s] ui box invalid flex_weight: '%f' on child #: %u\n", __FILE__, box->internal.children[i]->flex_weight, i);
+ flex_count = 0;
+ break;
+ }
flex_params.unit_total += box->internal.children[i]->flex_weight;
}
}
- if (flex_count != 0 && flex_count != box->internal.h_children) {
+ if (flex_count != 0 && (flex_count + unreal_count) != box->internal.h_children) {
fprintf(stderr, "[%s] ui box invalid flags: if one child is type FLEX, then all children must be type FLEX\n", __FILE__);
return;
}