diff --git a/src/duckstation-qt/qtthemes.cpp b/src/duckstation-qt/qtthemes.cpp index 38c007c92..3cb67939e 100644 --- a/src/duckstation-qt/qtthemes.cpp +++ b/src/duckstation-qt/qtthemes.cpp @@ -15,6 +15,7 @@ #include namespace QtHost { +static void SetThemeAttributes(bool is_variable_color_theme, bool is_dark_theme); static void SetStyleFromSettings(); namespace { @@ -23,6 +24,8 @@ struct State std::string current_theme_name; QString unthemed_style_name; QPalette unthemed_palette; + bool is_variable_color_theme = false; + bool is_dark_theme = false; bool unthemed_style_name_set = false; }; } // namespace @@ -49,16 +52,27 @@ void QtHost::UpdateApplicationTheme() SetIconThemeFromStyle(); } +void QtHost::SetThemeAttributes(bool is_variable_color_theme, bool is_dark_theme) +{ + s_state.is_variable_color_theme = is_variable_color_theme; + s_state.is_dark_theme = is_dark_theme; + + if (is_variable_color_theme) + qApp->styleHints()->unsetColorScheme(); + else + qApp->styleHints()->setColorScheme(is_dark_theme ? Qt::ColorScheme::Dark : Qt::ColorScheme::Light); +} + void QtHost::SetStyleFromSettings() { const TinyString theme = Host::GetBaseTinyStringSettingValue("UI", "Theme", QtHost::GetDefaultThemeName()); if (theme == "qdarkstyle") { + SetThemeAttributes(false, true); qApp->setStyle(s_state.unthemed_style_name); qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); QFile f(QStringLiteral(":qdarkstyle/style.qss")); if (f.open(QFile::ReadOnly | QFile::Text)) @@ -66,14 +80,15 @@ void QtHost::SetStyleFromSettings() } else if (theme == "fusion") { + SetThemeAttributes(true, false); qApp->setStyle(QStyleFactory::create("Fusion")); qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); - qApp->styleHints()->unsetColorScheme(); } else if (theme == "darkfusion") { // adapted from https://gist.github.com/QuantumCD/6245215 + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor lighterGray(75, 75, 75); @@ -105,11 +120,11 @@ void QtHost::SetStyleFromSettings() qApp->setPalette(darkPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); } else if (theme == "darkfusionblue") { // adapted from https://gist.github.com/QuantumCD/6245215 + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); // static constexpr QColor lighterGray(75, 75, 75); @@ -142,10 +157,10 @@ void QtHost::SetStyleFromSettings() qApp->setPalette(darkPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); } else if (theme == "darkerfusion") { + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor window_color(36, 36, 36); @@ -181,7 +196,6 @@ void QtHost::SetStyleFromSettings() qApp->setPalette(darkPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); // menus are by far the ugliest part of fusion, so we style them manually const QString stylesheet = QStringLiteral(R"( @@ -228,13 +242,13 @@ QToolBar { )"); qApp->setStyleSheet(stylesheet); - } else if (theme == "cobaltsky") { // Custom palette by KamFretoZ, A soothing deep royal blue // that are meant to be easy on the eyes as the main color. // Alternative dark theme. + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor gray(150, 150, 150); @@ -266,10 +280,10 @@ QToolBar { qApp->setPalette(darkPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); } else if (theme == "greymatter") { + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor darkGray(46, 52, 64); @@ -300,12 +314,12 @@ QToolBar { qApp->setPalette(darkPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); } else if (theme == "greengiant") { // Custom palette by RedDevilus, Tame (Light/Washed out) Green as main color and Grayish Blue as complimentary. // Alternative white theme. + SetThemeAttributes(false, false); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor black(25, 25, 25); @@ -335,10 +349,10 @@ QToolBar { qApp->setPalette(greenGiantPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Light); } else if (theme == "pinkypals") { + SetThemeAttributes(false, false); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor black(25, 25, 25); @@ -369,13 +383,13 @@ QToolBar { qApp->setPalette(PinkyPalsPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Light); } else if (theme == "AMOLED") { // Custom palette by KamFretoZ, A pure concentrated darkness // of a theme designed for maximum eye comfort and benefits // OLED screens. + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor black(0, 0, 0); @@ -406,10 +420,10 @@ QToolBar { qApp->setPalette(AMOLEDPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); } else if (theme == "darkruby") { + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor gray(128, 128, 128); @@ -438,10 +452,10 @@ QToolBar { qApp->setPalette(darkPalette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); } else if (theme == "purplerain") { + SetThemeAttributes(false, true); qApp->setStyle(QStyleFactory::create("Fusion")); static constexpr QColor darkPurple(73, 41, 121); @@ -471,29 +485,29 @@ QToolBar { qApp->setPalette(darkPalette); qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #505a70; border: 1px solid white; }"); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark); } #ifdef _WIN32 else if (theme == "windowsvista") { + SetThemeAttributes(false, false); qApp->setStyle(QStyleFactory::create("windowsvista")); qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); - qApp->styleHints()->setColorScheme(Qt::ColorScheme::Light); } #endif else { + SetThemeAttributes(true, false); qApp->setStyle(s_state.unthemed_style_name); qApp->setPalette(s_state.unthemed_palette); qApp->setStyleSheet(QString()); - qApp->styleHints()->unsetColorScheme(); } } bool QtHost::IsDarkApplicationTheme() { - return (qApp->styleHints()->colorScheme() == Qt::ColorScheme::Dark); + return s_state.is_variable_color_theme ? (qApp->styleHints()->colorScheme() == Qt::ColorScheme::Dark) : + s_state.is_dark_theme; } void QtHost::SetIconThemeFromStyle()