xml: second Button constructor support

This commit is contained in:
MihailRis 2024-03-19 15:13:08 +03:00
parent 8b8bc55ff7
commit bd2eb13118
2 changed files with 25 additions and 18 deletions

View File

@ -244,12 +244,11 @@ std::shared_ptr<Panel> create_worlds_panel(Engine* engine) {
});
btn->add(std::make_shared<Label>(namews), glm::vec2(8, 8));
auto image = std::make_shared<Image>("gui/delete_icon", glm::vec2(32, 32));
image->setColor(glm::vec4(1, 1, 1, 0.5f));
auto delbtn = std::make_shared<Button>(image, glm::vec4(2));
delbtn->setColor(glm::vec4(0.0f));
delbtn->setHoverColor(glm::vec4(1.0f, 1.0f, 1.0f, 0.17f));
auto delbtn = std::dynamic_pointer_cast<Button>(guiutil::create(
"<button color='#00000000' hover-color='#FFFFFF2B' padding='2,2,2,2'>"
" <image src='gui/delete_icon' size='32,32' color='#FFFFFF80'/>"
"</button>"
));
delbtn->listenAction([=](GUI* gui) {
guiutil::confirm(gui, langs::get(L"delete-confirm", L"world")+
L" ("+util::str2wstr_utf8(folder.u8string())+L")", [=]() {
@ -281,8 +280,7 @@ void create_main_menu_panel(Engine* engine) {
}
void create_404_page(Engine* engine) {
auto menu = engine->getGUI()->getMenu();
auto menu = engine->getGUI()->getMenu();
auto panel = menus::create_page(engine, "404", 400, 0.0f, 8);
panel->add(guiutil::create("<label context='menu'>@Page does not exists</label>"));
panel->add(guiutil::backButton(menu));

View File

@ -118,7 +118,7 @@ void UiXmlReader::readUINode(UiXmlReader& reader, xml::xmlelement element, UINod
_readUINode(reader, element, node);
}
static void _readPanel(UiXmlReader& reader, xml::xmlelement element, Panel& panel) {
static void _readPanel(UiXmlReader& reader, xml::xmlelement element, Panel& panel, bool subnodes=true) {
_readUINode(reader, element, panel);
if (element->has("padding")) {
@ -136,12 +136,14 @@ static void _readPanel(UiXmlReader& reader, xml::xmlelement element, Panel& pane
if (element->has("max-length")) {
panel.setMaxLength(element->attr("max-length").asInt());
}
for (auto& sub : element->getElements()) {
if (sub->isText())
continue;
auto subnode = reader.readUINode(sub);
if (subnode) {
panel.add(subnode);
if (subnodes) {
for (auto& sub : element->getElements()) {
if (sub->isText())
continue;
auto subnode = reader.readUINode(sub);
if (subnode) {
panel.add(subnode);
}
}
}
}
@ -197,9 +199,16 @@ static std::shared_ptr<UINode> readPanel(UiXmlReader& reader, xml::xmlelement el
}
static std::shared_ptr<UINode> readButton(UiXmlReader& reader, xml::xmlelement element) {
std::wstring text = readAndProcessInnerText(element, reader.getContext());
auto button = std::make_shared<Button>(text, glm::vec4(0.0f), nullptr);
_readPanel(reader, element, *button);
std::shared_ptr<Button> button;
if (!element->getElements().empty()) {
glm::vec4 padding = element->attr("padding", "0,0,0,0").asVec4();
button = std::make_shared<Button>(reader.readUINode(element->getElements().at(0)), padding);
_readPanel(reader, element, *button, false);
} else {
std::wstring text = readAndProcessInnerText(element, reader.getContext());
button = std::make_shared<Button>(text, glm::vec4(0.0f), nullptr);
_readPanel(reader, element, *button, true);
}
if (element->has("onclick")) {
auto callback = scripting::create_runnable(