63 lines
1.7 KiB
C++
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;
|
|
}
|
|
|
|
|
|
}
|