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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include "tests-private.hpp"
#include "app.hpp"
#include "floormat/events.hpp"
#include "imgui-raii.hpp"
#define HAVE_LIBC 1
#include <SDL_keycode.h>
namespace floormat {
using namespace floormat::tests;
tests_data_::~tests_data_() noexcept = default;
tests_data_::tests_data_() = default;
tests_data::~tests_data() noexcept = default;
tests_data::tests_data() = default;
base_test::~base_test() noexcept = default;
base_test::base_test() = default;
using namespace floormat::imgui;
void tests_data::switch_to(size_t i)
{
constexpr auto size = std::variant_size_v<tests::variant>;
fm_assert(i < size);
switch (i)
{
case 0: *this = std::monostate{}; break;
case 1: *this = path_test{}; break;
}
}
Pointer<tests_data_> tests_data_::make()
{
return Pointer<tests_data>{InPlaceInit};
}
void app::tests_pre_update()
{
std::visit(overloaded {
[](std::monostate) {},
[&](base_test& x) { return x.update_pre(*this); }
}, tests());
}
void app::tests_post_update()
{
std::visit(overloaded {
[](std::monostate) {},
[&](base_test& x) { return x.update_post(*this); }
}, tests());
}
bool app::tests_handle_mouse_click(const mouse_button_event& e, bool is_down)
{
update_cursor_tile(cursor.pixel);
return std::visit(overloaded {
[](std::monostate) { return false; },
[&](base_test& x) { return x.handle_mouse_click(*this, e, is_down); }
}, tests());
}
bool app::tests_handle_key(const key_event& e, bool is_down)
{
switch (e.key)
{
case SDLK_ESCAPE:
tests().switch_to(0);
return true;
default:
return std::visit(overloaded {
[](std::monostate) { return false; },
[&](base_test& x) { return x.handle_key(*this, e, is_down); }
}, tests());
}
}
bool app::tests_handle_mouse_move(const mouse_move_event& e)
{
return std::visit(overloaded {
[](std::monostate) { return false; },
[&](base_test& x) { return x.handle_mouse_move(*this, e); }
}, tests());
}
tests_data& app::tests()
{
return static_cast<tests_data&>(*_tests);
}
void app::tests_reset_mode()
{
if (!std::holds_alternative<std::monostate>(tests()))
tests() = std::monostate{};
}
void app::draw_tests_pane()
{
ImGui::SeparatorText("Functional tests");
constexpr int selectable_flags = ImGuiSelectableFlags_SpanAvailWidth;
for (auto [str, i] : tests_data::fields)
if (ImGui::Selectable(str.data(), i == tests().index(), selectable_flags))
tests().switch_to(i);
}
void app::draw_tests_overlay()
{
std::visit(overloaded {
[](std::monostate) {},
[&](base_test& x) { return x.draw_overlay(*this); }
}, tests());
}
} // namespace floormat
|