]> git.localhorst.tv Git - blank.git/blob - src/ui/widgets.cpp
model -> mesh
[blank.git] / src / ui / widgets.cpp
1 #include "FixedText.hpp"
2 #include "MessageBox.hpp"
3 #include "Progress.hpp"
4 #include "Text.hpp"
5
6 #include "../graphics/Font.hpp"
7 #include "../graphics/Viewport.hpp"
8
9 #include <cstdio>
10
11
12 namespace blank {
13
14 MessageBox::MessageBox(const Font &f)
15 : font(f)
16 , lines()
17 , max_lines(10)
18 , pos(0.0f)
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) {
23
24 }
25
26 void MessageBox::Position(const glm::vec3 &p, Gravity g) noexcept {
27         pos = p;
28         grav = g;
29         if (get_y(g) == Align::END) {
30                 adv.y = -font.LineSkip();
31         } else {
32                 adv.y = font.LineSkip();
33         }
34         for (Text &txt : lines) {
35                 txt.Pivot(g);
36         }
37 }
38
39 void MessageBox::PushLine(const char *text) {
40         lines.emplace_front();
41         Text &txt = lines.front();
42         txt.Set(font, text);
43         txt.Pivot(grav);
44
45         while (lines.size() > max_lines) {
46                 lines.pop_back();
47         }
48 }
49
50 void MessageBox::Render(Viewport &viewport) noexcept {
51         BlendedSprite &prog = viewport.SpriteProgram();
52         prog.SetBG(bg);
53         prog.SetFG(fg);
54         viewport.SetCursor(pos, grav);
55         for (Text &txt : lines) {
56                 prog.SetM(viewport.Cursor());
57                 txt.Render(viewport);
58                 viewport.MoveCursor(adv);
59         }
60 }
61
62
63 Progress::Progress(Font &font) noexcept
64 : font(font)
65 , text()
66 , tpl("%d/%d (%d%%)") {
67
68 }
69
70 namespace {
71
72 char buf[128] = { '\0' };
73
74 }
75
76 void Progress::Update(int current, int total) {
77         std::snprintf(buf, sizeof(buf), tpl, current, total, current * 100 / total);
78         text.Set(font, buf);
79 }
80
81 void Progress::Render(Viewport &viewport) noexcept {
82         text.Render(viewport);
83 }
84
85
86 Text::Text() noexcept
87 : tex()
88 , sprite()
89 , size(0.0f)
90 , pivot(Gravity::NORTH_WEST)
91 , dirty(false) {
92
93 }
94
95 FixedText::FixedText() noexcept
96 : Text()
97 , bg(1.0f, 1.0f, 1.0f, 0.0f)
98 , fg(1.0f, 1.0f, 1.0f, 1.0f)
99 , pos(0.0f)
100 , grav(Gravity::NORTH_WEST)
101 , visible(false) {
102
103 }
104
105 void Text::Set(const Font &font, const char *text) {
106         font.Render(text, tex);
107         size = font.TextSize(text);
108         dirty = true;
109 }
110
111 namespace {
112
113 SpriteMesh::Buffer sprite_buf;
114
115 }
116
117 void Text::Update() {
118         sprite_buf.LoadRect(size.x, size.y, align(pivot, size));
119         sprite.Update(sprite_buf);
120         dirty = false;
121 }
122
123 void FixedText::Render(Viewport &viewport) noexcept {
124         BlendedSprite &prog = viewport.SpriteProgram();
125         viewport.SetCursor(pos, grav);
126         prog.SetM(viewport.Cursor());
127         prog.SetBG(bg);
128         prog.SetFG(fg);
129         Text::Render(viewport);
130 }
131
132 void Text::Render(Viewport &viewport) noexcept {
133         if (dirty) {
134                 Update();
135         }
136         BlendedSprite &prog = viewport.SpriteProgram();
137         prog.SetTexture(tex);
138         sprite.Draw();
139 }
140
141 }