From d4a0f32dd01ce5d0c1f8cecb4a293dc3221a9b39 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Sat, 31 Aug 2024 12:52:20 +0200 Subject: [PATCH] Added support for using language variables in the theme configuration --- es-core/src/ThemeData.cpp | 46 +++++++++++++++++++++++++++++++++++++++ es-core/src/ThemeData.h | 2 ++ 2 files changed, 48 insertions(+) diff --git a/es-core/src/ThemeData.cpp b/es-core/src/ThemeData.cpp index ae6abefcb..c0915e712 100644 --- a/es-core/src/ThemeData.cpp +++ b/es-core/src/ThemeData.cpp @@ -684,6 +684,9 @@ void ThemeData::loadFile(const std::map& sysDataMap, } if (sCurrentTheme->second.capabilities.languages.size() > 0) { + for (auto& language : sCurrentTheme->second.capabilities.languages) + mLanguages.emplace_back(language); + std::string langSetting {Settings::getInstance()->getString("ThemeLanguage")}; if (langSetting == "automatic") langSetting = Utils::Localization::sCurrentLocale; @@ -715,6 +718,7 @@ void ThemeData::loadFile(const std::map& sysDataMap, parseVariables(root); parseColorSchemes(root); parseFontSizes(root); + parseLanguages(root); parseIncludes(root); parseViews(root); if (root.child("feature") != nullptr) @@ -1701,6 +1705,7 @@ void ThemeData::parseIncludes(const pugi::xml_node& root) parseVariables(theme); parseColorSchemes(theme); parseFontSizes(theme); + parseLanguages(theme); parseIncludes(theme); parseViews(theme); if (theme.child("feature") != nullptr) @@ -1751,6 +1756,7 @@ void ThemeData::parseVariants(const pugi::xml_node& root) parseVariables(node); parseColorSchemes(node); parseFontSizes(node); + parseLanguages(node); parseIncludes(node); parseViews(node); parseAspectRatios(node); @@ -1873,6 +1879,7 @@ void ThemeData::parseAspectRatios(const pugi::xml_node& root) parseVariables(node); parseColorSchemes(node); parseFontSizes(node); + parseLanguages(node); parseIncludes(node); parseViews(node); } @@ -1901,6 +1908,45 @@ void ThemeData::parseTransitions(const pugi::xml_node& root) } } +void ThemeData::parseLanguages(const pugi::xml_node& root) +{ + if (sCurrentTheme == sThemes.end()) + return; + + if (sThemeLanguage == "") + return; + + ThemeException error; + error << "ThemeData::parseLanguages(): "; + error.setFiles(mPaths); + + for (pugi::xml_node node {root.child("language")}; node; node = node.next_sibling("language")) { + if (!node.attribute("name")) + throw error << ": tag missing \"name\" attribute"; + + const std::string delim {" \t\r\n,"}; + const std::string nameAttr {node.attribute("name").as_string()}; + size_t prevOff {nameAttr.find_first_not_of(delim, 0)}; + size_t off {nameAttr.find_first_of(delim, prevOff)}; + std::string viewKey; + while (off != std::string::npos || prevOff != std::string::npos) { + viewKey = nameAttr.substr(prevOff, off - prevOff); + prevOff = nameAttr.find_first_not_of(delim, off); + off = nameAttr.find_first_of(delim, prevOff); + + if (std::find(mLanguages.cbegin(), mLanguages.cend(), viewKey) == mLanguages.cend()) { + throw error << ": value \"" << viewKey + << "\" is not defined in capabilities.xml"; + } + + if (sThemeLanguage == viewKey) { + parseVariables(node); + parseIncludes(node); + } + } + } +} + void ThemeData::parseVariables(const pugi::xml_node& root) { ThemeException error; diff --git a/es-core/src/ThemeData.h b/es-core/src/ThemeData.h index e033b96db..62ca1c9e3 100644 --- a/es-core/src/ThemeData.h +++ b/es-core/src/ThemeData.h @@ -256,6 +256,7 @@ private: void parseVariants(const pugi::xml_node& root); void parseColorSchemes(const pugi::xml_node& root); void parseFontSizes(const pugi::xml_node& root); + void parseLanguages(const pugi::xml_node& root); void parseAspectRatios(const pugi::xml_node& root); void parseTransitions(const pugi::xml_node& root); void parseVariables(const pugi::xml_node& root); @@ -292,6 +293,7 @@ private: std::vector mVariants; std::vector mColorSchemes; std::vector mFontSizes; + std::vector mLanguages; std::string mSelectedVariant; std::string mOverrideVariant; std::string mSelectedColorScheme;