diff --git a/libs/ui/include/psemek/ui/impl/component.hpp b/libs/ui/include/psemek/ui/impl/component.hpp index 2d62fcb6..7c8fd3d9 100644 --- a/libs/ui/include/psemek/ui/impl/component.hpp +++ b/libs/ui/include/psemek/ui/impl/component.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -27,6 +28,9 @@ namespace psemek::ui::impl virtual bool on_event(mouse_button_event const &) { return false; } virtual bool on_event(key_event const &) { return false; } + virtual void draw(renderer &) {} + virtual void post_draw(renderer &) {} + virtual ~component() {} private: diff --git a/libs/ui/include/psemek/ui/impl/controller.hpp b/libs/ui/include/psemek/ui/impl/controller.hpp index 7e05a84c..78b089c2 100644 --- a/libs/ui/include/psemek/ui/impl/controller.hpp +++ b/libs/ui/include/psemek/ui/impl/controller.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -16,12 +17,16 @@ namespace psemek::ui::impl void set_ui(react::value ui); + component * root(); + bool on_event(resize_event const & event); bool on_event(mouse_move_event const & event); bool on_event(mouse_wheel_event const & event); bool on_event(mouse_button_event const & event); bool on_event(key_event const & event); + void draw(renderer & renderer); + private: psemek_declare_pimpl }; diff --git a/libs/ui/include/psemek/ui/impl/renderer.hpp b/libs/ui/include/psemek/ui/impl/renderer.hpp new file mode 100644 index 00000000..bb2077b6 --- /dev/null +++ b/libs/ui/include/psemek/ui/impl/renderer.hpp @@ -0,0 +1,11 @@ +#pragma once + +namespace psemek::ui::impl +{ + + struct renderer + { + virtual ~renderer() {} + }; + +} diff --git a/libs/ui/source/impl/controller.cpp b/libs/ui/source/impl/controller.cpp index 98674575..04f2375c 100644 --- a/libs/ui/source/impl/controller.cpp +++ b/libs/ui/source/impl/controller.cpp @@ -24,7 +24,8 @@ namespace psemek::ui::impl root = factory.reconciliate(std::move(root), value); subscribe_reshape(); }, true); - subscribe_reshape(); + + on_event(resize_event{screen_size}); } void subscribe_reshape() @@ -70,6 +71,24 @@ namespace psemek::ui::impl return element->on_event(event); } + + void draw(renderer & renderer) + { + draw_impl(renderer, root.get()); + } + + void draw_impl(renderer & renderer, component * element) + { + if (!element) + return; + + element->draw(renderer); + + for (auto const & child : element->children()) + draw_impl(renderer, child.get()); + + element->post_draw(renderer); + } }; controller::controller(component_factory & factory) @@ -83,6 +102,11 @@ namespace psemek::ui::impl impl().set_ui(std::move(ui)); } + component * controller::root() + { + return impl().root.get(); + } + bool controller::on_event(resize_event const & event) { return impl().on_event(event); @@ -108,4 +132,9 @@ namespace psemek::ui::impl return impl().on_event(event); } + void controller::draw(renderer & renderer) + { + impl().draw(renderer); + } + }