diff --git a/libs/ui/include/psemek/ui/element.hpp b/libs/ui/include/psemek/ui/element.hpp index 62e5d837..5d968ce4 100644 --- a/libs/ui/include/psemek/ui/element.hpp +++ b/libs/ui/include/psemek/ui/element.hpp @@ -156,6 +156,8 @@ namespace psemek::ui } } + element * find_element_by_id(element * root, std::string_view id); + void send_fake_mouse_move_event(element * e, bool mouseover); } diff --git a/libs/ui/source/element.cpp b/libs/ui/source/element.cpp index 7b19c375..b36d7c23 100644 --- a/libs/ui/source/element.cpp +++ b/libs/ui/source/element.cpp @@ -237,6 +237,25 @@ namespace psemek::ui c->post_delayed_callbacks(); } + element * find_element_by_id(element * root, std::string_view id) + { + auto visitor = util::recursive([&](auto && self, element * e) -> element * + { + if (!e) return nullptr; + + if (e->id() && e->id() == id) + return e; + + for (auto c : e->children()) + if (auto r = self(c)) + return r; + + return nullptr; + }); + + return visitor(root); + } + void send_fake_mouse_move_event(element * e, bool mouseover) { auto const box = e->shape().bbox();