#include #include #include namespace psemek::ui::impl { namespace { size_constraints compute_size_constraints(size_constraints const & child_size_constraints) { return { .box = {{ {child_size_constraints.box[0].min, size_constraints::infinity}, {child_size_constraints.box[1].min, size_constraints::infinity}, }} }; } } aligned_base::aligned_base() : align_({halignment::center, valignment::center}) , child_size_constraints_(size_constraints::max()) , size_constraints_(react::map(compute_size_constraints, react::join(child_size_constraints_))) {} void aligned_base::reshape(geom::box const & new_shape) { single_container::reshape(new_shape); auto [ halign, valign ] = **align_; auto child_size_constraints = **child_size_constraints_; if (auto child = this->child()) child->reshape({ align(new_shape[0], child_size_constraints.box[0].min, halign), align(new_shape[1], child_size_constraints.box[1].min, valign), }); } react::value aligned_base::size_constraints() const { return size_constraints_; } void aligned_base::set_child(std::unique_ptr child) { if (child) child_size_constraints_.set(child->size_constraints()); else child_size_constraints_.set(size_constraints::max()); single_container::set_child(std::move(child)); } std::unique_ptr aligned_base::release_child() { child_size_constraints_.set(size_constraints::max()); return single_container::release_child(); } void aligned_base::update(aligned const & value) { align_.set(react::map([](auto const & halign, auto const & valign){ return std::pair{halign, valign}; }, value.halign, value.valign)); } }