Add ui::impl::renderer

This commit is contained in:
Nikita Lisitsa 2024-07-29 11:11:20 +03:00
parent d7b68e44a8
commit 8cc3356eb1
4 changed files with 50 additions and 1 deletions

View file

@ -2,6 +2,7 @@
#include <psemek/ui/impl/size_constraints.hpp> #include <psemek/ui/impl/size_constraints.hpp>
#include <psemek/ui/impl/events.hpp> #include <psemek/ui/impl/events.hpp>
#include <psemek/ui/impl/renderer.hpp>
#include <psemek/react/value.hpp> #include <psemek/react/value.hpp>
#include <psemek/geom/box.hpp> #include <psemek/geom/box.hpp>
#include <psemek/geom/interval.hpp> #include <psemek/geom/interval.hpp>
@ -27,6 +28,9 @@ namespace psemek::ui::impl
virtual bool on_event(mouse_button_event const &) { return false; } virtual bool on_event(mouse_button_event const &) { return false; }
virtual bool on_event(key_event const &) { return false; } virtual bool on_event(key_event const &) { return false; }
virtual void draw(renderer &) {}
virtual void post_draw(renderer &) {}
virtual ~component() {} virtual ~component() {}
private: private:

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <psemek/ui/impl/component_factory.hpp> #include <psemek/ui/impl/component_factory.hpp>
#include <psemek/ui/impl/renderer.hpp>
#include <psemek/react/value.hpp> #include <psemek/react/value.hpp>
#include <psemek/util/pimpl.hpp> #include <psemek/util/pimpl.hpp>
@ -16,12 +17,16 @@ namespace psemek::ui::impl
void set_ui(react::value<std::any> ui); void set_ui(react::value<std::any> ui);
component * root();
bool on_event(resize_event const & event); bool on_event(resize_event const & event);
bool on_event(mouse_move_event const & event); bool on_event(mouse_move_event const & event);
bool on_event(mouse_wheel_event const & event); bool on_event(mouse_wheel_event const & event);
bool on_event(mouse_button_event const & event); bool on_event(mouse_button_event const & event);
bool on_event(key_event const & event); bool on_event(key_event const & event);
void draw(renderer & renderer);
private: private:
psemek_declare_pimpl psemek_declare_pimpl
}; };

View file

@ -0,0 +1,11 @@
#pragma once
namespace psemek::ui::impl
{
struct renderer
{
virtual ~renderer() {}
};
}

View file

@ -24,7 +24,8 @@ namespace psemek::ui::impl
root = factory.reconciliate(std::move(root), value); root = factory.reconciliate(std::move(root), value);
subscribe_reshape(); subscribe_reshape();
}, true); }, true);
subscribe_reshape();
on_event(resize_event{screen_size});
} }
void subscribe_reshape() void subscribe_reshape()
@ -70,6 +71,24 @@ namespace psemek::ui::impl
return element->on_event(event); 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) controller::controller(component_factory & factory)
@ -83,6 +102,11 @@ namespace psemek::ui::impl
impl().set_ui(std::move(ui)); impl().set_ui(std::move(ui));
} }
component * controller::root()
{
return impl().root.get();
}
bool controller::on_event(resize_event const & event) bool controller::on_event(resize_event const & event)
{ {
return impl().on_event(event); return impl().on_event(event);
@ -108,4 +132,9 @@ namespace psemek::ui::impl
return impl().on_event(event); return impl().on_event(event);
} }
void controller::draw(renderer & renderer)
{
impl().draw(renderer);
}
} }