add 'selected' property to selectbox

This commit is contained in:
MihailRis 2025-06-28 13:42:38 +03:00
parent 1c8cafbb68
commit 2aff1a39eb

View File

@ -288,8 +288,11 @@ static std::wstring parse_inner_text(
const xml::xmlelement& element, const std::string& context
) {
std::wstring text = L"";
if (element.size() == 1) {
std::string source = element.sub(0).getInnerText();
for (const auto& elem : element.getElements()) {
if (!elem->isText()) {
continue;
}
std::string source = elem->getInnerText();
util::trim(source);
text = util::str2wstr_utf8(source);
if (text[0] == '@') {
@ -299,6 +302,7 @@ static std::wstring parse_inner_text(
text = langs::get(text.substr(1), util::str2wstr_utf8(context));
}
}
break;
}
return text;
}
@ -437,6 +441,7 @@ static std::shared_ptr<UINode> read_select(
auto& elements = element.getElements();
std::vector<SelectBox::Option> options;
SelectBox::Option selected;
for (const auto& elem : elements) {
const auto& tag = elem->getTag();
if (tag != "option") {
@ -444,11 +449,26 @@ static std::shared_ptr<UINode> read_select(
}
auto value = elem->attr("value").getText();
auto text = parse_inner_text(*elem, reader.getContext());
SelectBox::Option option {std::move(value), std::move(text)};
if (elem->attr("selected", "false").asBool()) {
selected = option;
options.push_back(SelectBox::Option {std::move(value), std::move(text)});
}
options.push_back(std::move(option));
if (element.has("selected")) {
auto selectedValue = element.attr("selected").getText();
selected.value = selectedValue;
selected.text = L"";
for (const auto& option : options) {
if (option.value == selectedValue) {
selected.text = option.text;
}
}
if (selected.text.empty()) {
selected.text = util::str2wstr_utf8(selected.value);
}
}
auto innerText = parse_inner_text(element, "");
if (!innerText.empty()) {
selected.text = innerText;
}
auto selectBox = std::make_shared<SelectBox>(