psemek/libs/ui/source/impl/stack_layout_base.cpp

63 lines
1.7 KiB
C++

#include <psemek/ui/impl/stack_layout_base.hpp>
#include <psemek/react/join.hpp>
#include <psemek/react/map.hpp>
namespace psemek::ui::impl
{
namespace
{
size_constraints compute_size_constraints(std::vector<size_constraints> const & children_size_constraints)
{
size_constraints result = size_constraints::max();
for (auto const & constraints : children_size_constraints)
result = intersect(result, constraints);
return result;
}
}
stack_layout_base::stack_layout_base()
: size_constraints_(react::map([](auto const & children_size_constraints){
return compute_size_constraints(children_size_constraints);
}, react::join(react::map(react::unpack, children_size_constraints_))))
{}
void stack_layout_base::reshape(geom::box<float, 2> const & new_shape)
{
container::reshape(new_shape);
for (auto const & child : children())
if (child)
child->reshape(new_shape);
}
react::value<size_constraints> stack_layout_base::size_constraints() const
{
return size_constraints_;
}
void stack_layout_base::set_children(std::vector<std::unique_ptr<component>> children)
{
container::set_children(std::move(children));
std::vector<react::value<struct size_constraints>> children_size_constraints;
for (auto const & child : this->children())
{
if (child)
children_size_constraints.push_back(child->size_constraints());
else
children_size_constraints.push_back(size_constraints::max());
}
children_size_constraints_.set(std::move(children_size_constraints));
}
std::vector<std::unique_ptr<component>> stack_layout_base::release_children()
{
auto result = container::release_children();
children_size_constraints_.set({});
return result;
}
}