Distribute remaining pixel to expanding childs of GridContainer

This commit is contained in:
Markus Sauermann 2022-04-01 18:46:52 +02:00
parent 1ec40a94d5
commit 6b3207644b
1 changed files with 51 additions and 4 deletions

View File

@ -139,13 +139,47 @@ void GridContainer::_notification(int p_what) {
}
// Finally, fit the nodes.
int col_expand = col_expanded.size() > 0 ? remaining_space.width / col_expanded.size() : 0;
int row_expand = row_expanded.size() > 0 ? remaining_space.height / row_expanded.size() : 0;
int col_remaining_pixel = 0;
int col_expand = 0;
if (col_expanded.size() > 0) {
col_expand = remaining_space.width / col_expanded.size();
col_remaining_pixel = remaining_space.width - col_expanded.size() * col_expand;
}
int row_remaining_pixel = 0;
int row_expand = 0;
if (row_expanded.size() > 0) {
row_expand = remaining_space.height / row_expanded.size();
row_remaining_pixel = remaining_space.height - row_expanded.size() * row_expand;
}
bool rtl = is_layout_rtl();
int col_ofs = 0;
int row_ofs = 0;
// Calculate the index of rows and columns that receive the remaining pixel.
int col_remaining_pixel_index = 0;
for (int i = 0; i < max_col; i++) {
if (col_remaining_pixel == 0) {
break;
}
if (col_expanded.has(i)) {
col_remaining_pixel_index = i + 1;
col_remaining_pixel--;
}
}
int row_remaining_pixel_index = 0;
for (int i = 0; i < max_row; i++) {
if (row_remaining_pixel == 0) {
break;
}
if (row_expanded.has(i)) {
row_remaining_pixel_index = i + 1;
row_remaining_pixel--;
}
}
valid_controls_index = 0;
for (int i = 0; i < get_child_count(); i++) {
Control *c = Object::cast_to<Control>(get_child(i));
@ -164,17 +198,30 @@ void GridContainer::_notification(int p_what) {
}
if (row > 0) {
row_ofs += (row_expanded.has(row - 1) ? row_expand : row_minh[row - 1]) + vsep;
if (row_expanded.has(row - 1) && row - 1 < row_remaining_pixel_index) {
// Apply the remaining pixel of the previous row.
row_ofs++;
}
}
}
Size2 s(col_expanded.has(col) ? col_expand : col_minw[col], row_expanded.has(row) ? row_expand : row_minh[row]);
// Add the remaining pixel to the expanding columns and rows, starting from left and top.
if (col_expanded.has(col) && col < col_remaining_pixel_index) {
s.x++;
}
if (row_expanded.has(row) && row < row_remaining_pixel_index) {
s.y++;
}
if (rtl) {
Size2 s(col_expanded.has(col) ? col_expand : col_minw[col], row_expanded.has(row) ? row_expand : row_minh[row]);
Point2 p(col_ofs - s.width, row_ofs);
fit_child_in_rect(c, Rect2(p, s));
col_ofs -= s.width + hsep;
} else {
Point2 p(col_ofs, row_ofs);
Size2 s(col_expanded.has(col) ? col_expand : col_minw[col], row_expanded.has(row) ? row_expand : row_minh[row]);
fit_child_in_rect(c, Rect2(p, s));
col_ofs += s.width + hsep;
}