qtthemes.cpp (11526B)
1 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #include "interfacesettingswidget.h" 5 #include "qthost.h" 6 7 #include "common/path.h" 8 9 #include <QtCore/QFile> 10 #include <QtGui/QPalette> 11 #include <QtWidgets/QApplication> 12 #include <QtWidgets/QStyle> 13 #include <QtWidgets/QStyleFactory> 14 15 namespace QtHost { 16 static void SetStyleFromSettings(); 17 } // namespace QtHost 18 19 static QString s_unthemed_style_name; 20 static QPalette s_unthemed_palette; 21 static bool s_unthemed_style_name_set; 22 23 const char* QtHost::GetDefaultThemeName() 24 { 25 return "darkfusion"; 26 } 27 28 void QtHost::UpdateApplicationTheme() 29 { 30 if (!s_unthemed_style_name_set) 31 { 32 s_unthemed_style_name_set = true; 33 s_unthemed_style_name = QApplication::style()->objectName(); 34 s_unthemed_palette = QApplication::palette(); 35 } 36 37 SetStyleFromSettings(); 38 SetIconThemeFromStyle(); 39 } 40 41 void QtHost::SetStyleFromSettings() 42 { 43 const std::string theme = Host::GetBaseStringSettingValue("UI", "Theme", InterfaceSettingsWidget::DEFAULT_THEME_NAME); 44 45 if (theme == "qdarkstyle") 46 { 47 qApp->setStyle(s_unthemed_style_name); 48 qApp->setPalette(s_unthemed_palette); 49 qApp->setStyleSheet(QString()); 50 51 QFile f(QStringLiteral(":qdarkstyle/style.qss")); 52 if (f.open(QFile::ReadOnly | QFile::Text)) 53 qApp->setStyleSheet(f.readAll()); 54 } 55 else if (theme == "fusion") 56 { 57 qApp->setStyle(QStyleFactory::create("Fusion")); 58 qApp->setPalette(s_unthemed_palette); 59 qApp->setStyleSheet(QString()); 60 } 61 else if (theme == "darkfusion") 62 { 63 // adapted from https://gist.github.com/QuantumCD/6245215 64 qApp->setStyle(QStyleFactory::create("Fusion")); 65 66 const QColor lighterGray(75, 75, 75); 67 const QColor darkGray(53, 53, 53); 68 const QColor gray(128, 128, 128); 69 const QColor black(25, 25, 25); 70 const QColor blue(198, 238, 255); 71 72 QPalette darkPalette; 73 darkPalette.setColor(QPalette::Window, darkGray); 74 darkPalette.setColor(QPalette::WindowText, Qt::white); 75 darkPalette.setColor(QPalette::Base, black); 76 darkPalette.setColor(QPalette::AlternateBase, darkGray); 77 darkPalette.setColor(QPalette::ToolTipBase, darkGray); 78 darkPalette.setColor(QPalette::ToolTipText, Qt::white); 79 darkPalette.setColor(QPalette::Text, Qt::white); 80 darkPalette.setColor(QPalette::Button, darkGray); 81 darkPalette.setColor(QPalette::ButtonText, Qt::white); 82 darkPalette.setColor(QPalette::Link, blue); 83 darkPalette.setColor(QPalette::Highlight, lighterGray); 84 darkPalette.setColor(QPalette::HighlightedText, Qt::white); 85 darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); 86 87 darkPalette.setColor(QPalette::Active, QPalette::Button, darkGray); 88 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); 89 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); 90 darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); 91 darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); 92 93 qApp->setPalette(darkPalette); 94 qApp->setStyleSheet(QString()); 95 } 96 else if (theme == "darkfusionblue") 97 { 98 // adapted from https://gist.github.com/QuantumCD/6245215 99 qApp->setStyle(QStyleFactory::create("Fusion")); 100 101 // const QColor lighterGray(75, 75, 75); 102 const QColor darkGray(53, 53, 53); 103 const QColor gray(128, 128, 128); 104 const QColor black(25, 25, 25); 105 const QColor blue(198, 238, 255); 106 const QColor blue2(0, 88, 208); 107 108 QPalette darkPalette; 109 darkPalette.setColor(QPalette::Window, darkGray); 110 darkPalette.setColor(QPalette::WindowText, Qt::white); 111 darkPalette.setColor(QPalette::Base, black); 112 darkPalette.setColor(QPalette::AlternateBase, darkGray); 113 darkPalette.setColor(QPalette::ToolTipBase, blue2); 114 darkPalette.setColor(QPalette::ToolTipText, Qt::white); 115 darkPalette.setColor(QPalette::Text, Qt::white); 116 darkPalette.setColor(QPalette::Button, darkGray); 117 darkPalette.setColor(QPalette::ButtonText, Qt::white); 118 darkPalette.setColor(QPalette::Link, blue); 119 darkPalette.setColor(QPalette::Highlight, blue2); 120 darkPalette.setColor(QPalette::HighlightedText, Qt::white); 121 darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); 122 123 darkPalette.setColor(QPalette::Active, QPalette::Button, gray.darker()); 124 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); 125 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); 126 darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); 127 darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); 128 129 qApp->setPalette(darkPalette); 130 qApp->setStyleSheet(QString()); 131 } 132 else if (theme == "cobaltsky") 133 { 134 // Custom palette by KamFretoZ, A soothing deep royal blue 135 // that are meant to be easy on the eyes as the main color. 136 // Alternative dark theme. 137 qApp->setStyle(QStyleFactory::create("Fusion")); 138 139 const QColor gray(150, 150, 150); 140 const QColor royalBlue(29, 41, 81); 141 const QColor darkishBlue(17, 30, 108); 142 const QColor lighterBlue(25, 32, 130); 143 const QColor highlight(36, 93, 218); 144 const QColor link(0, 202, 255); 145 146 QPalette darkPalette; 147 darkPalette.setColor(QPalette::Window, royalBlue); 148 darkPalette.setColor(QPalette::WindowText, Qt::white); 149 darkPalette.setColor(QPalette::Base, royalBlue.lighter()); 150 darkPalette.setColor(QPalette::AlternateBase, darkishBlue); 151 darkPalette.setColor(QPalette::ToolTipBase, darkishBlue); 152 darkPalette.setColor(QPalette::ToolTipText, Qt::white); 153 darkPalette.setColor(QPalette::Text, Qt::white); 154 darkPalette.setColor(QPalette::Button, lighterBlue); 155 darkPalette.setColor(QPalette::ButtonText, Qt::white); 156 darkPalette.setColor(QPalette::Link, link); 157 darkPalette.setColor(QPalette::Highlight, highlight); 158 darkPalette.setColor(QPalette::HighlightedText, Qt::white); 159 160 darkPalette.setColor(QPalette::Active, QPalette::Button, lighterBlue); 161 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); 162 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); 163 darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); 164 darkPalette.setColor(QPalette::Disabled, QPalette::Light, gray); 165 166 qApp->setPalette(darkPalette); 167 qApp->setStyleSheet(QString()); 168 } 169 else if (theme == "greymatter") 170 { 171 qApp->setStyle(QStyleFactory::create("Fusion")); 172 173 const QColor darkGray(46, 52, 64); 174 const QColor lighterGray(59, 66, 82); 175 const QColor gray(111, 111, 111); 176 const QColor blue(198, 238, 255); 177 178 QPalette darkPalette; 179 darkPalette.setColor(QPalette::Window, darkGray); 180 darkPalette.setColor(QPalette::WindowText, Qt::white); 181 darkPalette.setColor(QPalette::Base, lighterGray); 182 darkPalette.setColor(QPalette::AlternateBase, darkGray); 183 darkPalette.setColor(QPalette::ToolTipBase, darkGray); 184 darkPalette.setColor(QPalette::ToolTipText, Qt::white); 185 darkPalette.setColor(QPalette::Text, Qt::white); 186 darkPalette.setColor(QPalette::Button, lighterGray); 187 darkPalette.setColor(QPalette::ButtonText, Qt::white); 188 darkPalette.setColor(QPalette::Link, blue); 189 darkPalette.setColor(QPalette::Highlight, lighterGray.darker()); 190 darkPalette.setColor(QPalette::HighlightedText, Qt::white); 191 darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); 192 193 darkPalette.setColor(QPalette::Active, QPalette::Button, lighterGray); 194 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray.lighter()); 195 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray.lighter()); 196 darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray.lighter()); 197 darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); 198 199 qApp->setPalette(darkPalette); 200 qApp->setStyleSheet(QString()); 201 } 202 else if (theme == "darkruby") 203 { 204 qApp->setStyle(QStyleFactory::create("Fusion")); 205 206 const QColor gray(128, 128, 128); 207 const QColor slate(18, 18, 18); 208 const QColor rubyish(172, 21, 31); 209 210 QPalette darkPalette; 211 darkPalette.setColor(QPalette::Window, slate); 212 darkPalette.setColor(QPalette::WindowText, Qt::white); 213 darkPalette.setColor(QPalette::Base, slate.lighter()); 214 darkPalette.setColor(QPalette::AlternateBase, slate.lighter()); 215 darkPalette.setColor(QPalette::ToolTipBase, slate); 216 darkPalette.setColor(QPalette::ToolTipText, Qt::white); 217 darkPalette.setColor(QPalette::Text, Qt::white); 218 darkPalette.setColor(QPalette::Button, slate); 219 darkPalette.setColor(QPalette::ButtonText, Qt::white); 220 darkPalette.setColor(QPalette::Link, Qt::white); 221 darkPalette.setColor(QPalette::Highlight, rubyish); 222 darkPalette.setColor(QPalette::HighlightedText, Qt::white); 223 224 darkPalette.setColor(QPalette::Active, QPalette::Button, slate); 225 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); 226 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); 227 darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); 228 darkPalette.setColor(QPalette::Disabled, QPalette::Light, slate.lighter()); 229 230 qApp->setPalette(darkPalette); 231 qApp->setStyleSheet(QString()); 232 } 233 else if (theme == "purplerain") 234 { 235 qApp->setStyle(QStyleFactory::create("Fusion")); 236 237 const QColor darkPurple(73, 41, 121); 238 const QColor darkerPurple(53, 29, 87); 239 const QColor gold(250, 207, 0); 240 241 QPalette darkPalette; 242 darkPalette.setColor(QPalette::Window, darkPurple); 243 darkPalette.setColor(QPalette::WindowText, Qt::white); 244 darkPalette.setColor(QPalette::Base, darkerPurple); 245 darkPalette.setColor(QPalette::AlternateBase, darkPurple); 246 darkPalette.setColor(QPalette::ToolTipBase, darkPurple); 247 darkPalette.setColor(QPalette::ToolTipText, Qt::white); 248 darkPalette.setColor(QPalette::Text, Qt::white); 249 darkPalette.setColor(QPalette::Button, darkerPurple); 250 darkPalette.setColor(QPalette::ButtonText, Qt::white); 251 darkPalette.setColor(QPalette::Link, gold); 252 darkPalette.setColor(QPalette::Highlight, gold); 253 darkPalette.setColor(QPalette::HighlightedText, Qt::black); 254 darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); 255 256 darkPalette.setColor(QPalette::Active, QPalette::Button, darkerPurple); 257 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, darkPurple.lighter()); 258 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, darkPurple.lighter()); 259 darkPalette.setColor(QPalette::Disabled, QPalette::Text, darkPurple.lighter()); 260 darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkPurple); 261 262 qApp->setPalette(darkPalette); 263 qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #505a70; border: 1px solid white; }"); 264 } 265 #ifdef _WIN32 266 else if (theme == "windowsvista") 267 { 268 qApp->setStyle(QStyleFactory::create("windowsvista")); 269 qApp->setPalette(s_unthemed_palette); 270 qApp->setStyleSheet(QString()); 271 } 272 #endif 273 else 274 { 275 qApp->setStyle(s_unthemed_style_name); 276 qApp->setPalette(s_unthemed_palette); 277 qApp->setStyleSheet(QString()); 278 } 279 } 280 281 bool QtHost::IsDarkApplicationTheme() 282 { 283 QPalette palette = qApp->palette(); 284 return (palette.windowText().color().value() > palette.window().color().value()); 285 } 286 287 void QtHost::SetIconThemeFromStyle() 288 { 289 const bool dark = IsDarkApplicationTheme(); 290 QIcon::setThemeName(dark ? QStringLiteral("white") : QStringLiteral("black")); 291 }