diff --git a/libs/ui/source/grid_layout.cpp b/libs/ui/source/grid_layout.cpp index db49cb80..e910f573 100644 --- a/libs/ui/source/grid_layout.cpp +++ b/libs/ui/source/grid_layout.cpp @@ -180,23 +180,40 @@ namespace psemek::ui auto const & column_size = row_column_size.second; geom::box result{{{0.f, 0.f}, {0.f, 0.f}}}; + geom::box unit = geom::box::full(); + + float sum_row_weights = 0.f; + float sum_column_weights = 0.f; for (std::size_t i = 0; i < row_count(); ++i) { bool const minimized = (row_weight_[i] == 0.f); - result[1].min += row_size[i].min; - result[1].max += minimized ? row_size[i].min : row_size[i].max; + if (minimized) + result[1] += row_size[i].min; + else + unit[1] &= geom::interval{row_size[i].min / row_weight_[i], row_size[i].max / row_weight_[i]}; + + sum_row_weights += row_weight_[i]; } for (std::size_t i = 0; i < column_count(); ++i) { bool const minimized = (column_weight_[i] == 0.f); - result[0].min += column_size[i].min; - result[0].max += minimized ? column_size[i].min : column_size[i].max; + if (minimized) + result[0] += column_size[i].min; + else + unit[0] &= geom::interval{column_size[i].min / column_weight_[i], column_size[i].max / column_weight_[i]}; + + sum_column_weights += column_weight_[i]; } + result[1].min += unit[1].min * sum_row_weights; + result[1].max += unit[1].max * sum_row_weights; + result[0].min += unit[0].min * sum_column_weights; + result[0].max += unit[0].max * sum_column_weights; + int const margin_row_count = (std::max(1, row_count()) + (outer_margin_ ? 1 : -1)); int const margin_column_count = (std::max(1, column_count()) + (outer_margin_ ? 1 : -1));