From de352705f4f1fc9035c87d28cee6278130b6ad13 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 12 Mar 2022 01:16:01 +0300 Subject: [PATCH] Cache computed row & column shapes in grid_layout --- libs/ui/include/psemek/ui/grid_layout.hpp | 4 ++++ libs/ui/source/grid_layout.cpp | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/libs/ui/include/psemek/ui/grid_layout.hpp b/libs/ui/include/psemek/ui/grid_layout.hpp index fa3a43d7..37e24ade 100644 --- a/libs/ui/include/psemek/ui/grid_layout.hpp +++ b/libs/ui/include/psemek/ui/grid_layout.hpp @@ -49,6 +49,10 @@ namespace psemek::ui ~grid_layout() override; + protected: + std::vector> row_shape_; + std::vector> column_shape_; + private: util::array, 2> children_; std::vector children_range_; diff --git a/libs/ui/source/grid_layout.cpp b/libs/ui/source/grid_layout.cpp index 64e94181..db49cb80 100644 --- a/libs/ui/source/grid_layout.cpp +++ b/libs/ui/source/grid_layout.cpp @@ -228,15 +228,15 @@ namespace psemek::ui float const row_weight_sum = std::accumulate(row_weight_.begin(), row_weight_.end(), 0.f); float const column_weight_sum = std::accumulate(column_weight_.begin(), column_weight_.end(), 0.f); - std::vector> row_shape(row_count()); - std::vector> column_shape(column_count()); + row_shape_.resize(row_count()); + column_shape_.resize(column_count()); // First, allocate minimized rows for (std::size_t i = 0; i < row_count(); ++i) { if (row_weight_[i] == 0.f) { - row_shape[i] = {0.f, row_size[i].min}; + row_shape_[i] = {0.f, row_size[i].min}; available_height -= row_size[i].min; } } @@ -250,16 +250,16 @@ namespace psemek::ui continue; float const row_height = available_height * row_weight_[i] / row_weight_sum; - row_shape[i] = {0.f, row_height}; + row_shape_[i] = {0.f, row_height}; } // Finally, move rows one after another for (std::size_t i = 0; i < row_count(); ++i) { if (i == 0) - row_shape[i] += bbox[1].min + (outer_margin_ ? margin : 0.f); + row_shape_[i] += bbox[1].min + (outer_margin_ ? margin : 0.f); else - row_shape[i] += row_shape[i - 1].max + margin; + row_shape_[i] += row_shape_[i - 1].max + margin; } // First, allocate minimized columns @@ -267,7 +267,7 @@ namespace psemek::ui { if (column_weight_[i] == 0.f) { - column_shape[i] = {0.f, column_size[i].min}; + column_shape_[i] = {0.f, column_size[i].min}; available_width -= column_size[i].min; } } @@ -281,16 +281,16 @@ namespace psemek::ui continue; float const column_width = available_width * column_weight_[i] / column_weight_sum; - column_shape[i] = {0.f, column_width}; + column_shape_[i] = {0.f, column_width}; } // Finally, move rows one after another for (std::size_t i = 0; i < column_count(); ++i) { if (i == 0) - column_shape[i] += bbox[0].min + (outer_margin_ ? margin : 0.f); + column_shape_[i] += bbox[0].min + (outer_margin_ ? margin : 0.f); else - column_shape[i] += column_shape[i - 1].max + margin; + column_shape_[i] += column_shape_[i - 1].max + margin; } // Apply calculated shapes @@ -300,7 +300,7 @@ namespace psemek::ui { if (!get(i, j)) continue; - get(i, j)->reshape({{column_shape[j], row_shape[i]}}); + get(i, j)->reshape({{column_shape_[j], row_shape_[i]}}); } } }