diff --git a/src/duckstation-qt/qtthemes.cpp b/src/duckstation-qt/qtthemes.cpp index 677f8370e..ac7b8e464 100644 --- a/src/duckstation-qt/qtthemes.cpp +++ b/src/duckstation-qt/qtthemes.cpp @@ -9,17 +9,28 @@ #include #include +#include #include #include #include namespace QtHost { static void SetStyleFromSettings(); -} // namespace QtHost -static QString s_unthemed_style_name; -static QPalette s_unthemed_palette; -static bool s_unthemed_style_name_set; +namespace { +struct State +{ + std::string current_theme_name; + QString unthemed_style_name; + QPalette unthemed_palette; + bool unthemed_style_name_set = false; + bool is_variable_color_style = false; +}; +} // namespace + +static State s_state; + +} // namespace QtHost const char* QtHost::GetDefaultThemeName() { @@ -28,11 +39,11 @@ const char* QtHost::GetDefaultThemeName() void QtHost::UpdateApplicationTheme() { - if (!s_unthemed_style_name_set) + if (!s_state.unthemed_style_name_set) { - s_unthemed_style_name_set = true; - s_unthemed_style_name = QApplication::style()->objectName(); - s_unthemed_palette = QApplication::palette(); + s_state.unthemed_style_name_set = true; + s_state.unthemed_style_name = QApplication::style()->objectName(); + s_state.unthemed_palette = QApplication::palette(); } SetStyleFromSettings(); @@ -42,11 +53,12 @@ void QtHost::UpdateApplicationTheme() void QtHost::SetStyleFromSettings() { const TinyString theme = Host::GetBaseTinyStringSettingValue("UI", "Theme", QtHost::GetDefaultThemeName()); + s_state.is_variable_color_style = false; if (theme == "qdarkstyle") { - qApp->setStyle(s_unthemed_style_name); - qApp->setPalette(s_unthemed_palette); + qApp->setStyle(s_state.unthemed_style_name); + qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); QFile f(QStringLiteral(":qdarkstyle/style.qss")); @@ -55,8 +67,9 @@ void QtHost::SetStyleFromSettings() } else if (theme == "fusion") { + s_state.is_variable_color_style = true; qApp->setStyle(QStyleFactory::create("Fusion")); - qApp->setPalette(s_unthemed_palette); + qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); } else if (theme == "darkfusion") @@ -370,31 +383,39 @@ void QtHost::SetStyleFromSettings() else if (theme == "windowsvista") { qApp->setStyle(QStyleFactory::create("windowsvista")); - qApp->setPalette(s_unthemed_palette); + qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); } #endif else { - qApp->setStyle(s_unthemed_style_name); - qApp->setPalette(s_unthemed_palette); + s_state.is_variable_color_style = true; + qApp->setStyle(s_state.unthemed_style_name); + qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); #ifdef __APPLE__ // This is super jank. The native theme on MacOS does not set AlternateBase like the Windows/Fusion themes do, but // instead overrides it in QAbstractItemView. Since this is the only place that AlteranteBase is used, just copy it // across. Why do we need this? Because we're using AlternateBase in hotkey bindings dialog to draw rows manually. - s_unthemed_palette.setColor(QPalette::AlternateBase, - qApp->palette("QAbstractItemView").color(QPalette::AlternateBase)); - qApp->setPalette(s_unthemed_palette); + s_state.unthemed_palette.setColor(QPalette::AlternateBase, + qApp->palette("QAbstractItemView").color(QPalette::AlternateBase)); + qApp->setPalette(s_state.unthemed_palette); #endif } } bool QtHost::IsDarkApplicationTheme() { - QPalette palette = qApp->palette(); - return (palette.windowText().color().value() > palette.window().color().value()); + if (s_state.is_variable_color_style) + { + return (qApp->styleHints()->colorScheme() == Qt::ColorScheme::Dark); + } + else + { + const QPalette palette = qApp->palette(); + return (palette.windowText().color().value() > palette.window().color().value()); + } } void QtHost::SetIconThemeFromStyle()