From d5b755bde0c3b499193039c3930d987abf4913c7 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 2 Aug 2024 11:53:42 +0300 Subject: [PATCH] Support ui component-specific cursors specified by a string id --- libs/ui/include/psemek/ui/impl/component.hpp | 4 +++ libs/ui/include/psemek/ui/impl/controller.hpp | 5 ++++ libs/ui/source/impl/controller.cpp | 27 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/libs/ui/include/psemek/ui/impl/component.hpp b/libs/ui/include/psemek/ui/impl/component.hpp index c4e6f30b..86a24a1f 100644 --- a/libs/ui/include/psemek/ui/impl/component.hpp +++ b/libs/ui/include/psemek/ui/impl/component.hpp @@ -9,6 +9,8 @@ #include #include +#include +#include namespace psemek::ui::impl { @@ -33,6 +35,8 @@ namespace psemek::ui::impl virtual void draw(renderer &) {} virtual void post_draw(renderer &) {} + virtual std::optional cursor() const { return std::nullopt; } + virtual ~component() {} private: diff --git a/libs/ui/include/psemek/ui/impl/controller.hpp b/libs/ui/include/psemek/ui/impl/controller.hpp index cdb5807a..b0b0e517 100644 --- a/libs/ui/include/psemek/ui/impl/controller.hpp +++ b/libs/ui/include/psemek/ui/impl/controller.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -25,9 +26,13 @@ namespace psemek::ui::impl bool on_event(mouse_button_event const & event); bool on_event(key_event const & event); + event_state const & state(); + void update(float dt); void draw(renderer & renderer); + std::optional cursor(); + private: psemek_declare_pimpl }; diff --git a/libs/ui/source/impl/controller.cpp b/libs/ui/source/impl/controller.cpp index 9fc33a4d..c7cfbc4c 100644 --- a/libs/ui/source/impl/controller.cpp +++ b/libs/ui/source/impl/controller.cpp @@ -90,6 +90,23 @@ namespace psemek::ui::impl element->post_draw(renderer); } + + std::optional cursor() + { + return cursor_impl(root.get()); + } + + std::optional cursor_impl(component * element) + { + if (!element) + return std::nullopt; + + for (auto const & child : util::reversed(element->children())) + if (auto cursor = cursor_impl(child.get())) + return cursor; + + return element->cursor(); + } }; controller::controller(component_factory & factory) @@ -133,6 +150,11 @@ namespace psemek::ui::impl return impl().on_event(event); } + event_state const & controller::state() + { + return impl().state; + } + void controller::update(float dt) { impl().update(dt); @@ -143,4 +165,9 @@ namespace psemek::ui::impl impl().draw(renderer); } + std::optional controller::cursor() + { + return impl().cursor(); + } + }