Add TextView UI component
This commit is contained in:
1 parent
e799b4ec79
commit
a1d54b01b0
3 files changed
+87
-1
No files matched your search
+49
-1
@@ -1,5 +1,6 @@
|
||||
#include "UiManager.h"
|
||||
#include "utils/Utils.h"
|
||||
#include "render/TextRenderer.h"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
@@ -205,6 +206,7 @@ namespace ZL {
|
||||
layoutNode(root);
|
||||
buttons.clear();
|
||||
sliders.clear();
|
||||
textViews.clear();
|
||||
collectButtonsAndSliders(root);
|
||||
|
||||
nodeActiveAnims.clear();
|
||||
@@ -327,6 +329,29 @@ namespace ZL {
|
||||
}
|
||||
}
|
||||
|
||||
if (node->type == "TextView") {
|
||||
auto tv = std::make_shared<UiTextView>();
|
||||
tv->name = node->name;
|
||||
tv->rect = node->rect;
|
||||
|
||||
if (j.contains("text")) tv->text = j["text"].get<std::string>();
|
||||
if (j.contains("fontPath")) tv->fontPath = j["fontPath"].get<std::string>();
|
||||
if (j.contains("fontSize")) tv->fontSize = j["fontSize"].get<int>();
|
||||
if (j.contains("color") && j["color"].is_array() && j["color"].size() == 4) {
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
tv->color[i] = j["color"][i].get<float>();
|
||||
}
|
||||
}
|
||||
if (j.contains("centered")) tv->centered = j["centered"].get<bool>();
|
||||
|
||||
tv->textRenderer = std::make_unique<TextRenderer>();
|
||||
if (!tv->textRenderer->init(renderer, tv->fontPath, tv->fontSize)) {
|
||||
std::cerr << "Failed to init TextRenderer for TextView: " << tv->name << std::endl;
|
||||
}
|
||||
|
||||
node->textView = tv;
|
||||
}
|
||||
|
||||
if (j.contains("children") && j["children"].is_array()) {
|
||||
for (const auto& ch : j["children"]) {
|
||||
node->children.push_back(parseNode(ch, renderer, zipFile));
|
||||
@@ -376,7 +401,10 @@ namespace ZL {
|
||||
if (node->slider) {
|
||||
sliders.push_back(node->slider);
|
||||
}
|
||||
for (auto& c : node->children) collectButtonsAndSliders(c);
|
||||
if (node->textView) {
|
||||
textViews.push_back(node->textView);
|
||||
}
|
||||
for (auto& c : node->children) collectButtonsAndSliders(c); // ìîæíî ïåðåèìåíîâàòü â collectControls
|
||||
}
|
||||
|
||||
bool UiManager::setButtonCallback(const std::string& name, std::function<void(const std::string&)> cb) {
|
||||
@@ -532,6 +560,9 @@ namespace ZL {
|
||||
for (const auto& s : sliders) {
|
||||
s->draw(renderer);
|
||||
}
|
||||
for (const auto& tv : textViews) {
|
||||
tv->draw(renderer);
|
||||
}
|
||||
|
||||
renderer.PopMatrix();
|
||||
renderer.PopProjectionMatrix();
|
||||
@@ -862,4 +893,21 @@ namespace ZL {
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<UiTextView> UiManager::findTextView(const std::string& name) {
|
||||
for (auto& tv : textViews) {
|
||||
if (tv->name == name) return tv;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool UiManager::setText(const std::string& name, const std::string& newText) {
|
||||
auto tv = findTextView(name);
|
||||
if (!tv) {
|
||||
std::cerr << "TextView not found: " << name << std::endl;
|
||||
return false;
|
||||
}
|
||||
tv->text = newText;
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace ZL
|
||||
Reference in new issue
Block a user