#include #include #include namespace psemek::ui::impl { namespace { size_constraints compute_size_constraints(std::vector 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 const & new_shape) { container::reshape(new_shape); for (auto const & child : children()) if (child) child->reshape(new_shape); } react::value stack_layout_base::size_constraints() const { return size_constraints_; } void stack_layout_base::set_children(std::vector> children) { container::set_children(std::move(children)); std::vector> 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> stack_layout_base::release_children() { auto result = container::release_children(); children_size_constraints_.set({}); return result; } }