Added support for specifying a theme name in the capabilities.xml file.

This commit is contained in:
Leon Styhre 2023-01-20 18:37:32 +01:00
parent 0b7e9dc7c9
commit 623540dd35
4 changed files with 39 additions and 10 deletions

View file

@ -106,16 +106,32 @@ void GuiMenu::openUIOptions()
auto themeSet = auto themeSet =
std::make_shared<OptionListComponent<std::string>>(getHelpStyle(), "THEME SET", false); std::make_shared<OptionListComponent<std::string>>(getHelpStyle(), "THEME SET", false);
// Theme selection. // Theme set.
if (!themeSets.empty()) { if (!themeSets.empty()) {
selectedSet = themeSets.find(Settings::getInstance()->getString("ThemeSet")); selectedSet = themeSets.find(Settings::getInstance()->getString("ThemeSet"));
if (selectedSet == themeSets.cend()) if (selectedSet == themeSets.cend())
selectedSet = themeSets.cbegin(); selectedSet = themeSets.cbegin();
std::vector<std::pair<std::string, std::pair<std::string, ThemeData::ThemeSet>>>
for (auto it = themeSets.cbegin(); it != themeSets.cend(); ++it) { themeSetsSorted;
std::string sortName;
for (auto& theme : themeSets) {
if (theme.second.capabilities.themeName != "")
sortName = theme.second.capabilities.themeName;
else
sortName = theme.first;
themeSetsSorted.emplace_back(std::make_pair(Utils::String::toUpper(sortName),
std::make_pair(theme.first, theme.second)));
}
std::sort(themeSetsSorted.begin(), themeSetsSorted.end(),
[](const auto& a, const auto& b) { return a.first < b.first; });
for (auto it = themeSetsSorted.cbegin(); it != themeSetsSorted.cend(); ++it) {
// If required, abbreviate the theme set name so it doesn't overlap the setting name. // If required, abbreviate the theme set name so it doesn't overlap the setting name.
const float maxNameLength = mSize.x * 0.62f; const float maxNameLength {mSize.x * 0.62f};
themeSet->add(it->first, it->first, it == selectedSet, maxNameLength); std::string themeName {(*it).first};
if ((*it).second.second.capabilities.legacyTheme)
themeName.append(" [LEGACY]");
themeSet->add(themeName, it->second.first, (*it).second.first == selectedSet->first,
maxNameLength);
} }
s->addWithLabel("THEME SET", themeSet); s->addWithLabel("THEME SET", themeSet);
s->addSaveFunc([this, themeSet, s] { s->addSaveFunc([this, themeSet, s] {

View file

@ -751,7 +751,7 @@ void ThemeData::populateThemeSets()
Utils::FileSystem::getHomePath() + "/.emulationstation/themes" Utils::FileSystem::getHomePath() + "/.emulationstation/themes"
}; };
for (size_t i = 0; i < pathCount; ++i) { for (size_t i {0}; i < pathCount; ++i) {
if (!Utils::FileSystem::isDirectory(paths[i])) if (!Utils::FileSystem::isDirectory(paths[i]))
continue; continue;
@ -768,12 +768,20 @@ void ThemeData::populateThemeSets()
#endif #endif
ThemeCapability capabilities {parseThemeCapabilities(*it)}; ThemeCapability capabilities {parseThemeCapabilities(*it)};
std::string themeName;
if (capabilities.themeName != "") {
themeName.append(" (theme name \"")
.append(capabilities.themeName)
.append("\")");
}
#if defined(_WIN64) #if defined(_WIN64)
LOG(LogInfo) << "Added" << (capabilities.legacyTheme ? " legacy" : "") LOG(LogInfo) << "Added" << (capabilities.legacyTheme ? " legacy" : "")
<< " theme set \"" << Utils::String::replace(*it, "/", "\\") << "\""; << " theme set \"" << Utils::String::replace(*it, "/", "\\") << "\""
<< themeName;
#else #else
LOG(LogInfo) << "Added" << (capabilities.legacyTheme ? " legacy" : "") LOG(LogInfo) << "Added" << (capabilities.legacyTheme ? " legacy" : "")
<< " theme set \"" << *it << "\""; << " theme set \"" << *it << "\"" << themeName;
#endif #endif
if (!capabilities.legacyTheme) { if (!capabilities.legacyTheme) {
int aspectRatios {0}; int aspectRatios {0};
@ -1026,6 +1034,10 @@ ThemeData::ThemeCapability ThemeData::parseThemeCapabilities(const std::string&
return capabilities; return capabilities;
} }
const pugi::xml_node& themeName {themeCapabilities.child("themeName")};
if (themeName != nullptr)
capabilities.themeName = themeName.text().get();
for (pugi::xml_node aspectRatio {themeCapabilities.child("aspectRatio")}; aspectRatio; for (pugi::xml_node aspectRatio {themeCapabilities.child("aspectRatio")}; aspectRatio;
aspectRatio = aspectRatio.next_sibling("aspectRatio")) { aspectRatio = aspectRatio.next_sibling("aspectRatio")) {
const std::string& value {aspectRatio.text().get()}; const std::string& value {aspectRatio.text().get()};

View file

@ -212,6 +212,7 @@ public:
}; };
struct ThemeCapability { struct ThemeCapability {
std::string themeName;
std::vector<ThemeVariant> variants; std::vector<ThemeVariant> variants;
std::vector<ThemeColorScheme> colorSchemes; std::vector<ThemeColorScheme> colorSchemes;
std::vector<std::string> aspectRatios; std::vector<std::string> aspectRatios;

View file

@ -302,7 +302,7 @@ private:
}; };
HelpStyle mHelpStyle; HelpStyle mHelpStyle;
std::function<void(const std::string&)> mSelectedChangedCallback; std::function<void(const T& object)> mSelectedChangedCallback;
void open() void open()
{ {
@ -357,7 +357,7 @@ private:
mParent->onSizeChanged(); mParent->onSizeChanged();
if (mSelectedChangedCallback) if (mSelectedChangedCallback)
mSelectedChangedCallback(it->name); mSelectedChangedCallback(it->object);
break; break;
} }