diff --git a/libs/ui/include/psemek/ui/element.hpp b/libs/ui/include/psemek/ui/element.hpp index 970d0255..eb03e600 100644 --- a/libs/ui/include/psemek/ui/element.hpp +++ b/libs/ui/include/psemek/ui/element.hpp @@ -51,6 +51,9 @@ namespace psemek::ui virtual ~element() {} + virtual void post(std::function f); + virtual void post_reshape(); + private: element * parent_ = nullptr; async::executor * loop_ = nullptr; diff --git a/libs/ui/source/button.cpp b/libs/ui/source/button.cpp index 01ddfaf9..4f9409fc 100644 --- a/libs/ui/source/button.cpp +++ b/libs/ui/source/button.cpp @@ -47,7 +47,7 @@ namespace psemek::ui { state_ = state_t::mousedown; if (callback_) - root()->loop()->post(callback_); + post(callback_); on_state_changed(); return true; } diff --git a/libs/ui/source/element.cpp b/libs/ui/source/element.cpp index f2023a14..73e11558 100644 --- a/libs/ui/source/element.cpp +++ b/libs/ui/source/element.cpp @@ -1,5 +1,7 @@ #include +#include + namespace psemek::ui { @@ -34,4 +36,22 @@ namespace psemek::ui return st; } + void element::post(std::function f) + { + auto l = root()->loop(); + if (l) + l->post(std::move(f)); + else + log::warning() << "posting ui event while not attached to event loop"; + } + + void element::post_reshape() + { + auto weak_self = weak_from_this(); + post([weak_self]{ + if (auto self = weak_self.lock()) + self->root()->reshape(); + }); + } + }