New XML System, first pass.
This commit is contained in:
@ -122,6 +122,7 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
|
||||
|
||||
// Reset
|
||||
lines.clear();
|
||||
textureMap.clear();
|
||||
|
||||
// Determine font dimensions.
|
||||
auto itText = newTexts.begin();
|
||||
|
@ -29,33 +29,33 @@ void UIRichTextLabel::onStart() {
|
||||
}
|
||||
|
||||
std::function<void(Xml*)> parseChildren = [&](Xml *node) {
|
||||
if(node->children.empty()) {
|
||||
if(node->node == "root") return;
|
||||
struct UILabelText text;
|
||||
text.style = current;
|
||||
text.text = node->value;
|
||||
bufferTexts.push_back(text);
|
||||
} else {
|
||||
auto itNode = node->children.begin();
|
||||
while(itNode != node->children.end()) {
|
||||
auto child = *itNode;
|
||||
assertTrue(child->node == "font");
|
||||
auto itChildren = node->childNodes.begin();
|
||||
while(itChildren != node->childNodes.end()) {
|
||||
auto child = *itChildren;
|
||||
if(child.nodeType == XML_NODE_TYPE_TEXT) {
|
||||
struct UILabelText text;
|
||||
text.style = current;
|
||||
text.text = child.value;
|
||||
bufferTexts.push_back(text);
|
||||
} else if(child.nodeType == XML_NODE_TYPE_ELEMENT) {
|
||||
auto node = child.child;
|
||||
assertTrue(node->node == "font");
|
||||
|
||||
struct UILabelStyle style;
|
||||
if(child->attributes.contains("font")) {
|
||||
style.font = this->getGame()->assetManager.get<TrueTypeAsset>(child->attributes["font"]);
|
||||
if(node->attributes.contains("font")) {
|
||||
style.font = this->getGame()->assetManager.get<TrueTypeAsset>(node->attributes["font"]);
|
||||
} else {
|
||||
style.font = current.font;
|
||||
}
|
||||
|
||||
if(child->attributes.contains("size")) {
|
||||
style.size = std::stoi(child->attributes["size"]);
|
||||
if(node->attributes.contains("size")) {
|
||||
style.size = std::stoi(node->attributes["size"]);
|
||||
} else {
|
||||
style.size = current.size;
|
||||
}
|
||||
|
||||
if(child->attributes.contains("style")) {
|
||||
std::string s = child->attributes["style"];
|
||||
if(node->attributes.contains("style")) {
|
||||
std::string s = node->attributes["style"];
|
||||
style.style = 0;
|
||||
if(s.find("bold") != std::string::npos) style.style |= TRUE_TYPE_VARIANT_BOLD;
|
||||
if(s.find("italic") != std::string::npos) style.style |= TRUE_TYPE_VARIANT_ITALICS;
|
||||
@ -63,25 +63,23 @@ void UIRichTextLabel::onStart() {
|
||||
style.style = current.style;
|
||||
}
|
||||
|
||||
if(child->attributes.contains("color")) {
|
||||
style.color = Color::fromString(child->attributes["color"]);
|
||||
if(node->attributes.contains("color")) {
|
||||
style.color = Color::fromString(node->attributes["color"]);
|
||||
} else {
|
||||
style.color = current.color;
|
||||
}
|
||||
|
||||
styleStack.push_back(style);
|
||||
current = style;
|
||||
|
||||
parseChildren(child);
|
||||
|
||||
parseChildren(node);
|
||||
styleStack.pop_back();
|
||||
current = styleStack.back();
|
||||
++itNode;
|
||||
}
|
||||
++itChildren;
|
||||
}
|
||||
};
|
||||
|
||||
auto root = Xml::load("<root>" + ((std::string)this->richText) + "</root>");
|
||||
auto root = Xml::load("<root><font font=\"font_main\">" + ((std::string)this->richText) + "</font></root>");
|
||||
parseChildren(&root);
|
||||
this->rebufferQuads(bufferTexts);
|
||||
}, this->richText)();
|
||||
|
Reference in New Issue
Block a user