psemek/examples/ui.cpp

77 lines
1.7 KiB
C++

#include <psemek/app/app.hpp>
#include <psemek/app/main.hpp>
#include <psemek/gfx/gl.hpp>
#include <psemek/ui/controller.hpp>
#include <psemek/ui/default_element_factory.hpp>
#include <psemek/ui/font.hpp>
#include <psemek/geom/camera.hpp>
using namespace psemek;
struct ui_example
: app::app
{
ui_example()
: app("UI example", 1)
{
auto style = std::make_shared<ui::style>();
style->font = ui::make_default_9x12_font();
style->text_scale = 2;
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);
ui_controller.set_root(std::move(screen));
}
void on_resize(int width, int height) override
{
app::on_resize(width, height);
ui_controller.reshape({{{0, width}, {0, height}}});
}
void on_mouse_move(int x, int y, int dx, int dy) override
{
app::on_mouse_move(x, y, dx, dy);
ui_controller.event(ui::mouse_move{{x, y}});
}
void on_left_button_down() override
{
app::on_left_button_down();
ui_controller.event(ui::mouse_click{ui::mouse_button::left, true});
}
void on_left_button_up() override
{
app::on_left_button_up();
ui_controller.event(ui::mouse_click{ui::mouse_button::left, false});
}
void present() override;
ui::controller ui_controller;
ui::default_element_factory element_factory;
};
void ui_example::present()
{
gl::ClearColor(0.8f, 0.8f, 0.8f, 1.f);
gl::Clear(gl::COLOR_BUFFER_BIT);
gfx::render_target rt;
rt.framebuffer = &gfx::framebuffer::null();
rt.draw_buffer = gl::BACK_LEFT;
rt.viewport = {{{0, width()}, {0, height()}}};
ui_controller.render(rt);
}
int main()
{
return app::main<ui_example>();
}