psemek/libs/ui/source/impl/aligned_base.cpp

71 lines
1.8 KiB
C++

#include <psemek/ui/impl/aligned_base.hpp>
#include <psemek/react/join.hpp>
#include <psemek/react/map.hpp>
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<float, 2> 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<struct size_constraints> aligned_base::size_constraints() const
{
return size_constraints_;
}
void aligned_base::set_child(std::unique_ptr<component> 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<component> 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));
}
}