fix(SystemTheme): use default palette on all system themes

Signed-off-by: Seth Flynn <getchoo@tuta.io>
(cherry picked from commit e5861129ad58a8b5cdf55ed69bb9a7ce92811b87)
This commit is contained in:
Seth Flynn 2025-04-06 06:40:43 -04:00 committed by github-actions[bot]
parent a96a915d79
commit f00226f797
4 changed files with 22 additions and 10 deletions

View File

@ -40,20 +40,29 @@
#include "HintOverrideProxyStyle.h" #include "HintOverrideProxyStyle.h"
#include "ThemeManager.h" #include "ThemeManager.h"
SystemTheme::SystemTheme(const QString& styleName, bool isDefaultTheme) // See https://github.com/MultiMC/Launcher/issues/1790
// or https://github.com/PrismLauncher/PrismLauncher/issues/490
static const QStringList S_NATIVE_STYLES{ "windows11", "windowsvista", "macos", "system", "windows" };
SystemTheme::SystemTheme(const QString& styleName, const QPalette& defaultPalette, bool isDefaultTheme)
{ {
m_themeName = isDefaultTheme ? "system" : styleName; m_themeName = isDefaultTheme ? "system" : styleName;
m_widgetTheme = styleName; m_widgetTheme = styleName;
auto style = QStyleFactory::create(styleName); // NOTE: SystemTheme is reconstructed on page refresh. We can't accurately determine the system palette here
m_colorPalette = style->standardPalette(); // See also S_NATIVE_STYLES comment
delete style; if (S_NATIVE_STYLES.contains(m_themeName)) {
m_colorPalette = defaultPalette;
} else {
auto style = QStyleFactory::create(styleName);
m_colorPalette = style->standardPalette();
delete style;
}
} }
void SystemTheme::apply(bool initial) void SystemTheme::apply(bool initial)
{ {
// See https://github.com/MultiMC/Launcher/issues/1790 // See S_NATIVE_STYLES comment
// or https://github.com/PrismLauncher/PrismLauncher/issues/490 if (initial && S_NATIVE_STYLES.contains(m_themeName)) {
if (initial && m_themeName == "system") {
QApplication::setStyle(new HintOverrideProxyStyle(QStyleFactory::create(qtTheme()))); QApplication::setStyle(new HintOverrideProxyStyle(QStyleFactory::create(qtTheme())));
return; return;
} }

View File

@ -38,7 +38,7 @@
class SystemTheme : public ITheme { class SystemTheme : public ITheme {
public: public:
SystemTheme(const QString& styleName, bool isDefaultTheme); SystemTheme(const QString& styleName, const QPalette& defaultPalette, bool isDefaultTheme);
virtual ~SystemTheme() {} virtual ~SystemTheme() {}
void apply(bool initial) override; void apply(bool initial) override;

View File

@ -44,6 +44,8 @@ ThemeManager::ThemeManager()
m_defaultStyle = style->objectName(); m_defaultStyle = style->objectName();
themeDebugLog() << "System theme seems to be:" << m_defaultStyle; themeDebugLog() << "System theme seems to be:" << m_defaultStyle;
m_defaultPalette = QApplication::palette();
initializeThemes(); initializeThemes();
initializeCatPacks(); initializeCatPacks();
} }
@ -126,7 +128,7 @@ void ThemeManager::initializeIcons()
void ThemeManager::initializeWidgets() void ThemeManager::initializeWidgets()
{ {
themeDebugLog() << "<> Initializing Widget Themes"; themeDebugLog() << "<> Initializing Widget Themes";
themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique<SystemTheme>(m_defaultStyle, true)); themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique<SystemTheme>(m_defaultStyle, m_defaultPalette, true));
auto darkThemeId = addTheme(std::make_unique<DarkTheme>()); auto darkThemeId = addTheme(std::make_unique<DarkTheme>());
themeDebugLog() << "Loading Built-in Theme:" << darkThemeId; themeDebugLog() << "Loading Built-in Theme:" << darkThemeId;
themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique<BrightTheme>()); themeDebugLog() << "Loading Built-in Theme:" << addTheme(std::make_unique<BrightTheme>());
@ -139,7 +141,7 @@ void ThemeManager::initializeWidgets()
continue; continue;
} }
#endif #endif
themeDebugLog() << "Loading System Theme:" << addTheme(std::make_unique<SystemTheme>(st, false)); themeDebugLog() << "Loading System Theme:" << addTheme(std::make_unique<SystemTheme>(st, m_defaultPalette, false));
} }
// TODO: need some way to differentiate same name themes in different subdirectories // TODO: need some way to differentiate same name themes in different subdirectories

View File

@ -68,6 +68,7 @@ class ThemeManager {
QDir m_applicationThemeFolder{ "themes" }; QDir m_applicationThemeFolder{ "themes" };
QDir m_catPacksFolder{ "catpacks" }; QDir m_catPacksFolder{ "catpacks" };
std::map<QString, std::unique_ptr<CatPack>> m_catPacks; std::map<QString, std::unique_ptr<CatPack>> m_catPacks;
QPalette m_defaultPalette;
QString m_defaultStyle; QString m_defaultStyle;
LogColors m_logColors; LogColors m_logColors;