1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#include "nes/app/ui/screen-settings.hh"
#include "nes/app/input/input-manager.hh"
#include "nes/app/preferences.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 = [&](string_view const label, 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
|