From a362dafee35e4330bd69d96cb182ed39694d74e9 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 3 Mar 2021 12:18:26 +0300 Subject: [PATCH] Add app::ui_scene helper base class --- libs/app/CMakeLists.txt | 2 +- libs/app/include/psemek/app/ui_scene.hpp | 37 +++++++++++ libs/app/source/ui_scene.cpp | 85 ++++++++++++++++++++++++ libs/ui/include/psemek/ui/label.hpp | 3 + libs/ui/source/label.cpp | 4 ++ 5 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 libs/app/include/psemek/app/ui_scene.hpp create mode 100644 libs/app/source/ui_scene.cpp diff --git a/libs/app/CMakeLists.txt b/libs/app/CMakeLists.txt index 12bce64a..dc682d6a 100644 --- a/libs/app/CMakeLists.txt +++ b/libs/app/CMakeLists.txt @@ -3,4 +3,4 @@ file(GLOB_RECURSE PSEMEK_APP_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "sou psemek_add_library(psemek-app ${PSEMEK_APP_HEADERS} ${PSEMEK_APP_SOURCES}) target_include_directories(psemek-app PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") -target_link_libraries(psemek-app PUBLIC psemek-log psemek-util psemek-gfx psemek-sdl2) +target_link_libraries(psemek-app PUBLIC psemek-log psemek-util psemek-gfx psemek-ui psemek-sdl2) diff --git a/libs/app/include/psemek/app/ui_scene.hpp b/libs/app/include/psemek/app/ui_scene.hpp new file mode 100644 index 00000000..a77ade69 --- /dev/null +++ b/libs/app/include/psemek/app/ui_scene.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include + +#include + +namespace psemek::app +{ + + struct ui_scene + : scene_base + { + ui_scene(ui::controller & controller); + + void on_resize(int width, int height) override; + + void on_mouse_move(int x, int y, int dx, int dy) override; + void on_mouse_wheel(int delta) override; + void on_left_button_down() override; + void on_left_button_up() override; + void on_middle_button_down() override; + void on_middle_button_up() override; + void on_right_button_down() override; + void on_right_button_up() override; + + void on_key_down(SDL_Keycode key) override; + void on_key_up(SDL_Keycode key) override; + + void present() override; + + ui::controller & controller() const { return controller_; } + + private: + ui::controller & controller_; + }; + +} diff --git a/libs/app/source/ui_scene.cpp b/libs/app/source/ui_scene.cpp new file mode 100644 index 00000000..e22ddccd --- /dev/null +++ b/libs/app/source/ui_scene.cpp @@ -0,0 +1,85 @@ +#include + +namespace psemek::app +{ + + ui_scene::ui_scene(ui::controller & controller) + : controller_(controller) + {} + + void ui_scene::on_resize(int width, int height) + { + scene_base::on_resize(width, height); + controller_.reshape({{{0.f, width}, {0.f, height}}}); + } + + void ui_scene::on_mouse_move(int x, int y, int dx, int dy) + { + scene_base::on_mouse_move(x, y, dx, dy); + controller_.event(ui::mouse_move{{x, y}}); + } + + void ui_scene::on_mouse_wheel(int delta) + { + scene_base::on_mouse_wheel(delta); + controller_.event(ui::mouse_wheel{delta}); + } + + void ui_scene::on_left_button_down() + { + scene_base::on_left_button_down(); + controller_.event(ui::mouse_click{ui::mouse_button::left, true}); + } + + void ui_scene::on_left_button_up() + { + scene_base::on_left_button_up(); + controller_.event(ui::mouse_click{ui::mouse_button::left, false}); + } + + void ui_scene::on_middle_button_down() + { + scene_base::on_left_button_down(); + controller_.event(ui::mouse_click{ui::mouse_button::middle, true}); + } + + void ui_scene::on_middle_button_up() + { + scene_base::on_left_button_down(); + controller_.event(ui::mouse_click{ui::mouse_button::middle, false}); + } + + void ui_scene::on_right_button_down() + { + scene_base::on_right_button_down(); + controller_.event(ui::mouse_click{ui::mouse_button::right, true}); + } + + void ui_scene::on_right_button_up() + { + scene_base::on_right_button_down(); + controller_.event(ui::mouse_click{ui::mouse_button::right, false}); + } + + void ui_scene::on_key_down(SDL_Keycode key) + { + scene_base::on_key_down(key); + controller_.event(ui::key_press{key, true}); + } + + void ui_scene::on_key_up(SDL_Keycode key) + { + scene_base::on_key_down(key); + controller_.event(ui::key_press{key, false}); + } + + void ui_scene::present() + { + gfx::render_target rt; + rt.viewport = {{{0, width()}, {0, height()}}}; + rt.framebuffer = &gfx::framebuffer::null(); + rt.draw_buffer = gl::BACK_LEFT; + controller_.render(rt); + } + +} diff --git a/libs/ui/include/psemek/ui/label.hpp b/libs/ui/include/psemek/ui/label.hpp index c61ab154..a5364908 100644 --- a/libs/ui/include/psemek/ui/label.hpp +++ b/libs/ui/include/psemek/ui/label.hpp @@ -40,6 +40,9 @@ namespace psemek::ui ellipsis, }; + label() = default; + explicit label(std::string text); + virtual void set_text(std::string text); virtual std::string_view text() const { return text_; } diff --git a/libs/ui/source/label.cpp b/libs/ui/source/label.cpp index e2bedf6f..6cf555eb 100644 --- a/libs/ui/source/label.cpp +++ b/libs/ui/source/label.cpp @@ -6,6 +6,10 @@ namespace psemek::ui { + label::label(std::string text) + : text_(std::move(text)) + {} + void label::set_text(std::string text) { text_ = std::move(text);