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
|
#include "client/window/text_input_window.hh"
namespace client {
namespace window {
using tiw = class text_input_window;
const std::string& tiw::get_send_text() noexcept {
auto& text = client::input::state.text_input;
text = std::string{std::begin(text),
std::begin(text) +
static_cast<long>(std::min(std::size(text),
shared::MAX_SAY_LENGTH))};
return text;
}
proto::packet tiw::make_say_packet() noexcept {
proto::packet packet;
const auto sub_say_packet = packet.mutable_say_packet();
sub_say_packet->set_text(get_send_text());
return packet;
}
bool tiw::maybe_handle_keydown(const SDL_Event& event) noexcept {
if (event.key.keysym.sym == SDLK_BACKSPACE) {
if (!client::input::state.text_input.empty()) {
client::input::state.text_input.pop_back();
}
return true;
}
if (event.key.keysym.sym != SDLK_RETURN || event.key.repeat) {
return false;
}
if (!client::input::state.text_input.empty()) {
client::state::connection->rsend_packet(make_say_packet());
}
pop_window();
return true;
}
const glm::vec3& tiw::get_draw_colour() noexcept {
if (client::input::state.text_input.length() >= shared::MAX_SAY_LENGTH) {
return basic_window::highlight_clr;
}
return basic_window::primary_clr;
}
bool tiw::maybe_handle_event(const SDL_Event& event) noexcept {
switch (event.type) {
case SDL_KEYDOWN:
return this->maybe_handle_keydown(event);
}
return basic_window::maybe_handle_event(event);
}
void tiw::draw() noexcept {
basic_window::draw();
client::render::draw_rectangle({.pos = {.offset = this->pos},
.size = {.offset = this->size},
.colour = {this->get_draw_colour(), 1.0f}});
client::render::draw_text(
this->get_send_text(),
{.pos = {.extent = {0.0f, 0.0f},
.offset = this->pos + (this->size / 2.0f)},
.offset_height = this->size.y / 2.0f,
.colour = {this->font_colour, 1.0f},
.has_backing = false,
.is_centered = true,
.is_vcentered = true});
};
} // namespace window
} // namespace client
|