From c38c80fd43aef943700826c35fd4597d5fffdb0c Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 18 Apr 2019 13:17:53 +0200 Subject: [PATCH] menu_view: midway re-targeting of geometry motion This patch fixes the corner case where an animated geometry changes its destination mid-way while an animation is already in progress. The '_trigger_animated_geometry' method used to back out early in this case, which was intended as an optimization. Fixes #3296 --- repos/gems/include/gems/animated_geometry.h | 11 +++++++++++ repos/gems/src/app/menu_view/widget.h | 3 --- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/repos/gems/include/gems/animated_geometry.h b/repos/gems/include/gems/animated_geometry.h index 854d38a46f..1a3a20a1b0 100644 --- a/repos/gems/include/gems/animated_geometry.h +++ b/repos/gems/include/gems/animated_geometry.h @@ -64,6 +64,8 @@ class Genode::Animated_rect : private Animator::Item, Noncopyable Animated_point _p1 { }, _p2 { }; + Steps _remaining { 0 }; + public: Animated_rect(Animator &animator) : Animator::Item(animator) { } @@ -77,6 +79,9 @@ class Genode::Animated_rect : private Animator::Item, Noncopyable _rect = Rect(Point(_p1.x(), _p1.y()), Point(_p2.x(), _p2.y())); + if (_remaining.value > 1) + _remaining.value--; + /* schedule / de-schedule animation */ Animator::Item::animated(_p1.animated() || _p2.animated()); } @@ -90,6 +95,12 @@ class Genode::Animated_rect : private Animator::Item, Noncopyable */ void move_to(Rect rect, Steps steps) { + /* retarget animation while already in progress */ + if (animated()) + steps.value = max(_remaining.value, 1U); + + _remaining = steps; + _p1.move_to(rect.p1(), steps); _p2.move_to(rect.p2(), steps); animate(); diff --git a/repos/gems/src/app/menu_view/widget.h b/repos/gems/src/app/menu_view/widget.h index b08b5387aa..5f78d66be1 100644 --- a/repos/gems/src/app/menu_view/widget.h +++ b/repos/gems/src/app/menu_view/widget.h @@ -163,9 +163,6 @@ class Menu_view::Widget : List_model::Element void _trigger_geometry_animation() { - if (_animated_geometry.animated()) - return; - bool const changed = (_geometry.p1() != _animated_geometry.p1() || _geometry.p2() != _animated_geometry.p2()); if (changed)