diff --git a/examples/ui.cpp b/examples/ui.cpp index a1c59939..6facb9ff 100644 --- a/examples/ui.cpp +++ b/examples/ui.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include using namespace psemek; @@ -16,6 +18,7 @@ struct ui_example { ui_example() : app("UI example", 1) + , ui_controller(&loop) { auto style = std::make_shared(); style->font = ui::make_default_9x12_font(); @@ -23,7 +26,11 @@ struct ui_example element_factory.set_style(style); auto screen = element_factory.make_screen(); - screen->add(element_factory.make_button("Test"), ui::screen::x_policy::center, ui::screen::y_policy::center); + auto button = element_factory.make_button("Test"); + button->on_click([button = button.get()]{ + button->label()->set_text(std::string(button->label()->text()) + "0"); + }); + screen->add(button, ui::screen::x_policy::center, ui::screen::y_policy::center); ui_controller.set_root(std::move(screen)); } @@ -52,12 +59,20 @@ struct ui_example ui_controller.event(ui::mouse_click{ui::mouse_button::left, false}); } + void update() override; + void present() override; + async::event_loop loop; ui::controller ui_controller; ui::default_element_factory element_factory; }; +void ui_example::update() +{ + loop.pump(); +} + void ui_example::present() { gl::ClearColor(0.8f, 0.8f, 0.8f, 1.f); diff --git a/libs/ui/include/psemek/ui/controller.hpp b/libs/ui/include/psemek/ui/controller.hpp index d164944c..b5692d12 100644 --- a/libs/ui/include/psemek/ui/controller.hpp +++ b/libs/ui/include/psemek/ui/controller.hpp @@ -10,7 +10,7 @@ namespace psemek::ui struct controller { - controller(); + controller(async::executor * loop); ~controller(); std::shared_ptr set_root(std::shared_ptr r); diff --git a/libs/ui/source/controller.cpp b/libs/ui/source/controller.cpp index cf66cddc..b9c8cd24 100644 --- a/libs/ui/source/controller.cpp +++ b/libs/ui/source/controller.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #include #include @@ -11,15 +10,21 @@ namespace psemek::ui struct controller::impl { + async::executor * loop; painter_impl painter; std::shared_ptr root; - async::event_loop loop; geom::box shape{{{0.f, 0.f}, {0.f, 0.f}}}; + impl(async::executor * loop); + template bool event(E const & e); }; + controller::impl::impl(async::executor * loop) + : loop(loop) + {} + template bool controller::impl::event(E const & e) { @@ -36,8 +41,8 @@ namespace psemek::ui return false; } - controller::controller() - : pimpl_{make_impl()} + controller::controller(async::executor * loop) + : pimpl_{make_impl(loop)} {} controller::~controller() = default; @@ -49,7 +54,7 @@ namespace psemek::ui if (old) old->set_loop(nullptr); if (impl().root) { - impl().root->set_loop(&impl().loop); + impl().root->set_loop(impl().loop); impl().root->reshape(impl().shape); } return old;