summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Ting <danielzting@gmail.com>2020-07-15 15:56:00 -0500
committerDaniel Ting <danielzting@gmail.com>2020-07-16 12:24:57 -0500
commit04ea6ec88dac45679458f8752ddc4c2ae285e103 (patch)
tree1b99e9e59210c44a2398b14fc8bab7bf4fb8197e
parent9e34ba48556b71f1f672b5be47d12b0e3f679b86 (diff)
Evenly distribute stretched Nodes in BoxContainer
Add any leftover fractional pixels to an error accumulator. When the accumulator is greater or equal to one, add one pixel to the current Node's size and subtract one from the accumulator. Closes #36522
-rw-r--r--scene/gui/box_container.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/scene/gui/box_container.cpp b/scene/gui/box_container.cpp
index 75d04dba61..d198ae90d1 100644
--- a/scene/gui/box_container.cpp
+++ b/scene/gui/box_container.cpp
@@ -104,6 +104,7 @@ void BoxContainer::_resort() {
has_stretched = true;
bool refit_successful = true; //assume refit-test will go well
+ float error = 0; // Keep track of accumulated error in pixels
for (int i = 0; i < get_child_count(); i++) {
Control *c = Object::cast_to<Control>(get_child(i));
@@ -119,8 +120,9 @@ void BoxContainer::_resort() {
if (msc.will_stretch) { //wants to stretch
//let's see if it can really stretch
-
- int final_pixel_size = stretch_avail * c->get_stretch_ratio() / stretch_ratio_total;
+ float final_pixel_size = stretch_avail * c->get_stretch_ratio() / stretch_ratio_total;
+ // Add leftover fractional pixels to error accumulator
+ error += final_pixel_size - (int)final_pixel_size;
if (final_pixel_size < msc.min_size) {
//if available stretching area is too small for widget,
//then remove it from stretching area
@@ -132,6 +134,11 @@ void BoxContainer::_resort() {
break;
} else {
msc.final_size = final_pixel_size;
+ // Dump accumulated error if one pixel or more
+ if (error >= 1) {
+ msc.final_size += 1;
+ error -= 1;
+ }
}
}
}