Fix SplitContainer set desired size infinite loop

This commit is contained in:
kit
2026-01-02 19:05:06 -05:00
parent a60390c0ee
commit 36f4ea227d
2 changed files with 9 additions and 3 deletions
+7 -1
View File
@@ -410,6 +410,7 @@ void SplitContainer::_set_desired_sizes(const PackedInt32Array &p_desired_sizes,
if (Math::is_zero_approx(shrink_amount)) {
break;
}
const real_t prev_available_space = available_space;
for (StretchData &sdata : stretch_data) {
if (sdata.stretch_ratio <= 0 || sdata.final_size <= sdata.min_size) {
continue;
@@ -419,6 +420,10 @@ void SplitContainer::_set_desired_sizes(const PackedInt32Array &p_desired_sizes,
const real_t size_diff = prev_size - sdata.final_size;
available_space += size_diff;
}
if (Math::is_equal_approx(available_space, prev_available_space)) {
// Shrinking can fail due to values being too small to have an effect but too large for `is_zero_approx`.
break;
}
}
// Shrink non-expanding children.
@@ -454,6 +459,7 @@ void SplitContainer::_set_desired_sizes(const PackedInt32Array &p_desired_sizes,
}
// Don't shrink smaller than needed.
target_size = MAX(target_size, largest_size + available_space / largest_count);
const real_t prev_available_space = available_space;
for (StretchData &sdata : stretch_data) {
if (sdata.final_size <= sdata.min_size || (skip_priority_child && sdata.priority)) {
continue;
@@ -465,7 +471,7 @@ void SplitContainer::_set_desired_sizes(const PackedInt32Array &p_desired_sizes,
available_space += size_diff;
}
}
if (Math::is_zero_approx(available_space)) {
if (Math::is_zero_approx(available_space) || Math::is_equal_approx(available_space, prev_available_space)) {
break;
}
}