#include #include #include #include namespace psemek::ui::impl { namespace { geom::box compute_child_shape(geom::box const & size_constraints, geom::point const & anchor, halignment halign, valignment valign) { geom::vector size{size_constraints[0].min, size_constraints[1].min}; geom::box result; result[0] = geom::interval{- size[0], 0.f} + (1.f - lerp_factor(halign)) * size[0] + anchor[0]; result[1] = geom::interval{- size[1], 0.f} + (1.f - lerp_factor(valign)) * size[1] + anchor[1]; return result; } } floating_base::floating_base() : size_constraints_(impl::size_constraints::max()) {} void floating_base::reshape(geom::box const & new_shape) { single_container::reshape(new_shape); if (auto child = this->child()) child->reshape(compute_child_shape((*(child->size_constraints())).box, *anchor_, *halign_, *valign_)); } react::value floating_base::size_constraints() const { return size_constraints_; } void floating_base::update(floating const & value) { anchor_ = value.anchor; halign_ = value.halign; valign_ = value.valign; } }