diff --git a/pcsx2-qt/CMakeLists.txt b/pcsx2-qt/CMakeLists.txt index 39134fcc3e..99951fe682 100644 --- a/pcsx2-qt/CMakeLists.txt +++ b/pcsx2-qt/CMakeLists.txt @@ -24,6 +24,8 @@ target_sources(pcsx2-qt PRIVATE MainWindow.ui PrecompiledHeader.cpp PrecompiledHeader.h + SettingWidgetBinder.h + Themes.cpp QtHost.cpp QtHost.h QtKeyCodes.cpp @@ -31,7 +33,6 @@ target_sources(pcsx2-qt PRIVATE QtProgressCallback.h QtUtils.cpp QtUtils.h - SettingWidgetBinder.h GameList/EmptyGameListWidget.ui GameList/GameListModel.cpp GameList/GameListModel.h diff --git a/pcsx2-qt/MainWindow.cpp b/pcsx2-qt/MainWindow.cpp index 0a2a8e4e46..d38c553840 100644 --- a/pcsx2-qt/MainWindow.cpp +++ b/pcsx2-qt/MainWindow.cpp @@ -66,7 +66,6 @@ #include "pcsx2/Frontend/Achievements.h" #endif - const char* MainWindow::OPEN_FILE_FILTER = QT_TRANSLATE_NOOP("MainWindow", "All File Types (*.bin *.iso *.cue *.chd *.cso *.gz *.elf *.irx *.gs *.gs.xz *.gs.zst *.dump);;" "Single-Track Raw Images (*.bin *.iso);;" @@ -87,15 +86,7 @@ const char* MainWindow::DISC_IMAGE_FILTER = QT_TRANSLATE_NOOP("MainWindow", "All "GZ Images (*.gz);;" "Block Dumps (*.dump)"); -#ifdef __APPLE__ -const char* MainWindow::DEFAULT_THEME_NAME = ""; -#else -const char* MainWindow::DEFAULT_THEME_NAME = "darkfusion"; -#endif - MainWindow* g_main_window = nullptr; -static QString s_unthemed_style_name; -static bool s_unthemed_style_name_set; #if defined(_WIN32) || defined(__APPLE__) static const bool s_use_central_widget = false; @@ -502,456 +493,7 @@ void MainWindow::resetSettings(bool ui) g_main_window->recreateSettings(); } -void MainWindow::updateApplicationTheme() -{ - if (!s_unthemed_style_name_set) - { - s_unthemed_style_name_set = true; - s_unthemed_style_name = QApplication::style()->objectName(); - } - setStyleFromSettings(); - setIconThemeFromStyle(); -} - -void MainWindow::setStyleFromSettings() -{ - const std::string theme(Host::GetBaseStringSettingValue("UI", "Theme", DEFAULT_THEME_NAME)); - - if (theme == "fusion") - { - // setPalette() shouldn't be necessary, as the documentation claims that setStyle() resets the palette, but it - // is here, to work around a bug in 6.4.x and 6.5.x where the palette doesn't restore after changing themes. - qApp->setPalette(QPalette()); - qApp->setStyle(QStyleFactory::create("Fusion")); - qApp->setStyleSheet(QString()); - } - else if (theme == "darkfusion") - { - // adapted from https://gist.github.com/QuantumCD/6245215 - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor lighterGray(75, 75, 75); - const QColor darkGray(53, 53, 53); - const QColor gray(128, 128, 128); - const QColor black(25, 25, 25); - const QColor blue(198, 238, 255); - - QPalette darkPalette; - darkPalette.setColor(QPalette::Window, darkGray); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, black); - darkPalette.setColor(QPalette::AlternateBase, darkGray); - darkPalette.setColor(QPalette::ToolTipBase, darkGray); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Button, darkGray); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Link, blue); - darkPalette.setColor(QPalette::Highlight, lighterGray); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); - - darkPalette.setColor(QPalette::Active, QPalette::Button, darkGray); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); - - qApp->setPalette(darkPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "darkfusionblue") - { - // adapted from https://gist.github.com/QuantumCD/6245215 - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor darkGray(53, 53, 53); - const QColor gray(128, 128, 128); - const QColor black(25, 25, 25); - const QColor blue(198, 238, 255); - const QColor blue2(0, 88, 208); - - QPalette darkPalette; - darkPalette.setColor(QPalette::Window, darkGray); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, black); - darkPalette.setColor(QPalette::AlternateBase, darkGray); - darkPalette.setColor(QPalette::ToolTipBase, blue2); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Button, darkGray); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Link, blue); - darkPalette.setColor(QPalette::Highlight, blue2); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); - - darkPalette.setColor(QPalette::Active, QPalette::Button, darkGray); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); - - qApp->setPalette(darkPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "UntouchedLagoon") - { - // Custom palette by RedDevilus, Tame (Light/Washed out) Green as main color and Grayish Blue as complimentary. - // Alternative white theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor black(25, 25, 25); - const QColor darkteal(0, 77, 77); - const QColor teal(0, 128, 128); - const QColor tameTeal(160, 190, 185); - const QColor grayBlue(160, 180, 190); - - QPalette standardPalette; - standardPalette.setColor(QPalette::Window, tameTeal); - standardPalette.setColor(QPalette::WindowText, black.lighter()); - standardPalette.setColor(QPalette::Base, grayBlue); - standardPalette.setColor(QPalette::AlternateBase, tameTeal); - standardPalette.setColor(QPalette::ToolTipBase, tameTeal); - standardPalette.setColor(QPalette::ToolTipText, grayBlue); - standardPalette.setColor(QPalette::Text, black); - standardPalette.setColor(QPalette::Button, tameTeal); - standardPalette.setColor(QPalette::ButtonText, black); - standardPalette.setColor(QPalette::Link, black.lighter()); - standardPalette.setColor(QPalette::Highlight, teal); - standardPalette.setColor(QPalette::HighlightedText, grayBlue.lighter()); - - standardPalette.setColor(QPalette::Active, QPalette::Button, tameTeal); - standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, darkteal); - standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, darkteal.lighter()); - standardPalette.setColor(QPalette::Disabled, QPalette::Text, darkteal.lighter()); - standardPalette.setColor(QPalette::Disabled, QPalette::Light, tameTeal); - - qApp->setPalette(standardPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "BabyPastel") - { - // Custom palette by RedDevilus, Blue as main color and blue as complimentary. - // Alternative light theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor gray(150, 150, 150); - const QColor black(25, 25, 25); - const QColor redpinkish(200, 75, 132); - const QColor pink(255, 174, 201); - const QColor brightPink(255, 230, 255); - const QColor congoPink(255, 127, 121); - const QColor blue(221, 225, 239); - - QPalette standardPalette; - standardPalette.setColor(QPalette::Window, pink); - standardPalette.setColor(QPalette::WindowText, black); - standardPalette.setColor(QPalette::Base, brightPink); - standardPalette.setColor(QPalette::AlternateBase, blue); - standardPalette.setColor(QPalette::ToolTipBase, pink); - standardPalette.setColor(QPalette::ToolTipText, brightPink); - standardPalette.setColor(QPalette::Text, black); - standardPalette.setColor(QPalette::Button, pink); - standardPalette.setColor(QPalette::ButtonText, black); - standardPalette.setColor(QPalette::Link, black); - standardPalette.setColor(QPalette::Highlight, congoPink); - standardPalette.setColor(QPalette::HighlightedText, black); - - standardPalette.setColor(QPalette::Active, QPalette::Button, pink); - standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, redpinkish); - standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, redpinkish); - standardPalette.setColor(QPalette::Disabled, QPalette::Text, redpinkish); - standardPalette.setColor(QPalette::Disabled, QPalette::Light, gray); - - qApp->setPalette(standardPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "PizzaBrown") - { - // Custom palette by KamFretoZ, a Pizza Tower Reference! - // With a mixtures of Light Brown, Peachy/Creamy White, Latte-like Color. - // Thanks to Jordan for the idea :P - // Alternative light theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor gray(128, 128, 128); - const QColor extr(248, 192, 88); - const QColor main(233, 187, 147); - const QColor comp(248, 230, 213); - const QColor highlight(188, 100, 60); - - QPalette standardPalette; - standardPalette.setColor(QPalette::Window, main); - standardPalette.setColor(QPalette::WindowText, Qt::black); - standardPalette.setColor(QPalette::Base, comp); - standardPalette.setColor(QPalette::AlternateBase, extr); - standardPalette.setColor(QPalette::ToolTipBase, comp); - standardPalette.setColor(QPalette::ToolTipText, Qt::black); - standardPalette.setColor(QPalette::Text, Qt::black); - standardPalette.setColor(QPalette::Button, extr); - standardPalette.setColor(QPalette::ButtonText, Qt::black); - standardPalette.setColor(QPalette::Link, Qt::black); - standardPalette.setColor(QPalette::Highlight, highlight); - standardPalette.setColor(QPalette::HighlightedText, Qt::white); - standardPalette.setColor(QPalette::Active, QPalette::Button, extr); - standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray.darker()); - standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray.darker()); - standardPalette.setColor(QPalette::Disabled, QPalette::Text, Qt::gray); - standardPalette.setColor(QPalette::Disabled, QPalette::Light, gray.lighter()); - - qApp->setPalette(standardPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #cc3f18; border: 1px solid white; }"); - } - else if (theme == "PCSX2Blue") - { - // Custom palette by RedDevilus, White as main color and Blue as complimentary. - // Alternative light theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor blackish(35, 35, 35); - const QColor darkBlue(73, 97, 177); - const QColor blue2(80, 120, 200); - const QColor blue(106, 156, 255); - const QColor lightBlue(130, 155, 241); - - QPalette standardPalette; - standardPalette.setColor(QPalette::Window, blue2.lighter()); - standardPalette.setColor(QPalette::WindowText, blackish); - standardPalette.setColor(QPalette::Base, lightBlue); - standardPalette.setColor(QPalette::AlternateBase, blue2.lighter()); - standardPalette.setColor(QPalette::ToolTipBase, blue2); - standardPalette.setColor(QPalette::ToolTipText, Qt::white); - standardPalette.setColor(QPalette::Text, blackish); - standardPalette.setColor(QPalette::Button, blue); - standardPalette.setColor(QPalette::ButtonText, blackish); - standardPalette.setColor(QPalette::Link, darkBlue); - standardPalette.setColor(QPalette::Highlight, Qt::white); - standardPalette.setColor(QPalette::HighlightedText, blackish); - - standardPalette.setColor(QPalette::Active, QPalette::Button, blue); - standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, darkBlue); - standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, darkBlue); - standardPalette.setColor(QPalette::Disabled, QPalette::Text, darkBlue); - standardPalette.setColor(QPalette::Disabled, QPalette::Light, darkBlue); - - qApp->setPalette(standardPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "ScarletDevilRed") - { - // Custom palette by RedDevilus, Red as main color and Purple as complimentary. - // Alternative dark theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor darkRed(80, 45, 69); - const QColor purplishRed(120, 45, 69); - const QColor brightRed(200, 45, 69); - - QPalette darkPalette; - darkPalette.setColor(QPalette::Window, darkRed); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, purplishRed); - darkPalette.setColor(QPalette::AlternateBase, darkRed); - darkPalette.setColor(QPalette::ToolTipBase, darkRed); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Button, purplishRed.darker()); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Link, brightRed); - darkPalette.setColor(QPalette::Highlight, brightRed); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - - darkPalette.setColor(QPalette::Active, QPalette::Button, purplishRed.darker()); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, brightRed); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, brightRed); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, brightRed); - darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkRed); - - qApp->setPalette(darkPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - 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. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor gray(150, 150, 150); - const QColor royalBlue(29, 41, 81); - const QColor darkishBlue(17, 30, 108); - const QColor highlight(36, 93, 218); - - QPalette darkPalette; - darkPalette.setColor(QPalette::Window, royalBlue); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, royalBlue.lighter()); - darkPalette.setColor(QPalette::AlternateBase, darkishBlue); - darkPalette.setColor(QPalette::ToolTipBase, darkishBlue); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Button, darkishBlue); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Link, Qt::white); - darkPalette.setColor(QPalette::Highlight, highlight); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - - darkPalette.setColor(QPalette::Active, QPalette::Button, darkishBlue); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Light, gray); - - qApp->setPalette(darkPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "VioletAngelPurple") - { - // Custom palette by RedDevilus, Blue as main color and Purple as complimentary. - // Alternative dark theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor blackishblue(50, 25, 70); - const QColor darkerPurple(90, 30, 105); - const QColor nauticalPurple(110, 30, 125); - - QPalette darkPalette; - darkPalette.setColor(QPalette::Window, blackishblue); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, nauticalPurple); - darkPalette.setColor(QPalette::AlternateBase, blackishblue); - darkPalette.setColor(QPalette::ToolTipBase, nauticalPurple); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Button, nauticalPurple.darker()); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Link, darkerPurple.lighter()); - darkPalette.setColor(QPalette::Highlight, darkerPurple.lighter()); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - - darkPalette.setColor(QPalette::Active, QPalette::Button, nauticalPurple.darker()); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, darkerPurple.lighter()); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, darkerPurple.lighter()); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, darkerPurple.darker()); - darkPalette.setColor(QPalette::Disabled, QPalette::Light, nauticalPurple); - - qApp->setPalette(darkPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "Ruby") - { - // Custom palette by Daisouji, Black as main color and Red as complimentary. - // Alternative dark (black) theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor gray(128, 128, 128); - const QColor slate(18, 18, 18); - const QColor rubyish(172, 21, 31); - - QPalette darkPalette; - darkPalette.setColor(QPalette::Window, slate); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, slate.lighter()); - darkPalette.setColor(QPalette::AlternateBase, slate.lighter()); - darkPalette.setColor(QPalette::ToolTipBase, slate); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Button, slate); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Link, Qt::white); - darkPalette.setColor(QPalette::Highlight, rubyish); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - - darkPalette.setColor(QPalette::Active, QPalette::Button, slate); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Light, slate.lighter()); - - qApp->setPalette(darkPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "Sapphire") - { - // Custom palette by RedDevilus, Black as main color and Blue as complimentary. - // Alternative dark (black) theme. - qApp->setStyle(QStyleFactory::create("Fusion")); - - const QColor gray(128, 128, 128); - const QColor slate(18, 18, 18); - const QColor persianBlue(32, 35, 204); - - QPalette darkPalette; - darkPalette.setColor(QPalette::Window, slate); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Base, slate.lighter()); - darkPalette.setColor(QPalette::AlternateBase, slate.lighter()); - darkPalette.setColor(QPalette::ToolTipBase, slate); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Button, slate); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Link, Qt::white); - darkPalette.setColor(QPalette::Highlight, persianBlue); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - - darkPalette.setColor(QPalette::Active, QPalette::Button, slate); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); - darkPalette.setColor(QPalette::Disabled, QPalette::Light, slate.lighter()); - - qApp->setPalette(darkPalette); - - qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); - } - else if (theme == "Custom") - { - - //Additional Theme option than loads .qss from main PCSX2 Directory - qApp->setStyle(QStyleFactory::create("Fusion")); - - QString sheet_content; - QFile sheets(QString::fromStdString(Path::Combine(EmuFolders::DataRoot, "custom.qss"))); - - if (sheets.open(QFile::ReadOnly)) - { - QString sheet_content = QString::fromUtf8(sheets.readAll().data()); - qApp->setStyleSheet(sheet_content); - } - else - { - qApp->setStyle(QStyleFactory::create("Fusion")); - } - } - else - { - // setPalette() shouldn't be necessary, as the documentation claims that setStyle() resets the palette, but it - // is here, to work around a bug in 6.4.x and 6.5.x where the palette doesn't restore after changing themes. - qApp->setPalette(QPalette()); - qApp->setStyle(s_unthemed_style_name); - qApp->setStyleSheet(QString()); - } -} - -void MainWindow::setIconThemeFromStyle() -{ - QPalette palette = qApp->palette(); - bool dark = palette.windowText().color().value() > palette.window().color().value(); - QIcon::setThemeName(dark ? QStringLiteral("white") : QStringLiteral("black")); -} void MainWindow::onScreenshotActionTriggered() { @@ -1576,7 +1118,11 @@ void MainWindow::onGameListEntryContextMenuRequested(const QPoint& point) if (m_ui.menuDebug->menuAction()->isVisible()) { action = menu.addAction(tr("Boot and Debug")); - connect(action, &QAction::triggered, [this, entry]() { DebugInterface::setPauseOnEntry(true); startGameListEntry(entry); getDebuggerWindow()->show(); }); + connect(action, &QAction::triggered, [this, entry]() { + DebugInterface::setPauseOnEntry(true); + startGameListEntry(entry); + getDebuggerWindow()->show(); + }); } menu.addSeparator(); @@ -1840,7 +1386,7 @@ void MainWindow::onToolsCoverDownloaderTriggered() void MainWindow::updateTheme() { - updateApplicationTheme(); + QtHost::UpdateApplicationTheme(); m_game_list_widget->refreshImages(); } diff --git a/pcsx2-qt/MainWindow.h b/pcsx2-qt/MainWindow.h index 64b648debc..a1ad4a2b6c 100644 --- a/pcsx2-qt/MainWindow.h +++ b/pcsx2-qt/MainWindow.h @@ -77,9 +77,6 @@ public: bool m_was_fullscreen; }; - /// Default theme name for the platform. - static const char* DEFAULT_THEME_NAME; - /// Default filter for opening a file. static const char* OPEN_FILE_FILTER; @@ -90,9 +87,6 @@ public: MainWindow(); ~MainWindow(); - /// Sets application theme according to settings. - static void updateApplicationTheme(); - void initialize(); void connectVMThreadSignals(EmuThread* thread); void startupUpdateCheck(); diff --git a/pcsx2-qt/QtHost.cpp b/pcsx2-qt/QtHost.cpp index 690307aac8..d6f258493a 100644 --- a/pcsx2-qt/QtHost.cpp +++ b/pcsx2-qt/QtHost.cpp @@ -1250,7 +1250,7 @@ void Host::SetDefaultUISettings(SettingsInterface& si) si.SetBoolValue("UI", "RenderToSeparateWindow", false); si.SetBoolValue("UI", "HideMainWindowWhenRunning", false); si.SetBoolValue("UI", "DisableWindowResize", false); - si.SetStringValue("UI", "Theme", MainWindow::DEFAULT_THEME_NAME); + si.SetStringValue("UI", "Theme", QtHost::GetDefaultThemeName()); } void QtHost::SaveSettings() @@ -1797,7 +1797,7 @@ int main(int argc, char* argv[]) return EXIT_SUCCESS; // Set theme before creating any windows. - MainWindow::updateApplicationTheme(); + QtHost::UpdateApplicationTheme(); MainWindow* main_window = new MainWindow(); // Start up the CPU thread. diff --git a/pcsx2-qt/QtHost.h b/pcsx2-qt/QtHost.h index 7870d80299..a63723726c 100644 --- a/pcsx2-qt/QtHost.h +++ b/pcsx2-qt/QtHost.h @@ -213,6 +213,12 @@ extern EmuThread* g_emu_thread; namespace QtHost { + /// Default theme name for the platform. + const char* GetDefaultThemeName(); + + /// Sets application theme according to settings. + void UpdateApplicationTheme(); + /// Sets batch mode (exit after game shutdown). bool InBatchMode(); diff --git a/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp b/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp index b4e5213241..bceae748bc 100644 --- a/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp +++ b/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp @@ -20,6 +20,7 @@ #include "MainWindow.h" #include "SettingWidgetBinder.h" #include "SettingsDialog.h" +#include "QtHost.h" static const char* THEME_NAMES[] = { QT_TRANSLATE_NOOP("InterfaceSettingsWidget", "Native"), @@ -91,7 +92,7 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsDialog* dialog, QWidget connect(m_ui.renderToSeparateWindow, &QCheckBox::stateChanged, this, &InterfaceSettingsWidget::onRenderToSeparateWindowChanged); SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.theme, "UI", "Theme", THEME_NAMES, THEME_VALUES, - MainWindow::DEFAULT_THEME_NAME); + QtHost::GetDefaultThemeName()); connect(m_ui.theme, QOverload::of(&QComboBox::currentIndexChanged), [this]() { emit themeChanged(); }); // Per-game settings is special, we don't want to bind it if we're editing per-game settings. diff --git a/pcsx2-qt/Themes.cpp b/pcsx2-qt/Themes.cpp new file mode 100644 index 0000000000..d931dfebb4 --- /dev/null +++ b/pcsx2-qt/Themes.cpp @@ -0,0 +1,495 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2023 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "QtHost.h" + +#include "pcsx2/Config.h" +#include "pcsx2/HostSettings.h" + +#include "common/Path.h" + +#include +#include +#include +#include + +namespace QtHost +{ + static void SetStyleFromSettings(); + static void SetIconThemeFromStyle(); +} // namespace QtHost + +static QString s_unthemed_style_name; +static bool s_unthemed_style_name_set; + +const char* QtHost::GetDefaultThemeName() +{ +#ifdef __APPLE__ + return ""; +#else + return "darkfusion"; +#endif +} + +void QtHost::UpdateApplicationTheme() +{ + if (!s_unthemed_style_name_set) + { + s_unthemed_style_name_set = true; + s_unthemed_style_name = QApplication::style()->objectName(); + } + + SetStyleFromSettings(); + SetIconThemeFromStyle(); +} + +void QtHost::SetStyleFromSettings() +{ + const std::string theme(Host::GetBaseStringSettingValue("UI", "Theme", GetDefaultThemeName())); + + if (theme == "fusion") + { + // setPalette() shouldn't be necessary, as the documentation claims that setStyle() resets the palette, but it + // is here, to work around a bug in 6.4.x and 6.5.x where the palette doesn't restore after changing themes. + qApp->setPalette(QPalette()); + qApp->setStyle(QStyleFactory::create("Fusion")); + qApp->setStyleSheet(QString()); + } + else if (theme == "darkfusion") + { + // adapted from https://gist.github.com/QuantumCD/6245215 + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor lighterGray(75, 75, 75); + const QColor darkGray(53, 53, 53); + const QColor gray(128, 128, 128); + const QColor black(25, 25, 25); + const QColor blue(198, 238, 255); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, darkGray); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, black); + darkPalette.setColor(QPalette::AlternateBase, darkGray); + darkPalette.setColor(QPalette::ToolTipBase, darkGray); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, darkGray); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, blue); + darkPalette.setColor(QPalette::Highlight, lighterGray); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); + + darkPalette.setColor(QPalette::Active, QPalette::Button, darkGray); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "darkfusionblue") + { + // adapted from https://gist.github.com/QuantumCD/6245215 + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor darkGray(53, 53, 53); + const QColor gray(128, 128, 128); + const QColor black(25, 25, 25); + const QColor blue(198, 238, 255); + const QColor blue2(0, 88, 208); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, darkGray); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, black); + darkPalette.setColor(QPalette::AlternateBase, darkGray); + darkPalette.setColor(QPalette::ToolTipBase, blue2); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, darkGray); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, blue); + darkPalette.setColor(QPalette::Highlight, blue2); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); + + darkPalette.setColor(QPalette::Active, QPalette::Button, darkGray); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "UntouchedLagoon") + { + // Custom palette by RedDevilus, Tame (Light/Washed out) Green as main color and Grayish Blue as complimentary. + // Alternative white theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor black(25, 25, 25); + const QColor darkteal(0, 77, 77); + const QColor teal(0, 128, 128); + const QColor tameTeal(160, 190, 185); + const QColor grayBlue(160, 180, 190); + + QPalette standardPalette; + standardPalette.setColor(QPalette::Window, tameTeal); + standardPalette.setColor(QPalette::WindowText, black.lighter()); + standardPalette.setColor(QPalette::Base, grayBlue); + standardPalette.setColor(QPalette::AlternateBase, tameTeal); + standardPalette.setColor(QPalette::ToolTipBase, tameTeal); + standardPalette.setColor(QPalette::ToolTipText, grayBlue); + standardPalette.setColor(QPalette::Text, black); + standardPalette.setColor(QPalette::Button, tameTeal); + standardPalette.setColor(QPalette::ButtonText, black); + standardPalette.setColor(QPalette::Link, black.lighter()); + standardPalette.setColor(QPalette::Highlight, teal); + standardPalette.setColor(QPalette::HighlightedText, grayBlue.lighter()); + + standardPalette.setColor(QPalette::Active, QPalette::Button, tameTeal); + standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, darkteal); + standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, darkteal.lighter()); + standardPalette.setColor(QPalette::Disabled, QPalette::Text, darkteal.lighter()); + standardPalette.setColor(QPalette::Disabled, QPalette::Light, tameTeal); + + qApp->setPalette(standardPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "BabyPastel") + { + // Custom palette by RedDevilus, Blue as main color and blue as complimentary. + // Alternative light theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor gray(150, 150, 150); + const QColor black(25, 25, 25); + const QColor redpinkish(200, 75, 132); + const QColor pink(255, 174, 201); + const QColor brightPink(255, 230, 255); + const QColor congoPink(255, 127, 121); + const QColor blue(221, 225, 239); + + QPalette standardPalette; + standardPalette.setColor(QPalette::Window, pink); + standardPalette.setColor(QPalette::WindowText, black); + standardPalette.setColor(QPalette::Base, brightPink); + standardPalette.setColor(QPalette::AlternateBase, blue); + standardPalette.setColor(QPalette::ToolTipBase, pink); + standardPalette.setColor(QPalette::ToolTipText, brightPink); + standardPalette.setColor(QPalette::Text, black); + standardPalette.setColor(QPalette::Button, pink); + standardPalette.setColor(QPalette::ButtonText, black); + standardPalette.setColor(QPalette::Link, black); + standardPalette.setColor(QPalette::Highlight, congoPink); + standardPalette.setColor(QPalette::HighlightedText, black); + + standardPalette.setColor(QPalette::Active, QPalette::Button, pink); + standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, redpinkish); + standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, redpinkish); + standardPalette.setColor(QPalette::Disabled, QPalette::Text, redpinkish); + standardPalette.setColor(QPalette::Disabled, QPalette::Light, gray); + + qApp->setPalette(standardPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "PizzaBrown") + { + // Custom palette by KamFretoZ, a Pizza Tower Reference! + // With a mixtures of Light Brown, Peachy/Creamy White, Latte-like Color. + // Thanks to Jordan for the idea :P + // Alternative light theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor gray(128, 128, 128); + const QColor extr(248, 192, 88); + const QColor main(233, 187, 147); + const QColor comp(248, 230, 213); + const QColor highlight(188, 100, 60); + + QPalette standardPalette; + standardPalette.setColor(QPalette::Window, main); + standardPalette.setColor(QPalette::WindowText, Qt::black); + standardPalette.setColor(QPalette::Base, comp); + standardPalette.setColor(QPalette::AlternateBase, extr); + standardPalette.setColor(QPalette::ToolTipBase, comp); + standardPalette.setColor(QPalette::ToolTipText, Qt::black); + standardPalette.setColor(QPalette::Text, Qt::black); + standardPalette.setColor(QPalette::Button, extr); + standardPalette.setColor(QPalette::ButtonText, Qt::black); + standardPalette.setColor(QPalette::Link, Qt::black); + standardPalette.setColor(QPalette::Highlight, highlight); + standardPalette.setColor(QPalette::HighlightedText, Qt::white); + standardPalette.setColor(QPalette::Active, QPalette::Button, extr); + standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray.darker()); + standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray.darker()); + standardPalette.setColor(QPalette::Disabled, QPalette::Text, Qt::gray); + standardPalette.setColor(QPalette::Disabled, QPalette::Light, gray.lighter()); + + qApp->setPalette(standardPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #cc3f18; border: 1px solid white; }"); + } + else if (theme == "PCSX2Blue") + { + // Custom palette by RedDevilus, White as main color and Blue as complimentary. + // Alternative light theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor blackish(35, 35, 35); + const QColor darkBlue(73, 97, 177); + const QColor blue2(80, 120, 200); + const QColor blue(106, 156, 255); + const QColor lightBlue(130, 155, 241); + + QPalette standardPalette; + standardPalette.setColor(QPalette::Window, blue2.lighter()); + standardPalette.setColor(QPalette::WindowText, blackish); + standardPalette.setColor(QPalette::Base, lightBlue); + standardPalette.setColor(QPalette::AlternateBase, blue2.lighter()); + standardPalette.setColor(QPalette::ToolTipBase, blue2); + standardPalette.setColor(QPalette::ToolTipText, Qt::white); + standardPalette.setColor(QPalette::Text, blackish); + standardPalette.setColor(QPalette::Button, blue); + standardPalette.setColor(QPalette::ButtonText, blackish); + standardPalette.setColor(QPalette::Link, darkBlue); + standardPalette.setColor(QPalette::Highlight, Qt::white); + standardPalette.setColor(QPalette::HighlightedText, blackish); + + standardPalette.setColor(QPalette::Active, QPalette::Button, blue); + standardPalette.setColor(QPalette::Disabled, QPalette::ButtonText, darkBlue); + standardPalette.setColor(QPalette::Disabled, QPalette::WindowText, darkBlue); + standardPalette.setColor(QPalette::Disabled, QPalette::Text, darkBlue); + standardPalette.setColor(QPalette::Disabled, QPalette::Light, darkBlue); + + qApp->setPalette(standardPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "ScarletDevilRed") + { + // Custom palette by RedDevilus, Red as main color and Purple as complimentary. + // Alternative dark theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor darkRed(80, 45, 69); + const QColor purplishRed(120, 45, 69); + const QColor brightRed(200, 45, 69); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, darkRed); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, purplishRed); + darkPalette.setColor(QPalette::AlternateBase, darkRed); + darkPalette.setColor(QPalette::ToolTipBase, darkRed); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, purplishRed.darker()); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, brightRed); + darkPalette.setColor(QPalette::Highlight, brightRed); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + + darkPalette.setColor(QPalette::Active, QPalette::Button, purplishRed.darker()); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, brightRed); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, brightRed); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, brightRed); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkRed); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + 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. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor gray(150, 150, 150); + const QColor royalBlue(29, 41, 81); + const QColor darkishBlue(17, 30, 108); + const QColor highlight(36, 93, 218); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, royalBlue); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, royalBlue.lighter()); + darkPalette.setColor(QPalette::AlternateBase, darkishBlue); + darkPalette.setColor(QPalette::ToolTipBase, darkishBlue); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, darkishBlue); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, Qt::white); + darkPalette.setColor(QPalette::Highlight, highlight); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + + darkPalette.setColor(QPalette::Active, QPalette::Button, darkishBlue); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, gray); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "VioletAngelPurple") + { + // Custom palette by RedDevilus, Blue as main color and Purple as complimentary. + // Alternative dark theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor blackishblue(50, 25, 70); + const QColor darkerPurple(90, 30, 105); + const QColor nauticalPurple(110, 30, 125); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, blackishblue); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, nauticalPurple); + darkPalette.setColor(QPalette::AlternateBase, blackishblue); + darkPalette.setColor(QPalette::ToolTipBase, nauticalPurple); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, nauticalPurple.darker()); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, darkerPurple.lighter()); + darkPalette.setColor(QPalette::Highlight, darkerPurple.lighter()); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + + darkPalette.setColor(QPalette::Active, QPalette::Button, nauticalPurple.darker()); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, darkerPurple.lighter()); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, darkerPurple.lighter()); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, darkerPurple.darker()); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, nauticalPurple); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "Ruby") + { + // Custom palette by Daisouji, Black as main color and Red as complimentary. + // Alternative dark (black) theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor gray(128, 128, 128); + const QColor slate(18, 18, 18); + const QColor rubyish(172, 21, 31); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, slate); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, slate.lighter()); + darkPalette.setColor(QPalette::AlternateBase, slate.lighter()); + darkPalette.setColor(QPalette::ToolTipBase, slate); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, slate); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, Qt::white); + darkPalette.setColor(QPalette::Highlight, rubyish); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + + darkPalette.setColor(QPalette::Active, QPalette::Button, slate); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, slate.lighter()); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "Sapphire") + { + // Custom palette by RedDevilus, Black as main color and Blue as complimentary. + // Alternative dark (black) theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor gray(128, 128, 128); + const QColor slate(18, 18, 18); + const QColor persianBlue(32, 35, 204); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, slate); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, slate.lighter()); + darkPalette.setColor(QPalette::AlternateBase, slate.lighter()); + darkPalette.setColor(QPalette::ToolTipBase, slate); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, slate); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, Qt::white); + darkPalette.setColor(QPalette::Highlight, persianBlue); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + + darkPalette.setColor(QPalette::Active, QPalette::Button, slate); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, slate.lighter()); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "Custom") + { + //Additional Theme option than loads .qss from main PCSX2 Directory + qApp->setStyle(QStyleFactory::create("Fusion")); + + QString sheet_content; + QFile sheets(QString::fromStdString(Path::Combine(EmuFolders::DataRoot, "custom.qss"))); + + if (sheets.open(QFile::ReadOnly)) + { + QString sheet_content = QString::fromUtf8(sheets.readAll().data()); + qApp->setStyleSheet(sheet_content); + } + else + { + qApp->setStyle(QStyleFactory::create("Fusion")); + } + } + else + { + // setPalette() shouldn't be necessary, as the documentation claims that setStyle() resets the palette, but it + // is here, to work around a bug in 6.4.x and 6.5.x where the palette doesn't restore after changing themes. + qApp->setPalette(QPalette()); + qApp->setStyle(s_unthemed_style_name); + qApp->setStyleSheet(QString()); + } +} + +void QtHost::SetIconThemeFromStyle() +{ + QPalette palette = qApp->palette(); + bool dark = palette.windowText().color().value() > palette.window().color().value(); + QIcon::setThemeName(dark ? QStringLiteral("white") : QStringLiteral("black")); +} diff --git a/pcsx2-qt/pcsx2-qt.vcxproj b/pcsx2-qt/pcsx2-qt.vcxproj index 8f11b81e78..42ac55cb57 100644 --- a/pcsx2-qt/pcsx2-qt.vcxproj +++ b/pcsx2-qt/pcsx2-qt.vcxproj @@ -144,6 +144,7 @@ + diff --git a/pcsx2-qt/pcsx2-qt.vcxproj.filters b/pcsx2-qt/pcsx2-qt.vcxproj.filters index 0049d2e818..910d93c32e 100644 --- a/pcsx2-qt/pcsx2-qt.vcxproj.filters +++ b/pcsx2-qt/pcsx2-qt.vcxproj.filters @@ -315,6 +315,7 @@ moc +