summaryrefslogtreecommitdiff
path: root/lib/nes/app/ui
diff options
context:
space:
mode:
authorHannes Schulze <haschu0103@outlook.de>2025-02-06 18:24:59 +0100
committerHannes Schulze <haschu0103@outlook.de>2025-02-06 18:24:59 +0100
commitd060e3a50c987d10799ccc739bdbf9d7d7a13c10 (patch)
tree4b5585383ada85608b57bcf76e5828817962fddf /lib/nes/app/ui
parentdbed1c0fa5599b1b96c221b89b10f1e350351645 (diff)
implement settings
Diffstat (limited to 'lib/nes/app/ui')
-rw-r--r--lib/nes/app/ui/screen-settings.cc101
-rw-r--r--lib/nes/app/ui/screen-settings.hh51
2 files changed, 140 insertions, 12 deletions
diff --git a/lib/nes/app/ui/screen-settings.cc b/lib/nes/app/ui/screen-settings.cc
index 4d32662..98070d7 100644
--- a/lib/nes/app/ui/screen-settings.cc
+++ b/lib/nes/app/ui/screen-settings.cc
@@ -1,5 +1,98 @@
-//
-// Created by Hannes Schulze on 06.02.25.
-//
+#include "nes/app/ui/screen-settings.hh"
+#include "nes/app/input/input-manager.hh"
+#include "nes/app/preferences.hh"
-#include "screen-settings.hh"
+namespace nes::app
+{
+ auto screen_settings::selection_impl::render_item(
+ renderer& renderer, item const& item, i32 const x, i32 const y, u32 const width, color const c) const -> void
+ {
+ auto const render = [&](std::string_view const label, std::string_view const value)
+ {
+ auto const label_length = renderer.render_text(x, y, label, c);
+ auto const value_attrs = text_attributes{}
+ .set_alignment(text_alignment::right)
+ .set_ellipsize_mode(ellipsize_mode::end)
+ .set_max_width(width - label_length - 2);
+ renderer.render_text(x + static_cast<i32>(width), y, value, color::foreground_secondary, value_attrs);
+ };
+ switch (item)
+ {
+ case item::controller_1:
+ render("Controller 1:", input_manager_.get_input_1().get_name());
+ break;
+ case item::controller_2:
+ render("Controller 2:", input_manager_.get_input_2().get_name());
+ break;
+ case item::fps_counter:
+ render("FPS Counter:", preferences_.get_fps_counter() ? "Yes" : "No");
+ break;
+ }
+ }
+
+ auto screen_settings::selection_impl::load_page(item (&items)[page_size], u32) -> u32
+ {
+ items[0] = item::controller_1;
+ items[1] = item::controller_2;
+ items[2] = item::fps_counter;
+ return 3;
+ }
+
+ screen_settings::screen_settings(input_manager& input_manager, preferences& preferences)
+ : input_manager_{ input_manager }
+ , preferences_{ preferences }
+ , selection_{ input_manager, preferences }
+ {
+ selection_.set_page_count(1);
+ }
+
+ auto screen_settings::render(renderer& renderer) -> void
+ {
+ renderer.render_fill(color::background_primary);
+ renderer.render_rect(0, 0, 32, 3, color::background_secondary);
+
+ auto const page_length = renderer.render_text_format(
+ 30, 1, color::foreground_secondary, text_attributes{}.set_alignment(text_alignment::right),
+ "Page {}/{}", selection_.get_current_page() + 1, selection_.get_page_count());
+
+ renderer.render_text(
+ 2, 1, "Settings", color::foreground_primary,
+ text_attributes{}.set_max_width(26 - page_length).set_ellipsize_mode(ellipsize_mode::middle));
+
+ selection_.render(renderer);
+ }
+
+ auto screen_settings::process_events() -> action
+ {
+ while (auto const event = input_manager_.get_keyboard().poll_event())
+ {
+ if (event == input_event::key_down(key::space))
+ {
+ 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::backspace))
+ {
+ return action::go_to_title();
+ }
+ else if (event == input_event::key_down(key::enter))
+ {
+ switch (*selection_.get_selected())
+ {
+ case item::controller_1: input_manager_.toggle_input_1(); break;
+ case item::controller_2: input_manager_.toggle_input_2(); break;
+ case item::fps_counter: preferences_.set_fps_counter(!preferences_.get_fps_counter()); break;
+ }
+ }
+ }
+
+ return action{};
+ }
+} // namespace nes::app \ No newline at end of file
diff --git a/lib/nes/app/ui/screen-settings.hh b/lib/nes/app/ui/screen-settings.hh
index 8f510ca..8910c5c 100644
--- a/lib/nes/app/ui/screen-settings.hh
+++ b/lib/nes/app/ui/screen-settings.hh
@@ -1,16 +1,51 @@
-//
-// Created by Hannes Schulze on 06.02.25.
-//
+#pragma once
-#ifndef SCREEN_SETTINGS_HH
-#define SCREEN_SETTINGS_HH
+#include "nes/app/ui/screen.hh"
+#include "nes/app/ui/selection.hh"
+namespace nes::app
+{
+ class input_manager;
+ class preferences;
+ /// Screen used to configure various emulator options.
+ class screen_settings final : public screen
+ {
+ static constexpr auto page_size = u32{ 8 };
-class screen_settings {
+ enum class item
+ {
+ controller_1,
+ controller_2,
+ fps_counter,
+ };
-};
+ class selection_impl final : public selection<item, page_size>
+ {
+ input_manager& input_manager_;
+ preferences& preferences_;
+ public:
+ explicit selection_impl(input_manager& input_manager, preferences& preferences)
+ : selection{ 2, 5, 28 }
+ , input_manager_{ input_manager }
+ , preferences_{ preferences }
+ {
+ }
+ protected:
+ auto render_item(renderer&, item const&, i32 x, i32 y, u32 width, color) const -> void override;
+ auto load_page(item(&)[page_size], u32 page) -> u32 override;
+ };
-#endif //SCREEN_SETTINGS_HH
+ input_manager& input_manager_;
+ preferences& preferences_;
+ selection_impl selection_;
+
+ public:
+ explicit screen_settings(input_manager&, preferences&);
+
+ auto render(renderer&) -> void override;
+ auto process_events() -> action override;
+ };
+} // namespace nes::app \ No newline at end of file