Fix updating size policies in ui::impl::box_layout_base

This commit is contained in:
Nikita Lisitsa 2024-07-29 11:11:10 +03:00
parent b32a891183
commit d7b68e44a8
2 changed files with 10 additions and 7 deletions

View file

@ -46,7 +46,7 @@ namespace psemek::ui::impl
private:
react::source<react::value<float>> padding_;
react::value<std::vector<react::value<box_layout::size_policy>>> size_policies_;
react::source<react::value<std::vector<react::value<box_layout::size_policy>>>> size_policies_;
react::source<std::vector<react::value<struct size_constraints>>> children_size_constraints_;
react::value<struct size_constraints> size_constraints_;
};

View file

@ -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 <int Dimension>
size_constraints compute_size_constraints(std::vector<box_layout::size_policy> const & size_policies,
std::vector<size_constraints> 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 <int Dimension>
box_layout_base<Dimension>::box_layout_base()
: padding_(0.f)
, size_policies_({})
, size_policies_(std::vector<react::value<box_layout::size_policy>>{})
, children_size_constraints_()
, size_constraints_(
react::map(
[](auto const & size_policies, auto const & children_size_constraints, auto const & padding){
return compute_size_constraints<Dimension>(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<Dimension>(new_shape[Dimension].length(), *size_policies_, children(), padding);
auto sizes = allocate<Dimension>(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 <int Dimension>
void box_layout_base<Dimension>::update(typename detail::box_layout_type<Dimension>::type const & box_layout)
{
size_policies_ = react::map([](auto const & children){
size_policies_.set(react::map([](auto const & children){
std::vector<react::value<box_layout::size_policy>> 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);
}