#include #include #include namespace psemek::ui::impl { namespace { size_constraints compute_size_constraints(size_constraints const & child_size_constraints, float margin) { return { child_size_constraints.box + geom::vector{2.f * margin, 2.f * margin} }; } geom::box compute_child_shape(geom::box const & shape, float margin) { return geom::expand(shape, -margin); } } frame_base::frame_base() : margin_(0.f) , child_size_constraints_(size_constraints::max()) , size_constraints_(react::map(compute_size_constraints, react::join(child_size_constraints_), react::join(margin_))) {} void frame_base::reshape(geom::box const & new_shape) { single_container::reshape(new_shape); if (auto child = this->child()) child->reshape(compute_child_shape(new_shape, **margin_)); } react::value frame_base::size_constraints() const { return size_constraints_; } void frame_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 frame_base::release_child() { child_size_constraints_.set(size_constraints::max()); return single_container::release_child(); } void frame_base::update(frame const & value) { margin_.set(value.margin); } }