diff options
Diffstat (limited to 'lib/nes/app/ui')
| -rw-r--r-- | lib/nes/app/ui/screen-settings.cc | 101 | ||||
| -rw-r--r-- | lib/nes/app/ui/screen-settings.hh | 51 |
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 |
