summaryrefslogtreecommitdiff
path: root/lib/nes/app/ui/screen-title.cc
diff options
context:
space:
mode:
authorHannes Schulze <haschu0103@outlook.de>2025-02-02 20:59:36 +0100
committerHannes Schulze <haschu0103@outlook.de>2025-02-02 20:59:36 +0100
commit4fe67b36e3bbe6ea5505ed7233c245be9374f0ce (patch)
treef5cfe88f252ee2e9830162a1673441a704e6ea37 /lib/nes/app/ui/screen-title.cc
parent8062afc25e895cb49e76f6e26e51a7d4a1ad2df2 (diff)
refactor selection
Diffstat (limited to 'lib/nes/app/ui/screen-title.cc')
-rw-r--r--lib/nes/app/ui/screen-title.cc61
1 files changed, 42 insertions, 19 deletions
diff --git a/lib/nes/app/ui/screen-title.cc b/lib/nes/app/ui/screen-title.cc
index 5a2f757..32a6ea6 100644
--- a/lib/nes/app/ui/screen-title.cc
+++ b/lib/nes/app/ui/screen-title.cc
@@ -2,13 +2,35 @@
#include "nes/app/graphics/renderer.hh"
#include "nes/app/graphics/color.hh"
#include "nes/app/graphics/tiles/banner.hh"
-#include "nes/app/input/input-manager.hh"
+#include "nes/app/input/input-device-keyboard.hh"
namespace nes::app
{
- screen_title::screen_title(input_manager& input_manager)
- : input_manager_{ input_manager }
+ auto screen_title::selection_impl::render_item(
+ renderer& renderer, item const& item, i32 const x, i32 const y, u32 const width, color const color) const -> void
{
+ auto const attrs = text_attributes{}
+ .set_max_width(width);
+ switch (item)
+ {
+ case item::load_game: renderer.render_text(x, y, "Load Game", color, attrs); break;
+ case item::settings: renderer.render_text(x, y, "Settings", color, attrs); break;
+ case item::help: renderer.render_text(x, y, "Help", color, attrs); break;
+ }
+ }
+
+ auto screen_title::selection_impl::load_page(item (&items)[3], u32) -> u32
+ {
+ items[0] = item::load_game;
+ items[1] = item::settings;
+ items[2] = item::help;
+ return 3;
+ }
+
+ screen_title::screen_title(input_device_keyboard& keyboard)
+ : keyboard_{ keyboard }
+ {
+ selection_.set_page_count(1);
}
auto screen_title::render(renderer& renderer) -> void
@@ -16,32 +38,33 @@ namespace nes::app
renderer.render_fill(color::background_primary);
renderer.render_image(2, 4, tiles::banner);
- if (selected_item_ == item::load_game) { renderer.render_text(10, 16, ">", color::accent_primary); }
- renderer.render_text(12, 16, "Load Game", selected_item_ == item::load_game ? color::accent_primary : color::foreground_primary);
-
- if (selected_item_ == item::settings) { renderer.render_text(10, 19, ">", color::accent_primary); }
- renderer.render_text(12, 19, "Settings", selected_item_ == item::settings ? color::accent_primary : color::foreground_primary);
-
- if (selected_item_ == item::help) { renderer.render_text(10, 22, ">", color::accent_primary); }
- renderer.render_text(12, 22, "Help", selected_item_ == item::help ? color::accent_primary : color::foreground_primary);
+ selection_.render(renderer);
}
auto screen_title::process_events() -> action
{
- while (auto event = input_manager_.get_keyboard().poll_event())
+ while (auto const event = keyboard_.poll_event())
{
if (event == input_event::key_down(key::space))
{
- switch (selected_item_)
- {
- case item::load_game: selected_item_ = item::settings; break;
- case item::settings: selected_item_ = item::help; break;
- case item::help: selected_item_ = item::load_game; break;
- }
+ selection_.go_next();
+ }
+ else if (event == input_event::key_down(key::arrow_up))
+ {
+ selection_.go_up();
+ }
+ else if (event == input_event::key_down(key::arrow_down))
+ {
+ selection_.go_down();
}
else if (event == input_event::key_down(key::enter))
{
- return action::load_game;
+ switch (*selection_.get_selected())
+ {
+ case item::load_game: return action::go_to_browser;
+ case item::settings: return action::go_to_settings;
+ case item::help: return action::go_to_help;
+ }
}
}