diff options
| author | Hannes Schulze <haschu0103@outlook.de> | 2025-02-06 18:24:59 +0100 |
|---|---|---|
| committer | Hannes Schulze <haschu0103@outlook.de> | 2025-02-06 18:24:59 +0100 |
| commit | d060e3a50c987d10799ccc739bdbf9d7d7a13c10 (patch) | |
| tree | 4b5585383ada85608b57bcf76e5828817962fddf /lib/nes/app/ui/screen-settings.cc | |
| parent | dbed1c0fa5599b1b96c221b89b10f1e350351645 (diff) | |
implement settings
Diffstat (limited to 'lib/nes/app/ui/screen-settings.cc')
| -rw-r--r-- | lib/nes/app/ui/screen-settings.cc | 101 |
1 files changed, 97 insertions, 4 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 |
