From d7b68e44a8c98075ac5ae23c2defbd5b8aedfaa9 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 29 Jul 2024 11:11:10 +0300 Subject: [PATCH] Fix updating size policies in ui::impl::box_layout_base --- .../ui/include/psemek/ui/impl/box_layout_base.hpp | 2 +- libs/ui/source/impl/box_layout_base.cpp | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/libs/ui/include/psemek/ui/impl/box_layout_base.hpp b/libs/ui/include/psemek/ui/impl/box_layout_base.hpp index 24ae5ed7..6daac81d 100644 --- a/libs/ui/include/psemek/ui/impl/box_layout_base.hpp +++ b/libs/ui/include/psemek/ui/impl/box_layout_base.hpp @@ -46,7 +46,7 @@ namespace psemek::ui::impl private: react::source> padding_; - react::value>> size_policies_; + react::source>>> size_policies_; react::source>> children_size_constraints_; react::value size_constraints_; }; diff --git a/libs/ui/source/impl/box_layout_base.cpp b/libs/ui/source/impl/box_layout_base.cpp index e74d4861..16d7d7bc 100644 --- a/libs/ui/source/impl/box_layout_base.cpp +++ b/libs/ui/source/impl/box_layout_base.cpp @@ -8,12 +8,15 @@ namespace psemek::ui::impl namespace { - static constexpr box_layout::size_policy default_policy = box_layout::weight{}; + static constexpr box_layout::size_policy default_policy = box_layout::minimized{}; template size_constraints compute_size_constraints(std::vector const & size_policies, std::vector const & children_size_constraints, float padding) { + if (size_policies.size() != children_size_constraints.size()) + return size_constraints::max(); + size_constraints minimized = size_constraints::max(); size_constraints weight_unit = minimized; float weight_sum = 0.f; @@ -93,14 +96,14 @@ namespace psemek::ui::impl template box_layout_base::box_layout_base() : padding_(0.f) - , size_policies_({}) + , size_policies_(std::vector>{}) , children_size_constraints_() , size_constraints_( react::map( [](auto const & size_policies, auto const & children_size_constraints, auto const & padding){ return compute_size_constraints(size_policies, children_size_constraints, padding); }, - react::join(react::map(react::unpack_with_default(default_policy), size_policies_)), + react::join(react::map(react::unpack_with_default(default_policy), react::join(size_policies_))), react::join(react::map(react::unpack, children_size_constraints_)), react::join(padding_) ) @@ -117,7 +120,7 @@ namespace psemek::ui::impl auto padding = **padding_; - auto sizes = allocate(new_shape[Dimension].length(), *size_policies_, children(), padding); + auto sizes = allocate(new_shape[Dimension].length(), **size_policies_, children(), padding); float pen = new_shape[Dimension].min; for (std::size_t i = 0; i < children().size(); ++i) @@ -167,13 +170,13 @@ namespace psemek::ui::impl template void box_layout_base::update(typename detail::box_layout_type::type const & box_layout) { - size_policies_ = react::map([](auto const & children){ + size_policies_.set(react::map([](auto const & children){ std::vector> size_policies; size_policies.reserve(children.size()); for (auto const & child : children) size_policies.push_back(child.policy); return size_policies; - }, box_layout.children); + }, box_layout.children)); padding_.set(box_layout.padding); }