diff --git a/libs/ui/include/psemek/ui/frame.hpp b/libs/ui/include/psemek/ui/frame.hpp index 9b3fe54a..781ffe05 100644 --- a/libs/ui/include/psemek/ui/frame.hpp +++ b/libs/ui/include/psemek/ui/frame.hpp @@ -17,7 +17,8 @@ namespace psemek::ui virtual void set_max_size(std::optional> const & size); virtual void set_fixed_size(geom::vector const & size); - geom::box size_constraints() const override; + virtual std::optional> min_size() const { return min_size_; } + virtual std::optional> max_size() const { return max_size_; } private: std::optional> min_size_; diff --git a/libs/ui/source/default_element_factory.cpp b/libs/ui/source/default_element_factory.cpp index 75c690a3..fa9899b0 100644 --- a/libs/ui/source/default_element_factory.cpp +++ b/libs/ui/source/default_element_factory.cpp @@ -87,6 +87,39 @@ namespace psemek::ui if (c) c->reshape(geom::shrink(bbox, 1.f * (st->border_width + st->outer_margin))); } + geom::box size_constraints() const override + { + geom::box r = element::size_constraints(); + + for (auto c : children()) + if (c) + r = c->size_constraints(); + + auto st = style(); + if (st) + { + float extra = 2.f * (st->border_width + st->outer_margin); + r[0] += extra; + r[1] += extra; + } + + if (min_size()) + { + auto s = *min_size(); + r[0].min = s[0]; + r[1].min = s[1]; + } + + if (max_size()) + { + auto s = *max_size(); + r[0].max = s[0]; + r[1].max = s[1]; + } + + return r; + } + void draw(painter & p) const override { auto st = style(); diff --git a/libs/ui/source/frame.cpp b/libs/ui/source/frame.cpp index f5449d7b..1343a324 100644 --- a/libs/ui/source/frame.cpp +++ b/libs/ui/source/frame.cpp @@ -34,26 +34,4 @@ namespace psemek::ui post_reshape(); } - geom::box frame::size_constraints() const - { - geom::box r = element::size_constraints(); - - if (child_) - r = child_->size_constraints(); - - if (min_size_) - { - r[0].min = (*min_size_)[0]; - r[1].min = (*min_size_)[1]; - } - - if (max_size_) - { - r[0].max = (*max_size_)[0]; - r[1].max = (*max_size_)[1]; - } - - return r; - } - }