Implement width/height_constraints for default ui::frame implementation

This commit is contained in:
Nikita Lisitsa 2022-12-18 16:42:27 +03:00
parent 83559aba51
commit 83cb71d2c0

View file

@ -128,35 +128,45 @@ namespace psemek::ui
geom::box<float, 2> size_constraints() const override
{
geom::box<float, 2> r = element::size_constraints();
for (auto c : children())
if (c)
r = c->size_constraints();
geom::box<float, 2> sc = frame::size_constraints();
auto st = merged_own_style();
if (st)
{
float extra = 2.f * (*st->border_width + *st->bevel_width + *st->outer_margin);
r[0] += extra;
r[1] += extra;
sc[0] += extra;
sc[1] += extra;
}
if (min_size())
return sc;
}
geom::interval<float> width_constraints(float height) const override
{
auto wc = frame::width_constraints(height);
auto st = merged_own_style();
if (st)
{
auto s = *min_size();
r[0].min = std::max(r[0].min, s[0]);
r[1].min = std::max(r[1].min, s[1]);
float extra = 2.f * (*st->border_width + *st->bevel_width + *st->outer_margin);
wc += extra;
}
if (max_size())
return wc;
}
geom::interval<float> height_constraints(float width) const override
{
auto hc = frame::height_constraints(width);
auto st = merged_own_style();
if (st)
{
auto s = *max_size();
r[0].max = std::min(r[0].max, s[0]);
r[1].max = std::min(r[1].max, s[1]);
float extra = 2.f * (*st->border_width + *st->bevel_width + *st->outer_margin);
hc += extra;
}
return r;
return hc;
}
void draw(painter & p) const override