]> git.localhorst.tv Git - blobs.git/blob - src/ui/ui.cpp
shoddy meters
[blobs.git] / src / ui / ui.cpp
1 #include "CreaturePanel.hpp"
2
3 #include "Label.hpp"
4 #include "Meter.hpp"
5 #include "../app/Assets.hpp"
6 #include "../creature/Creature.hpp"
7 #include "../graphics/Viewport.hpp"
8
9 #include <glm/gtx/transform.hpp>
10
11
12 namespace blobs {
13 namespace ui {
14
15 CreaturePanel::CreaturePanel(const app::Assets &assets)
16 : assets(assets)
17 , c(nullptr)
18 , name(new Label(assets.fonts.large))
19 , needs(new Panel)
20 , panel() {
21         panel
22                 .Add(name)
23                 ->Add(needs)
24                 ->Padding(glm::vec2(10.0f))
25                 ->Spacing(10.0f)
26                 ->Direction(Panel::VERTICAL)
27                 ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f))
28                 ->Origin(Gravity::NORTH_EAST);
29 }
30
31 CreaturePanel::~CreaturePanel() {
32 }
33
34
35 void CreaturePanel::Show(creature::Creature &cr) {
36         c = &cr;
37         name->Text(c->Name());
38         CreateNeeds();
39 }
40
41 void CreaturePanel::CreateNeeds() {
42         needs->Clear()->Reserve(c->Needs().size());
43         meters.clear();
44         meters.reserve(c->Needs().size());
45         for (auto &need : c->Needs()) {
46                 Label *label = new Label(assets.fonts.medium);
47                 label
48                         ->Text(assets.data.resources[need.resource].label);
49                 Meter *meter = new Meter;
50                 meter
51                         ->Value(1.0f - need.value)
52                         ->Size(glm::vec2(100.0f, assets.fonts.medium.Height()))
53                         ->Padding(glm::vec2(1.0f))
54                         ->Border(1.0f)
55                         ->FillColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f))
56                         ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
57                 Panel *need_panel = new Panel;
58                 need_panel
59                         ->Direction(Panel::HORIZONTAL)
60                         ->Spacing(10.0f)
61                         ->Add(label)
62                         ->Add(meter);
63                 needs->Add(need_panel);
64                 meters.push_back(meter);
65         }
66         panel.Relayout();
67 }
68
69 void CreaturePanel::Hide() noexcept {
70         c = nullptr;
71 }
72
73 void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
74         if (!c) return;
75
76         if (meters.size() != c->Needs().size()) {
77                 CreateNeeds();
78         } else {
79                 auto need = c->Needs().begin();
80                 auto need_end = c->Needs().end();
81                 auto meter = meters.begin();
82                 for (; need != need_end; ++need, ++meter) {
83                         (*meter)->Value(1.0f - need->value)->FillColor(need->IsSatisfied()
84                                 ? glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)
85                                 : glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
86                 }
87         }
88
89         const glm::vec2 margin(20.0f);
90
91         panel.Position(glm::vec3(viewport.Width() - margin.x, margin.y, 0.0f));
92         panel.Draw(assets, viewport);
93 }
94
95 }
96 }