1 #include "FixedText.hpp"
2 #include "MessageBox.hpp"
3 #include "Progress.hpp"
6 #include "../graphics/Font.hpp"
7 #include "../graphics/Viewport.hpp"
14 MessageBox::MessageBox(const Font &f)
19 , adv(0.0f, font.LineSkip(), 0.0f)
20 , bg(1.0f, 1.0f, 1.0f, 0.0f)
21 , fg(1.0f, 1.0f, 1.0f, 1.0f)
22 , grav(Gravity::NORTH_WEST)
27 void MessageBox::Position(const glm::vec3 &p, Gravity g) noexcept {
30 if (get_y(g) == Align::END) {
31 adv.y = -font.LineSkip();
33 adv.y = font.LineSkip();
35 for (Text &txt : lines) {
41 void MessageBox::PushLine(const char *text) {
42 lines.emplace_front();
43 Text &txt = lines.front();
47 while (lines.size() > max_lines) {
55 PrimitiveMesh::Buffer bg_buf;
59 void MessageBox::Recalc() {
60 size = glm::vec2(0.0f, 0.0f);
61 for (const Text &line : lines) {
62 size.x = std::max(size.x, line.Size().x);
63 size.y += line.Size().y;
65 bg_buf.FillRect(size.x, size.y, bg, align(grav, size));
66 bg_mesh.Update(bg_buf);
71 void MessageBox::Render(Viewport &viewport) noexcept {
72 viewport.SetCursor(pos, grav);
73 if (bg.a > std::numeric_limits<float>::epsilon()) {
77 PlainColor &prog = viewport.HUDColorProgram();
78 prog.SetM(viewport.Cursor());
79 bg_mesh.DrawTriangles();
80 viewport.MoveCursor(glm::vec3(0.0f, 0.0f, -1.0f));
82 BlendedSprite &prog = viewport.SpriteProgram();
83 prog.SetBG(glm::vec4(0.0f));
85 for (Text &txt : lines) {
86 prog.SetM(viewport.Cursor());
88 viewport.MoveCursor(adv);
93 Progress::Progress(Font &font) noexcept
96 , tpl("%d/%d (%d%%)") {
102 char buf[128] = { '\0' };
106 void Progress::Update(int current, int total) {
107 std::snprintf(buf, sizeof(buf), tpl, current, total, current * 100 / total);
111 void Progress::Render(Viewport &viewport) noexcept {
112 text.Render(viewport);
116 Text::Text() noexcept
120 , pivot(Gravity::NORTH_WEST)
125 FixedText::FixedText() noexcept
127 , bg(1.0f, 1.0f, 1.0f, 0.0f)
128 , fg(1.0f, 1.0f, 1.0f, 1.0f)
130 , grav(Gravity::NORTH_WEST)
135 void Text::Set(const Font &font, const char *text) {
136 font.Render(text, tex);
137 size = font.TextSize(text);
143 SpriteMesh::Buffer sprite_buf;
147 void Text::Update() {
148 sprite_buf.LoadRect(size.x, size.y, align(pivot, size));
149 sprite.Update(sprite_buf);
153 void FixedText::Render(Viewport &viewport) noexcept {
154 BlendedSprite &prog = viewport.SpriteProgram();
155 viewport.SetCursor(pos, grav);
156 prog.SetM(viewport.Cursor());
159 Text::Render(viewport);
162 void Text::Render(Viewport &viewport) noexcept {
166 BlendedSprite &prog = viewport.SpriteProgram();
167 prog.SetTexture(tex);