diff --git a/libs/ui/source/default_element_factory.cpp b/libs/ui/source/default_element_factory.cpp index 66e215fc..372f04f1 100644 --- a/libs/ui/source/default_element_factory.cpp +++ b/libs/ui/source/default_element_factory.cpp @@ -40,7 +40,7 @@ namespace psemek::ui if (state() == state_t::mousedown) offset = geom::cast(*st->action_offset); - element * c = label() ? (element *)label() : icon(); + auto c = child_.get(); if (c) c->reshape(geom::shrink(bbox, geom::vector{*st->border_width + (*st->inner_margin)[0], *st->border_width + (*st->inner_margin)[1]}) + offset); } @@ -92,24 +92,62 @@ namespace psemek::ui { auto sc = element::size_constraints(); - element const * c = label() ? (element const *)label() : icon(); - - if (c) + if (child_) { - sc = c->size_constraints(); + auto csc = child_->size_constraints(); + sc[0].min = csc[0].min; + sc[1].min = csc[1].min; + } - if (auto st = merged_own_style()) - { - sc[0] += 2.f * (*st->border_width); - sc[1] += 2.f * (*st->border_width); + if (auto st = merged_own_style()) + { + sc[0] += 2.f * (*st->border_width); + sc[1] += 2.f * (*st->border_width); - sc += 2.f * geom::cast(*st->inner_margin); - } + sc += 2.f * geom::cast(*st->inner_margin); } return sc; } + geom::interval width_constraints(float height) const override + { + auto wc = element::width_constraints(height); + + auto st = merged_own_style(); + + float extra = 2.f * (*st->border_width) + 2.f * geom::cast(*st->inner_margin)[0]; + + if (child_) + { + auto cwc = child_->width_constraints(height - extra); + wc.min = cwc.min; + } + + wc += extra; + + return wc; + } + + geom::interval height_constraints(float width) const override + { + auto hc = element::height_constraints(width); + + auto st = merged_own_style(); + + float extra = 2.f * (*st->border_width) + 2.f * geom::cast(*st->inner_margin)[1]; + + if (child_) + { + auto chc = child_->height_constraints(width - extra); + hc.min = chc.min; + } + + hc += extra; + + return hc; + } + private: box_shape shape_; };