From 2b2b2be560e7d067f426d9ff66dd27bdd9a53c5d Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 5 Mar 2021 20:09:02 +0300 Subject: [PATCH] Support ui animations --- libs/app/include/psemek/app/ui_scene.hpp | 4 ++++ libs/app/source/ui_scene.cpp | 2 ++ libs/ui/include/psemek/ui/controller.hpp | 2 ++ libs/ui/include/psemek/ui/element.hpp | 2 ++ libs/ui/source/controller.cpp | 19 +++++++++++++++++++ 5 files changed, 29 insertions(+) diff --git a/libs/app/include/psemek/app/ui_scene.hpp b/libs/app/include/psemek/app/ui_scene.hpp index 2470efa0..4696d52d 100644 --- a/libs/app/include/psemek/app/ui_scene.hpp +++ b/libs/app/include/psemek/app/ui_scene.hpp @@ -4,6 +4,8 @@ #include +#include + namespace psemek::app { @@ -42,6 +44,8 @@ namespace psemek::app private: ui::controller & controller_; std::shared_ptr ui_; + + util::clock, std::chrono::high_resolution_clock> update_clock_; }; } diff --git a/libs/app/source/ui_scene.cpp b/libs/app/source/ui_scene.cpp index c650f6f7..dc0cc6b9 100644 --- a/libs/app/source/ui_scene.cpp +++ b/libs/app/source/ui_scene.cpp @@ -11,6 +11,7 @@ namespace psemek::app { scene_base::on_scene_enter(parent); controller_.set_root(ui_); + update_clock_.restart(); } void ui_scene::on_scene_exit() @@ -87,6 +88,7 @@ namespace psemek::app void ui_scene::update() { + controller_.update(update_clock_.restart().count()); controller_.loop()->pump(); } diff --git a/libs/ui/include/psemek/ui/controller.hpp b/libs/ui/include/psemek/ui/controller.hpp index 7ba07d9f..4e412608 100644 --- a/libs/ui/include/psemek/ui/controller.hpp +++ b/libs/ui/include/psemek/ui/controller.hpp @@ -25,6 +25,8 @@ namespace psemek::ui bool event(mouse_wheel const & e); bool event(key_press const & e); + void update(float dt); + void render(gfx::render_target const & rt); private: diff --git a/libs/ui/include/psemek/ui/element.hpp b/libs/ui/include/psemek/ui/element.hpp index 68cb6104..427e70e7 100644 --- a/libs/ui/include/psemek/ui/element.hpp +++ b/libs/ui/include/psemek/ui/element.hpp @@ -50,6 +50,8 @@ namespace psemek::ui virtual std::shared_ptr set_style(std::shared_ptr st); virtual std::shared_ptr merged_style() const; + virtual void update(float /* dt */) {} + virtual void draw(painter & p) const = 0; virtual ~element() {} diff --git a/libs/ui/source/controller.cpp b/libs/ui/source/controller.cpp index 6e336a3e..f38e218a 100644 --- a/libs/ui/source/controller.cpp +++ b/libs/ui/source/controller.cpp @@ -62,6 +62,8 @@ namespace psemek::ui template bool event(E const & e); + + void update(float dt); }; controller::impl::impl(async::event_loop * loop) @@ -91,6 +93,18 @@ namespace psemek::ui return false; } + void controller::impl::update(float dt) + { + auto visitor = util::recursive([dt](auto && self, element * elem) -> void { + if (elem->enabled()) elem->update(dt); + for (auto c : elem->children()) + if (c) self(c); + }); + + if (root) + visitor(root.get()); + } + controller::controller(async::event_loop * loop) : pimpl_{make_impl(loop)} {} @@ -149,6 +163,11 @@ namespace psemek::ui return impl().event(e); } + void controller::update(float dt) + { + impl().update(dt); + } + void controller::render(gfx::render_target const & rt) { rt.bind();