duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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 }