diff --git a/repos/gems/src/app/menu_view/animated_geometry.h b/repos/gems/src/app/menu_view/animated_geometry.h index 471044dfe2..2e4b626042 100644 --- a/repos/gems/src/app/menu_view/animated_geometry.h +++ b/repos/gems/src/app/menu_view/animated_geometry.h @@ -75,7 +75,7 @@ class Menu_view::Animated_rect : public Rect, Animator::Item, Noncopyable Point(_p2.x(), _p2.y())); /* schedule / de-schedule animation */ - animated(_p1.animated() || _p2.animated()); + Animator::Item::animated(_p1.animated() || _p2.animated()); } /** @@ -91,6 +91,8 @@ class Menu_view::Animated_rect : public Rect, Animator::Item, Noncopyable _p2.move_to(rect.p2(), steps); animate(); } + + bool animated() const { return Animator::Item::animated(); } }; #endif /* _ANIMATED_GEOMETRY_H_ */ diff --git a/repos/gems/src/app/menu_view/box_layout_widget.h b/repos/gems/src/app/menu_view/box_layout_widget.h index cf22f26ed9..dd04d37ab1 100644 --- a/repos/gems/src/app/menu_view/box_layout_widget.h +++ b/repos/gems/src/app/menu_view/box_layout_widget.h @@ -55,20 +55,22 @@ struct Menu_view::Box_layout_widget : Widget Area const child_min_size = w.min_size(); + w.position(position); + if (_direction == VERTICAL) { - w.geometry(Rect(position, Area(largest_size, child_min_size.h()))); unsigned const next_top_margin = w.next() ? w.next()->margin.top : 0; unsigned const dy = child_min_size.h() - min(w.margin.bottom, next_top_margin); position = position + Point(0, dy); } else { - w.geometry(Rect(position, Area(child_min_size.w(), largest_size))); unsigned const next_left_margin = w.next() ? w.next()->margin.left : 0; unsigned const dx = child_min_size.w() - min(w.margin.right, next_left_margin); position = position + Point(dx, 0); } - - _min_size = Area(w.geometry().x2() + 1, w.geometry().y2() + 1); }); + + _min_size = (_direction == VERTICAL) + ? Area(largest_size, position.y()) + : Area(position.x(), largest_size); } Area min_size() const override diff --git a/repos/gems/src/app/menu_view/root_widget.h b/repos/gems/src/app/menu_view/root_widget.h index 458fa125f8..030477f810 100644 --- a/repos/gems/src/app/menu_view/root_widget.h +++ b/repos/gems/src/app/menu_view/root_widget.h @@ -52,9 +52,6 @@ struct Menu_view::Root_widget : Widget } _update_children(node); - - _children.for_each([&] (Widget &child) { - child.geometry(Rect(Point(0, 0), child.min_size())); }); } Area min_size() const override diff --git a/repos/gems/src/app/menu_view/widget.h b/repos/gems/src/app/menu_view/widget.h index ceb86e3caf..c0bd818348 100644 --- a/repos/gems/src/app/menu_view/widget.h +++ b/repos/gems/src/app/menu_view/widget.h @@ -160,6 +160,16 @@ class Menu_view::Widget : public List_model::Element Animated_rect _animated_geometry { _factory.animator }; + void _trigger_geometry_animation() + { + if (_animated_geometry.animated()) + return; + + if (_geometry.p1() != _animated_geometry.p1() + || _geometry.p2() != _animated_geometry.p2()) + _animated_geometry.move_to(_geometry, Animated_rect::Steps{60}); + } + public: Margin margin { 0, 0, 0, 0 }; @@ -167,7 +177,7 @@ class Menu_view::Widget : public List_model::Element void geometry(Rect geometry) { _geometry = geometry; - _animated_geometry.move_to(_geometry, Animated_rect::Steps{60}); + _trigger_geometry_animation(); } Rect geometry() const { return _geometry; } @@ -213,6 +223,8 @@ class Menu_view::Widget : public List_model::Element _geometry = Rect(_geometry.p1(), size); _layout(); + + _trigger_geometry_animation(); } void position(Point position)