summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-08-12 20:04:03 +0200
committerGitHub <noreply@github.com>2023-08-12 20:04:03 +0200
commitdfbc0e33d70a94124cd4a9176d9f544365a66bd2 (patch)
tree7e8958b888a10785a44cff2972b27e7fc5e62622 /Source/Core
parent44c90aa3fc7e9fe12a87b01a8dcde8e96dac9617 (diff)
parent24012cfc7f396177732e9a8b7d849045a65a5512 (diff)
Merge pull request #12080 from AdmiralCurtiss/windark
Add custom dark theme for Windows.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/DolphinQt/CMakeLists.txt10
-rw-r--r--Source/Core/DolphinQt/Config/ARCodeWidget.cpp4
-rw-r--r--Source/Core/DolphinQt/Config/CommonControllersWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/FilesystemWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/FreeLookWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/GameConfigHighlighter.cpp27
-rw-r--r--Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp8
-rw-r--r--Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp3
-rw-r--r--Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp9
-rw-r--r--Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/FreeLookRotation.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp33
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp3
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp4
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/WiimoteEmuExtensionMotionInput.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/Mapping/WiimoteEmuMotionControlIMU.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/PatchesWidget.cpp17
-rw-r--r--Source/Core/DolphinQt/Config/VerifyWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/ConvertDialog.cpp4
-rw-r--r--Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp4
-rw-r--r--Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp9
-rw-r--r--Source/Core/DolphinQt/Debugger/CodeWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/Debugger/RegisterWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/DiscordHandler.cpp2
-rw-r--r--Source/Core/DolphinQt/DolphinQt.vcxproj6
-rw-r--r--Source/Core/DolphinQt/GBAWidget.cpp2
-rw-r--r--Source/Core/DolphinQt/GCMemcardManager.cpp2
-rw-r--r--Source/Core/DolphinQt/GameList/GameList.cpp8
-rw-r--r--Source/Core/DolphinQt/InfinityBase/InfinityBaseWindow.cpp2
-rw-r--r--Source/Core/DolphinQt/Main.cpp10
-rw-r--r--Source/Core/DolphinQt/MainWindow.cpp54
-rw-r--r--Source/Core/DolphinQt/MainWindow.h5
-rw-r--r--Source/Core/DolphinQt/MenuBar.cpp10
-rw-r--r--Source/Core/DolphinQt/NKitWarningDialog.cpp7
-rw-r--r--Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp2
-rw-r--r--Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp4
-rw-r--r--Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp3
-rw-r--r--Source/Core/DolphinQt/QtUtils/SetWindowDecorations.cpp25
-rw-r--r--Source/Core/DolphinQt/QtUtils/SetWindowDecorations.h9
-rw-r--r--Source/Core/DolphinQt/ResourcePackManager.cpp2
-rw-r--r--Source/Core/DolphinQt/Settings.cpp85
-rw-r--r--Source/Core/DolphinQt/Settings.h5
-rw-r--r--Source/Core/DolphinQt/Settings/GameCubePane.cpp19
-rw-r--r--Source/Core/DolphinQt/Settings/GeneralPane.cpp2
-rw-r--r--Source/Core/DolphinQt/Settings/WiiPane.cpp4
-rw-r--r--Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp44
-rw-r--r--Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.h5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/checkbox-checked-disabled.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/checkbox-checked.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/checkbox-empty-disabled.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/checkbox-empty.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/checkbox-half-disabled.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/checkbox-half.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/dark.qrc30
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/dark.qss487
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/dockwidget-close.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/dockwidget-undock.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/down-triangle-spinbox.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/down-triangle.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/dropdown-arrow.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/left-triangle-tabbar.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/radiobutton-checked-disabled.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/radiobutton-checked.svg5
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/radiobutton-empty-disabled.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/radiobutton-empty.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/right-triangle-tabbar.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-down.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-left.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-right.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-up.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-down.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-up.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/up-triangle-spinbox.svg4
-rw-r--r--Source/Core/DolphinQt/Styles/Dark/up-triangle.svg4
-rw-r--r--Source/Core/DolphinQt/TAS/WiiTASInputWindow.cpp13
-rw-r--r--Source/Core/DolphinQt/Updater.cpp2
-rw-r--r--Source/Core/DolphinQt/WiiUpdate.cpp2
80 files changed, 1075 insertions, 45 deletions
diff --git a/Source/Core/DolphinQt/CMakeLists.txt b/Source/Core/DolphinQt/CMakeLists.txt
index 032f237eba..2633b3d264 100644
--- a/Source/Core/DolphinQt/CMakeLists.txt
+++ b/Source/Core/DolphinQt/CMakeLists.txt
@@ -12,6 +12,7 @@ if (MSVC)
endif()
set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Svg)
message(STATUS "Found Qt version ${Qt6_VERSION}")
@@ -293,6 +294,8 @@ add_executable(dolphin-emu
QtUtils/ParallelProgressDialog.h
QtUtils/PartiallyClosableTabWidget.cpp
QtUtils/PartiallyClosableTabWidget.h
+ QtUtils/SetWindowDecorations.cpp
+ QtUtils/SetWindowDecorations.h
QtUtils/SignalBlocking.h
QtUtils/UTF8CodePointCountValidator.cpp
QtUtils/UTF8CodePointCountValidator.h
@@ -362,6 +365,12 @@ add_executable(dolphin-emu
WiiUpdate.h
)
+if (WIN32)
+ target_sources(dolphin-emu PRIVATE
+ Styles/Dark/dark.qrc
+ )
+endif()
+
if (NOT WIN32)
target_sources(dolphin-emu PRIVATE
QtUtils/SignalDaemon.cpp
@@ -396,6 +405,7 @@ if (WIN32)
PRIVATE
gdi32.lib
shell32.lib
+ dwmapi.lib # Needed to set window decorations for dark theme
)
endif()
diff --git a/Source/Core/DolphinQt/Config/ARCodeWidget.cpp b/Source/Core/DolphinQt/Config/ARCodeWidget.cpp
index 667f9373c1..a25d6fe7ab 100644
--- a/Source/Core/DolphinQt/Config/ARCodeWidget.cpp
+++ b/Source/Core/DolphinQt/Config/ARCodeWidget.cpp
@@ -22,6 +22,7 @@
#include "DolphinQt/Config/CheatCodeEditor.h"
#include "DolphinQt/Config/CheatWarningWidget.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "UICommon/GameFile.h"
@@ -230,6 +231,7 @@ void ARCodeWidget::OnCodeAddClicked()
CheatCodeEditor ed(this);
ed.SetARCode(&ar);
+ SetQWidgetWindowDecorations(&ed);
if (ed.exec() == QDialog::Rejected)
return;
@@ -253,6 +255,7 @@ void ARCodeWidget::OnCodeEditClicked()
{
ed.SetARCode(&current_ar);
+ SetQWidgetWindowDecorations(&ed);
if (ed.exec() == QDialog::Rejected)
return;
}
@@ -261,6 +264,7 @@ void ARCodeWidget::OnCodeEditClicked()
ActionReplay::ARCode ar = current_ar;
ed.SetARCode(&ar);
+ SetQWidgetWindowDecorations(&ed);
if (ed.exec() == QDialog::Rejected)
return;
diff --git a/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp b/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp
index e988509f6a..9535895a73 100644
--- a/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp
+++ b/Source/Core/DolphinQt/Config/CommonControllersWidget.cpp
@@ -13,6 +13,7 @@
#include "DolphinQt/Config/ControllerInterface/ControllerInterfaceWindow.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/SignalBlocking.h"
#include "DolphinQt/Settings.h"
@@ -59,6 +60,7 @@ void CommonControllersWidget::OnControllerInterfaceConfigure()
ControllerInterfaceWindow* window = new ControllerInterfaceWindow(this);
window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowModality(Qt::WindowModality::WindowModal);
+ SetQWidgetWindowDecorations(window);
window->show();
}
diff --git a/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientWidget.cpp b/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientWidget.cpp
index 90237057e0..04ed5437df 100644
--- a/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientWidget.cpp
+++ b/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientWidget.cpp
@@ -14,6 +14,7 @@
#include "Common/Config/Config.h"
#include "DolphinQt/Config/ControllerInterface/DualShockUDPClientAddServerDialog.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.h"
DualShockUDPClientWidget::DualShockUDPClientWidget()
@@ -111,6 +112,7 @@ void DualShockUDPClientWidget::OnServerAdded()
DualShockUDPClientAddServerDialog add_server_dialog(this);
connect(&add_server_dialog, &DualShockUDPClientAddServerDialog::accepted, this,
&DualShockUDPClientWidget::RefreshServerList);
+ SetQWidgetWindowDecorations(&add_server_dialog);
add_server_dialog.exec();
}
diff --git a/Source/Core/DolphinQt/Config/FilesystemWidget.cpp b/Source/Core/DolphinQt/Config/FilesystemWidget.cpp
index 7dbf0014ea..56aff5b9df 100644
--- a/Source/Core/DolphinQt/Config/FilesystemWidget.cpp
+++ b/Source/Core/DolphinQt/Config/FilesystemWidget.cpp
@@ -25,6 +25,7 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "UICommon/UICommon.h"
@@ -364,6 +365,7 @@ void FilesystemWidget::ExtractDirectory(const DiscIO::Partition& partition, cons
dialog.Reset();
});
+ SetQWidgetWindowDecorations(dialog.GetRaw());
dialog.GetRaw()->exec();
future.get();
}
diff --git a/Source/Core/DolphinQt/Config/FreeLookWidget.cpp b/Source/Core/DolphinQt/Config/FreeLookWidget.cpp
index e0524c06d7..5fe1ecd66d 100644
--- a/Source/Core/DolphinQt/Config/FreeLookWidget.cpp
+++ b/Source/Core/DolphinQt/Config/FreeLookWidget.cpp
@@ -17,6 +17,7 @@
#include "DolphinQt/Config/Mapping/MappingWindow.h"
#include "DolphinQt/Config/ToolTipControls/ToolTipCheckBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
FreeLookWidget::FreeLookWidget(QWidget* parent) : QWidget(parent)
@@ -97,6 +98,7 @@ void FreeLookWidget::OnFreeLookControllerConfigured()
MappingWindow* window = new MappingWindow(this, MappingWindow::Type::MAPPING_FREELOOK, index);
window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowModality(Qt::WindowModality::WindowModal);
+ SetQWidgetWindowDecorations(window);
window->show();
}
diff --git a/Source/Core/DolphinQt/Config/GameConfigHighlighter.cpp b/Source/Core/DolphinQt/Config/GameConfigHighlighter.cpp
index 0d892b18a5..4473fde5a9 100644
--- a/Source/Core/DolphinQt/Config/GameConfigHighlighter.cpp
+++ b/Source/Core/DolphinQt/Config/GameConfigHighlighter.cpp
@@ -3,6 +3,11 @@
#include "DolphinQt/Config/GameConfigHighlighter.h"
+#include <QBrush>
+#include <QColor>
+
+#include "DolphinQt/Settings.h"
+
struct HighlightingRule
{
QRegularExpression pattern;
@@ -13,22 +18,36 @@ GameConfigHighlighter::~GameConfigHighlighter() = default;
GameConfigHighlighter::GameConfigHighlighter(QTextDocument* parent) : QSyntaxHighlighter(parent)
{
+ const bool is_dark_theme = Settings::Instance().IsThemeDark();
+
QTextCharFormat equal_format;
- equal_format.setForeground(Qt::red);
+ if (is_dark_theme)
+ equal_format.setForeground(QBrush{QColor(255, 96, 96)});
+ else
+ equal_format.setForeground(Qt::red);
QTextCharFormat section_format;
section_format.setFontWeight(QFont::Bold);
QTextCharFormat comment_format;
- comment_format.setForeground(Qt::darkGreen);
+ if (is_dark_theme)
+ comment_format.setForeground(QBrush{QColor(0, 220, 0)});
+ else
+ comment_format.setForeground(Qt::darkGreen);
comment_format.setFontItalic(true);
QTextCharFormat const_format;
const_format.setFontWeight(QFont::Bold);
- const_format.setForeground(Qt::blue);
+ if (is_dark_theme)
+ const_format.setForeground(QBrush{QColor(132, 132, 255)});
+ else
+ const_format.setForeground(Qt::blue);
QTextCharFormat num_format;
- num_format.setForeground(Qt::darkBlue);
+ if (is_dark_theme)
+ num_format.setForeground(QBrush{QColor(66, 138, 255)});
+ else
+ num_format.setForeground(Qt::darkBlue);
m_rules.emplace_back(HighlightingRule{QRegularExpression(QStringLiteral("=")), equal_format});
m_rules.emplace_back(
diff --git a/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp b/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp
index 38ea1e4e7f..7fb37866ac 100644
--- a/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp
+++ b/Source/Core/DolphinQt/Config/GamecubeControllersWidget.cpp
@@ -24,6 +24,7 @@
#include "DolphinQt/Config/Mapping/GCPadWiiUConfigDialog.h"
#include "DolphinQt/Config/Mapping/MappingWindow.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/SignalBlocking.h"
#include "DolphinQt/Settings.h"
@@ -137,8 +138,12 @@ void GamecubeControllersWidget::OnGCPadConfigure(size_t index)
type = MappingWindow::Type::MAPPING_GCPAD;
break;
case SerialInterface::SIDEVICE_WIIU_ADAPTER:
- GCPadWiiUConfigDialog(static_cast<int>(index), this).exec();
+ {
+ GCPadWiiUConfigDialog dialog(static_cast<int>(index), this);
+ SetQWidgetWindowDecorations(&dialog);
+ dialog.exec();
return;
+ }
case SerialInterface::SIDEVICE_GC_STEERING:
type = MappingWindow::Type::MAPPING_GC_STEERINGWHEEL;
break;
@@ -161,6 +166,7 @@ void GamecubeControllersWidget::OnGCPadConfigure(size_t index)
MappingWindow* window = new MappingWindow(this, type, static_cast<int>(index));
window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowModality(Qt::WindowModality::WindowModal);
+ SetQWidgetWindowDecorations(window);
window->show();
}
diff --git a/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp b/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp
index 124bb20185..988bcf329c 100644
--- a/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp
+++ b/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp
@@ -28,6 +28,7 @@
#include "DolphinQt/Config/CheatWarningWidget.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "UICommon/GameFile.h"
@@ -201,6 +202,7 @@ void GeckoCodeWidget::AddCode()
CheatCodeEditor ed(this);
ed.SetGeckoCode(&code);
+ SetQWidgetWindowDecorations(&ed);
if (ed.exec() == QDialog::Rejected)
return;
@@ -219,6 +221,7 @@ void GeckoCodeWidget::EditCode()
CheatCodeEditor ed(this);
ed.SetGeckoCode(&m_gecko_codes[index]);
+ SetQWidgetWindowDecorations(&ed);
if (ed.exec() == QDialog::Rejected)
return;
diff --git a/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp
index c1c0495929..09e8ec11e0 100644
--- a/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp
+++ b/Source/Core/DolphinQt/Config/Graphics/EnhancementsWidget.cpp
@@ -22,6 +22,7 @@
#include "DolphinQt/Config/Graphics/GraphicsWindow.h"
#include "DolphinQt/Config/Graphics/PostProcessingConfigWindow.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
#include "VideoCommon/PostProcessing.h"
@@ -570,11 +571,15 @@ void EnhancementsWidget::AddDescriptions()
void EnhancementsWidget::ConfigureColorCorrection()
{
- ColorCorrectionConfigWindow(this).exec();
+ ColorCorrectionConfigWindow dialog(this);
+ SetQWidgetWindowDecorations(&dialog);
+ dialog.exec();
}
void EnhancementsWidget::ConfigurePostProcessingShader()
{
const std::string shader = Config::Get(Config::GFX_ENHANCE_POST_SHADER);
- PostProcessingConfigWindow(this, shader).exec();
+ PostProcessingConfigWindow dialog(this, shader);
+ SetQWidgetWindowDecorations(&dialog);
+ dialog.exec();
}
diff --git a/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp
index 8733419f60..95a39f9a45 100644
--- a/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp
+++ b/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp
@@ -24,6 +24,7 @@
#include "DolphinQt/Config/Graphics/GraphicsWindow.h"
#include "DolphinQt/Config/ToolTipControls/ToolTipComboBox.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
#include "VideoCommon/VideoBackendBase.h"
@@ -164,6 +165,7 @@ void GeneralWidget::SaveSettings()
confirm_sw.setWindowTitle(tr("Confirm backend change"));
confirm_sw.setText(tr(warningMessage->c_str()));
+ SetQWidgetWindowDecorations(&confirm_sw);
if (confirm_sw.exec() != QMessageBox::Yes)
{
m_backend_combo->setCurrentIndex(m_backend_combo->findData(
diff --git a/Source/Core/DolphinQt/Config/Mapping/FreeLookRotation.cpp b/Source/Core/DolphinQt/Config/Mapping/FreeLookRotation.cpp
index dfd8532624..d6594fb063 100644
--- a/Source/Core/DolphinQt/Config/Mapping/FreeLookRotation.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/FreeLookRotation.cpp
@@ -11,6 +11,7 @@
#include "Core/FreeLookManager.h"
#include "DolphinQt/Config/ControllerInterface/ControllerInterfaceWindow.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "InputCommon/InputConfig.h"
FreeLookRotation::FreeLookRotation(MappingWindow* window) : MappingWidget(window)
@@ -33,6 +34,7 @@ void FreeLookRotation::CreateMainLayout()
ControllerInterfaceWindow* window = new ControllerInterfaceWindow(this);
window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowModality(Qt::WindowModality::WindowModal);
+ SetQWidgetWindowDecorations(window);
window->show();
});
m_main_layout->addLayout(alternate_input_layout, 0, 0, 1, -1);
diff --git a/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp b/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp
index 8bec82f015..d70ae2d68f 100644
--- a/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp
@@ -6,6 +6,8 @@
#include <optional>
#include <thread>
+#include <QBrush>
+#include <QColor>
#include <QComboBox>
#include <QDialogButtonBox>
#include <QHeaderView>
@@ -38,7 +40,6 @@
namespace
{
-// TODO: Make sure these functions return colors that will be visible in the current theme.
QTextCharFormat GetSpecialCharFormat()
{
QTextCharFormat format;
@@ -49,7 +50,10 @@ QTextCharFormat GetSpecialCharFormat()
QTextCharFormat GetLiteralCharFormat()
{
QTextCharFormat format;
- format.setForeground(QBrush{Qt::darkMagenta});
+ if (Settings::Instance().IsThemeDark())
+ format.setForeground(QBrush{QColor(171, 132, 219)});
+ else
+ format.setForeground(QBrush{Qt::darkMagenta});
return format;
}
@@ -57,35 +61,50 @@ QTextCharFormat GetInvalidCharFormat()
{
QTextCharFormat format;
format.setUnderlineStyle(QTextCharFormat::WaveUnderline);
- format.setUnderlineColor(Qt::darkRed);
+ if (Settings::Instance().IsThemeDark())
+ format.setUnderlineColor(QColor(255, 69, 0));
+ else
+ format.setUnderlineColor(Qt::darkRed);
return format;
}
QTextCharFormat GetControlCharFormat()
{
QTextCharFormat format;
- format.setForeground(QBrush{Qt::darkGreen});
+ if (Settings::Instance().IsThemeDark())
+ format.setForeground(QBrush{QColor(0, 220, 0)});
+ else
+ format.setForeground(QBrush{Qt::darkGreen});
return format;
}
QTextCharFormat GetVariableCharFormat()
{
QTextCharFormat format;
- format.setForeground(QBrush{Qt::darkYellow});
+ if (Settings::Instance().IsThemeDark())
+ format.setForeground(QBrush{QColor(226, 226, 0)});
+ else
+ format.setForeground(QBrush{Qt::darkYellow});
return format;
}
QTextCharFormat GetBarewordCharFormat()
{
QTextCharFormat format;
- format.setForeground(QBrush{Qt::darkBlue});
+ if (Settings::Instance().IsThemeDark())
+ format.setForeground(QBrush{QColor(66, 138, 255)});
+ else
+ format.setForeground(QBrush{Qt::darkBlue});
return format;
}
QTextCharFormat GetCommentCharFormat()
{
QTextCharFormat format;
- format.setForeground(QBrush{Qt::darkGray});
+ if (Settings::Instance().IsThemeDark())
+ format.setForeground(QBrush{QColor(176, 176, 176)});
+ else
+ format.setForeground(QBrush{Qt::darkGray});
return format;
}
} // namespace
diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp
index 78c776007d..bfc3d751e4 100644
--- a/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp
@@ -12,6 +12,7 @@
#include "DolphinQt/Config/Mapping/MappingCommon.h"
#include "DolphinQt/Config/Mapping/MappingWidget.h"
#include "DolphinQt/Config/Mapping/MappingWindow.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "InputCommon/ControlReference/ControlReference.h"
#include "InputCommon/ControllerEmu/ControlGroup/Buttons.h"
@@ -97,6 +98,7 @@ void MappingButton::AdvancedPressed()
{
IOWindow io(m_parent, m_parent->GetController(), m_reference,
m_reference->IsInput() ? IOWindow::Type::Input : IOWindow::Type::Output);
+ SetQWidgetWindowDecorations(&io);
io.exec();
ConfigChanged();
diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp
index 02d8c852b7..cfb9483ba6 100644
--- a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp
@@ -16,6 +16,7 @@
#include "DolphinQt/Config/Mapping/MappingIndicator.h"
#include "DolphinQt/Config/Mapping/MappingNumeric.h"
#include "DolphinQt/Config/Mapping/MappingWindow.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "InputCommon/ControlReference/ControlReference.h"
#include "InputCommon/ControllerEmu/Control/Control.h"
@@ -248,6 +249,7 @@ void MappingWidget::ShowAdvancedControlGroupDialog(ControllerEmu::ControlGroup*
// Enable "Close" button functionality.
connect(button_box, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
+ SetQWidgetWindowDecorations(&dialog);
dialog.exec();
}
@@ -303,6 +305,7 @@ MappingWidget::CreateSettingAdvancedMappingButton(ControllerEmu::NumericSettingB
setting.SetExpressionFromValue();
IOWindow io(this, GetController(), &setting.GetInputReference(), IOWindow::Type::Input);
+ SetQWidgetWindowDecorations(&io);
io.exec();
setting.SimplifyIfPossible();
diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp
index dcb1cc83a1..688870869e 100644
--- a/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/MappingWindow.cpp
@@ -49,6 +49,7 @@
#include "DolphinQt/Config/Mapping/WiimoteEmuMotionControlIMU.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/WindowActivationEventFilter.h"
#include "DolphinQt/QtUtils/WrapInScrollArea.h"
#include "DolphinQt/Settings.h"
@@ -255,6 +256,7 @@ void MappingWindow::OnDeleteProfilePressed()
error.setIcon(QMessageBox::Critical);
error.setWindowTitle(tr("Error"));
error.setText(tr("The profile '%1' does not exist").arg(profile_name));
+ SetQWidgetWindowDecorations(&error);
error.exec();
return;
}
@@ -267,6 +269,7 @@ void MappingWindow::OnDeleteProfilePressed()
confirm.setInformativeText(tr("This cannot be undone!"));
confirm.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
+ SetQWidgetWindowDecorations(&confirm);
if (confirm.exec() != QMessageBox::Yes)
{
return;
@@ -294,6 +297,7 @@ void MappingWindow::OnLoadProfilePressed()
error.setIcon(QMessageBox::Critical);
error.setWindowTitle(tr("Error"));
error.setText(tr("The profile '%1' does not exist").arg(m_profiles_combo->currentText()));
+ SetQWidgetWindowDecorations(&error);
error.exec();
return;
}
diff --git a/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuExtensionMotionInput.cpp b/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuExtensionMotionInput.cpp
index 9292cecc9d..4e004cd8b5 100644
--- a/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuExtensionMotionInput.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuExtensionMotionInput.cpp
@@ -14,6 +14,7 @@
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
#include "DolphinQt/Config/ControllerInterface/ControllerInterfaceWindow.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "InputCommon/InputConfig.h"
@@ -42,6 +43,7 @@ void WiimoteEmuExtensionMotionInput::CreateNunchukLayout()
ControllerInterfaceWindow* window = new ControllerInterfaceWindow(this);
window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowModality(Qt::WindowModality::WindowModal);
+ SetQWidgetWindowDecorations(window);
window->show();
});
layout->addLayout(warning_layout, 0, 0, 1, -1);
diff --git a/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuMotionControlIMU.cpp b/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuMotionControlIMU.cpp
index dfa29bfb15..8d07e9201e 100644
--- a/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuMotionControlIMU.cpp
+++ b/Source/Core/DolphinQt/Config/Mapping/WiimoteEmuMotionControlIMU.cpp
@@ -15,6 +15,7 @@
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
#include "DolphinQt/Config/ControllerInterface/ControllerInterfaceWindow.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "InputCommon/InputConfig.h"
@@ -40,6 +41,7 @@ void WiimoteEmuMotionControlIMU::CreateMainLayout()
ControllerInterfaceWindow* window = new ControllerInterfaceWindow(this);
window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowModality(Qt::WindowModality::WindowModal);
+ SetQWidgetWindowDecorations(window);
window->show();
});
diff --git a/Source/Core/DolphinQt/Config/PatchesWidget.cpp b/Source/Core/DolphinQt/Config/PatchesWidget.cpp
index a8abbf72ba..e1fd12f913 100644
--- a/Source/Core/DolphinQt/Config/PatchesWidget.cpp
+++ b/Source/Core/DolphinQt/Config/PatchesWidget.cpp
@@ -15,6 +15,7 @@
#include "Core/PatchEngine.h"
#include "DolphinQt/Config/NewPatchDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "UICommon/GameFile.h"
@@ -74,7 +75,13 @@ void PatchesWidget::OnAdd()
PatchEngine::Patch patch;
patch.user_defined = true;
- if (NewPatchDialog(this, patch).exec())
+ bool new_patch_confirmed = false;
+ {
+ NewPatchDialog dialog(this, patch);
+ SetQWidgetWindowDecorations(&dialog);
+ new_patch_confirmed = dialog.exec();
+ }
+ if (new_patch_confirmed)
{
m_patches.push_back(patch);
SavePatches();
@@ -98,7 +105,13 @@ void PatchesWidget::OnEdit()
patch.name = tr("%1 (Copy)").arg(QString::fromStdString(patch.name)).toStdString();
}
- if (NewPatchDialog(this, patch).exec())
+ bool new_patch_confirmed = false;
+ {
+ NewPatchDialog dialog(this, patch);
+ SetQWidgetWindowDecorations(&dialog);
+ new_patch_confirmed = dialog.exec();
+ }
+ if (new_patch_confirmed)
{
if (patch.user_defined)
{
diff --git a/Source/Core/DolphinQt/Config/VerifyWidget.cpp b/Source/Core/DolphinQt/Config/VerifyWidget.cpp
index 87879c6659..6b21d77690 100644
--- a/Source/Core/DolphinQt/Config/VerifyWidget.cpp
+++ b/Source/Core/DolphinQt/Config/VerifyWidget.cpp
@@ -20,6 +20,7 @@
#include "DiscIO/Volume.h"
#include "DiscIO/VolumeVerifier.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
VerifyWidget::VerifyWidget(std::shared_ptr<DiscIO::Volume> volume) : m_volume(std::move(volume))
@@ -180,6 +181,7 @@ void VerifyWidget::Verify()
return result;
});
+ SetQWidgetWindowDecorations(progress.GetRaw());
progress.GetRaw()->exec();
std::optional<DiscIO::VolumeVerifier::Result> result = future.get();
diff --git a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp
index 28f15a46d7..d702acf5e1 100644
--- a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp
+++ b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp
@@ -33,6 +33,7 @@
#include "DolphinQt/Config/Mapping/MappingWindow.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/SignalBlocking.h"
#include "DolphinQt/Settings.h"
@@ -261,6 +262,7 @@ void WiimoteControllersWidget::OnWiimoteConfigure(size_t index)
MappingWindow* window = new MappingWindow(this, type, static_cast<int>(index));
window->setAttribute(Qt::WA_DeleteOnClose, true);
window->setWindowModality(Qt::WindowModality::WindowModal);
+ SetQWidgetWindowDecorations(window);
window->show();
}
diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp
index 85b48edb6c..e6be43015f 100644
--- a/Source/Core/DolphinQt/ConvertDialog.cpp
+++ b/Source/Core/DolphinQt/ConvertDialog.cpp
@@ -31,6 +31,7 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "UICommon/GameFile.h"
#include "UICommon/UICommon.h"
@@ -285,6 +286,7 @@ bool ConvertDialog::ShowAreYouSureDialog(const QString& text)
warning.setInformativeText(text);
warning.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ SetQWidgetWindowDecorations(&warning);
return warning.exec() == QMessageBox::Yes;
}
@@ -409,6 +411,7 @@ void ConvertDialog::Convert()
.arg(dst_info.fileName()));
confirm_replace.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ SetQWidgetWindowDecorations(&confirm_replace);
if (confirm_replace.exec() == QMessageBox::No)
continue;
}
@@ -519,6 +522,7 @@ void ConvertDialog::Convert()
break;
}
+ SetQWidgetWindowDecorations(progress_dialog.GetRaw());
progress_dialog.GetRaw()->exec();
if (!success.get())
{
diff --git a/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp b/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp
index de04411ece..bf29361973 100644
--- a/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp
+++ b/Source/Core/DolphinQt/Debugger/BreakpointWidget.cpp
@@ -22,6 +22,7 @@
#include "DolphinQt/Debugger/BreakpointDialog.h"
#include "DolphinQt/Debugger/MemoryWidget.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"
@@ -313,6 +314,7 @@ void BreakpointWidget::OnClear()
void BreakpointWidget::OnNewBreakpoint()
{
BreakpointDialog* dialog = new BreakpointDialog(this);
+ SetQWidgetWindowDecorations(dialog);
dialog->exec();
}
@@ -322,12 +324,14 @@ void BreakpointWidget::OnEditBreakpoint(u32 address, bool is_instruction_bp)
{
auto* dialog =
new BreakpointDialog(this, m_system.GetPowerPC().GetBreakPoints().GetBreakpoint(address));
+ SetQWidgetWindowDecorations(dialog);
dialog->exec();
}
else
{
auto* dialog =
new BreakpointDialog(this, m_system.GetPowerPC().GetMemChecks().GetMemCheck(address));
+ SetQWidgetWindowDecorations(dialog);
dialog->exec();
}
diff --git a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp
index 625a5fabb8..5507875997 100644
--- a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp
+++ b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp
@@ -37,6 +37,7 @@
#include "Core/System.h"
#include "DolphinQt/Debugger/PatchInstructionDialog.h"
#include "DolphinQt/Host.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"
@@ -306,7 +307,7 @@ void CodeViewWidget::Update(const Core::CPUThreadGuard* guard)
const std::optional<u32> pc =
guard ? std::make_optional(power_pc.GetPPCState().pc) : std::nullopt;
- const bool dark_theme = qApp->palette().color(QPalette::Base).valueF() < 0.5;
+ const bool dark_theme = Settings::Instance().IsThemeDark();
m_branches.clear();
@@ -349,7 +350,7 @@ void CodeViewWidget::Update(const Core::CPUThreadGuard* guard)
}
else if (color != 0xFFFFFF)
{
- item->setBackground(dark_theme ? QColor(color).darker(240) : QColor(color));
+ item->setBackground(dark_theme ? QColor(color).darker(400) : QColor(color));
}
}
@@ -371,7 +372,7 @@ void CodeViewWidget::Update(const Core::CPUThreadGuard* guard)
description_item->setText(
tr("--> %1").arg(QString::fromStdString(debug_interface.GetDescription(branch_addr))));
- param_item->setForeground(Qt::magenta);
+ param_item->setForeground(dark_theme ? QColor(255, 135, 255) : Qt::magenta);
}
if (ins == "blr")
@@ -733,6 +734,7 @@ void CodeViewWidget::AutoStep(CodeTrace::AutoStop option)
.arg(QString::fromStdString(fmt::format("{:#x}", fmt::join(mem_out, ", "))));
msgbox.setInformativeText(msgtext);
+ SetQWidgetWindowDecorations(&msgbox);
msgbox.exec();
} while (msgbox.clickedButton() == (QAbstractButton*)run_button);
@@ -1010,6 +1012,7 @@ void CodeViewWidget::OnReplaceInstruction()
auto& debug_interface = m_system.GetPowerPC().GetDebugInterface();
PatchInstructionDialog dialog(this, addr, debug_interface.ReadInstruction(guard, addr));
+ SetQWidgetWindowDecorations(&dialog);
if (dialog.exec() == QDialog::Accepted)
{
debug_interface.SetPatch(guard, addr, dialog.GetCode());
diff --git a/Source/Core/DolphinQt/Debugger/CodeWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeWidget.cpp
index 4315196996..650e17e905 100644
--- a/Source/Core/DolphinQt/Debugger/CodeWidget.cpp
+++ b/Source/Core/DolphinQt/Debugger/CodeWidget.cpp
@@ -28,6 +28,7 @@
#include "Core/PowerPC/PowerPC.h"
#include "Core/System.h"
#include "DolphinQt/Host.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
static const QString BOX_SPLITTER_STYLESHEET = QStringLiteral(
@@ -213,6 +214,7 @@ void CodeWidget::OnDiff()
if (!m_diff_dialog)
m_diff_dialog = new CodeDiffDialog(this);
m_diff_dialog->setWindowFlag(Qt::WindowMinimizeButtonHint);
+ SetQWidgetWindowDecorations(m_diff_dialog);
m_diff_dialog->show();
m_diff_dialog->raise();
m_diff_dialog->activateWindow();
diff --git a/Source/Core/DolphinQt/Debugger/RegisterWidget.cpp b/Source/Core/DolphinQt/Debugger/RegisterWidget.cpp
index 324d680dbb..fa31e620fc 100644
--- a/Source/Core/DolphinQt/Debugger/RegisterWidget.cpp
+++ b/Source/Core/DolphinQt/Debugger/RegisterWidget.cpp
@@ -18,6 +18,7 @@
#include "Core/PowerPC/PowerPC.h"
#include "Core/System.h"
#include "DolphinQt/Host.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
RegisterWidget::RegisterWidget(QWidget* parent)
@@ -307,6 +308,7 @@ void RegisterWidget::AutoStep(const std::string& reg) const
break;
// Can keep running and try again after a time out.
+ SetQWidgetWindowDecorations(&msgbox);
msgbox.exec();
if (msgbox.clickedButton() != (QAbstractButton*)run_button)
break;
diff --git a/Source/Core/DolphinQt/DiscordHandler.cpp b/Source/Core/DolphinQt/DiscordHandler.cpp
index 49363321db..7e14dce42d 100644
--- a/Source/Core/DolphinQt/DiscordHandler.cpp
+++ b/Source/Core/DolphinQt/DiscordHandler.cpp
@@ -16,6 +16,7 @@
#include "DolphinQt/DiscordJoinRequestDialog.h"
#include "DolphinQt/QtUtils/RunOnObject.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
DiscordHandler::DiscordHandler(QWidget* parent) : QObject{parent}, m_parent{parent}
{
@@ -60,6 +61,7 @@ void DiscordHandler::ShowNewJoinRequest(const std::string& id, const std::string
std::lock_guard<std::mutex> lock(m_request_dialogs_mutex);
m_request_dialogs.emplace_front(m_parent, id, discord_tag, avatar);
DiscordJoinRequestDialog& request_dialog = m_request_dialogs.front();
+ SetQWidgetWindowDecorations(&request_dialog);
request_dialog.show();
request_dialog.raise();
request_dialog.activateWindow();
diff --git a/Source/Core/DolphinQt/DolphinQt.vcxproj b/Source/Core/DolphinQt/DolphinQt.vcxproj
index ff17a0a4b1..9217cc3788 100644
--- a/Source/Core/DolphinQt/DolphinQt.vcxproj
+++ b/Source/Core/DolphinQt/DolphinQt.vcxproj
@@ -188,6 +188,7 @@
<ClCompile Include="QtUtils\ModalMessageBox.cpp" />
<ClCompile Include="QtUtils\NonDefaultQPushButton.cpp" />
<ClCompile Include="QtUtils\PartiallyClosableTabWidget.cpp" />
+ <ClCompile Include="QtUtils\SetWindowDecorations.cpp" />
<ClCompile Include="QtUtils\UTF8CodePointCountValidator.cpp" />
<ClCompile Include="QtUtils\WindowActivationEventFilter.cpp" />
<ClCompile Include="QtUtils\WrapInScrollArea.cpp" />
@@ -379,6 +380,7 @@
<QtMoc Include="QtUtils\FileOpenEventFilter.h" />
<QtMoc Include="QtUtils\ParallelProgressDialog.h" />
<QtMoc Include="QtUtils\PartiallyClosableTabWidget.h" />
+ <ClInclude Include="QtUtils\SetWindowDecorations.h" />
<QtMoc Include="QtUtils\UTF8CodePointCountValidator.h" />
<QtMoc Include="QtUtils\WindowActivationEventFilter.h" />
<QtMoc Include="RenderWidget.h" />
@@ -416,6 +418,10 @@
<Natvis Include="qt6.natvis" />
</ItemGroup>
<ItemGroup>
+ <Text Include="Styles\Dark\dark.qss" />
+ <QtRcc Include="Styles\Dark\dark.qrc" />
+ </ItemGroup>
+ <ItemGroup>
<ProjectReference Include="$(CoreDir)DolphinLib.vcxproj">
<Project>{D79392F7-06D6-4B4B-A39F-4D587C215D3A}</Project>
</ProjectReference>
diff --git a/Source/Core/DolphinQt/GBAWidget.cpp b/Source/Core/DolphinQt/GBAWidget.cpp
index 6805321df5..0a7ba2b84d 100644
--- a/Source/Core/DolphinQt/GBAWidget.cpp
+++ b/Source/Core/DolphinQt/GBAWidget.cpp
@@ -29,6 +29,7 @@
#include "Core/System.h"
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Settings/GameCubePane.h"
@@ -486,6 +487,7 @@ void GBAWidget::contextMenuEvent(QContextMenuEvent* event)
size_menu->addAction(x4_action);
menu->move(event->globalPos());
+ SetQWidgetWindowDecorations(menu);
menu->show();
}
diff --git a/Source/Core/DolphinQt/GCMemcardManager.cpp b/Source/Core/DolphinQt/GCMemcardManager.cpp
index 8bbe9061dc..405bee200e 100644
--- a/Source/Core/DolphinQt/GCMemcardManager.cpp
+++ b/Source/Core/DolphinQt/GCMemcardManager.cpp
@@ -42,6 +42,7 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
using namespace ExpansionInterface;
@@ -695,6 +696,7 @@ void GCMemcardManager::FixChecksums()
void GCMemcardManager::CreateNewCard(Slot slot)
{
GCMemcardCreateNewDialog dialog(this);
+ SetQWidgetWindowDecorations(&dialog);
if (dialog.exec() == QDialog::Accepted)
m_slot_file_edit[slot]->setText(QString::fromStdString(dialog.GetMemoryCardPath()));
}
diff --git a/Source/Core/DolphinQt/GameList/GameList.cpp b/Source/Core/DolphinQt/GameList/GameList.cpp
index c918c4555d..9f2731af65 100644
--- a/Source/Core/DolphinQt/GameList/GameList.cpp
+++ b/Source/Core/DolphinQt/GameList/GameList.cpp
@@ -67,6 +67,7 @@
#include "DolphinQt/QtUtils/DoubleClickEventFilter.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/WiiUpdate.h"
@@ -546,6 +547,7 @@ void GameList::OpenProperties()
connect(properties, &PropertiesDialog::OpenGraphicsSettings, this,
&GameList::OpenGraphicsSettings);
+ SetQWidgetWindowDecorations(properties);
properties->show();
}
@@ -600,6 +602,7 @@ void GameList::ConvertFile()
return;
ConvertDialog dialog{std::move(games), this};
+ SetQWidgetWindowDecorations(&dialog);
dialog.exec();
}
@@ -617,6 +620,7 @@ void GameList::InstallWAD()
result_dialog.setWindowTitle(success ? tr("Success") : tr("Failure"));
result_dialog.setText(success ? tr("Successfully installed this title to the NAND.") :
tr("Failed to install this title to the NAND."));
+ SetQWidgetWindowDecorations(&result_dialog);
result_dialog.exec();
}
@@ -634,6 +638,7 @@ void GameList::UninstallWAD()
"this title from the NAND without deleting its save data. Continue?"));
warning_dialog.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
+ SetQWidgetWindowDecorations(&warning_dialog);
if (warning_dialog.exec() == QMessageBox::No)
return;
@@ -645,6 +650,7 @@ void GameList::UninstallWAD()
result_dialog.setWindowTitle(success ? tr("Success") : tr("Failure"));
result_dialog.setText(success ? tr("Successfully removed this title from the NAND.") :
tr("Failed to remove this title from the NAND."));
+ SetQWidgetWindowDecorations(&result_dialog);
result_dialog.exec();
}
@@ -818,6 +824,7 @@ void GameList::DeleteFile()
confirm_dialog.setInformativeText(tr("This cannot be undone!"));
confirm_dialog.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
+ SetQWidgetWindowDecorations(&confirm_dialog);
if (confirm_dialog.exec() == QMessageBox::Yes)
{
for (const auto& game : GetSelectedGames())
@@ -843,6 +850,7 @@ void GameList::DeleteFile()
"delete the file or whether it's still in use."));
error_dialog.setStandardButtons(QMessageBox::Retry | QMessageBox::Abort);
+ SetQWidgetWindowDecorations(&error_dialog);
if (error_dialog.exec() == QMessageBox::Abort)
break;
}
diff --git a/Source/Core/DolphinQt/InfinityBase/InfinityBaseWindow.cpp b/Source/Core/DolphinQt/InfinityBase/InfinityBaseWindow.cpp
index 685c582f33..cb66245cb4 100644
--- a/Source/Core/DolphinQt/InfinityBase/InfinityBaseWindow.cpp
+++ b/Source/Core/DolphinQt/InfinityBase/InfinityBaseWindow.cpp
@@ -26,6 +26,7 @@
#include "Core/System.h"
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
// Qt is not guaranteed to keep track of file paths using native file pickers, so we use this
@@ -149,6 +150,7 @@ void InfinityBaseWindow::LoadFigure(u8 slot)
void InfinityBaseWindow::CreateFigure(u8 slot)
{
CreateFigureDialog create_dlg(this, slot);
+ SetQWidgetWindowDecorations(&create_dlg);
if (create_dlg.exec() == CreateFigureDialog::Accepted)
{
LoadFigurePath(slot, create_dlg.GetFilePath());
diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp
index 1c658e8d62..39aa5c6f1f 100644
--- a/Source/Core/DolphinQt/Main.cpp
+++ b/Source/Core/DolphinQt/Main.cpp
@@ -2,11 +2,11 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#ifdef _WIN32
+#include <cstdio>
#include <string>
#include <vector>
#include <Windows.h>
-#include <cstdio>
#endif
#ifdef __linux__
@@ -33,6 +33,7 @@
#include "DolphinQt/MainWindow.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/RunOnObject.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Translation.h"
@@ -90,6 +91,7 @@ static bool QtMsgAlertHandler(const char* caption, const char* text, bool yes_no
return QMessageBox::NoIcon;
}());
+ SetQWidgetWindowDecorations(&message_box);
const int button = message_box.exec();
if (button == QMessageBox::Yes)
return true;
@@ -243,8 +245,11 @@ int main(int argc, char* argv[])
{
DolphinAnalytics::Instance().ReportDolphinStart("qt");
- MainWindow win{std::move(boot), static_cast<const char*>(options.get("movie"))};
+ Settings::Instance().InitDefaultPalette();
+ Settings::Instance().UpdateSystemDark();
Settings::Instance().SetCurrentUserStyle(Settings::Instance().GetCurrentUserStyle());
+
+ MainWindow win{std::move(boot), static_cast<const char*>(options.get("movie"))};
win.Show();
#if defined(USE_ANALYTICS) && USE_ANALYTICS
@@ -268,6 +273,7 @@ int main(int argc, char* argv[])
"This authorization can be revoked at any time through Dolphin's "
"settings."));
+ SetQWidgetWindowDecorations(&analytics_prompt);
const int answer = analytics_prompt.exec();
Config::SetBase(Config::MAIN_ANALYTICS_PERMISSION_ASKED, true);
diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp
index 42a6a04603..67d4ac46bb 100644
--- a/Source/Core/DolphinQt/MainWindow.cpp
+++ b/Source/Core/DolphinQt/MainWindow.cpp
@@ -108,6 +108,7 @@
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
#include "DolphinQt/QtUtils/RunOnObject.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/WindowActivationEventFilter.h"
#include "DolphinQt/RenderWidget.h"
#include "DolphinQt/ResourcePackManager.h"
@@ -1225,6 +1226,7 @@ void MainWindow::ShowControllersWindow()
InstallHotkeyFilter(m_controllers_window);
}
+ SetQWidgetWindowDecorations(m_controllers_window);
m_controllers_window->show();
m_controllers_window->raise();
m_controllers_window->activateWindow();
@@ -1238,6 +1240,7 @@ void MainWindow::ShowFreeLookWindow()
InstallHotkeyFilter(m_freelook_window);
}
+ SetQWidgetWindowDecorations(m_freelook_window);
m_freelook_window->show();
m_freelook_window->raise();
m_freelook_window->activateWindow();
@@ -1251,6 +1254,7 @@ void MainWindow::ShowSettingsWindow()
InstallHotkeyFilter(m_settings_window);
}
+ SetQWidgetWindowDecorations(m_settings_window);
m_settings_window->show();
m_settings_window->raise();
m_settings_window->activateWindow();
@@ -1271,6 +1275,7 @@ void MainWindow::ShowGeneralWindow()
void MainWindow::ShowAboutDialog()
{
AboutDialog about{this};
+ SetQWidgetWindowDecorations(&about);
about.exec();
}
@@ -1282,6 +1287,7 @@ void MainWindow::ShowHotkeyDialog()
InstallHotkeyFilter(m_hotkey_window);
}
+ SetQWidgetWindowDecorations(m_hotkey_window);
m_hotkey_window->show();
m_hotkey_window->raise();
m_hotkey_window->activateWindow();
@@ -1304,6 +1310,7 @@ void MainWindow::ShowGraphicsWindow()
InstallHotkeyFilter(m_graphics_window);
}
+ SetQWidgetWindowDecorations(m_graphics_window);
m_graphics_window->show();
m_graphics_window->raise();
m_graphics_window->activateWindow();
@@ -1311,6 +1318,7 @@ void MainWindow::ShowGraphicsWindow()
void MainWindow::ShowNetPlaySetupDialog()
{
+ SetQWidgetWindowDecorations(m_netplay_setup_dialog);
m_netplay_setup_dialog->show();
m_netplay_setup_dialog->raise();
m_netplay_setup_dialog->activateWindow();
@@ -1321,6 +1329,7 @@ void MainWindow::ShowNetPlayBrowser()
auto* browser = new NetPlayBrowser(this);
browser->setAttribute(Qt::WA_DeleteOnClose, true);
connect(browser, &NetPlayBrowser::Join, this, &MainWindow::NetPlayJoin);
+ SetQWidgetWindowDecorations(browser);
browser->exec();
}
@@ -1333,6 +1342,7 @@ void MainWindow::ShowFIFOPlayer()
[this](const QString& path) { StartGame(path, ScanForSecondDisc::No); });
}
+ SetQWidgetWindowDecorations(m_fifo_window);
m_fifo_window->show();
m_fifo_window->raise();
m_fifo_window->activateWindow();
@@ -1345,6 +1355,7 @@ void MainWindow::ShowSkylanderPortal()
m_skylander_window = new SkylanderPortalWindow();
}
+ SetQWidgetWindowDecorations(m_skylander_window);
m_skylander_window->show();
m_skylander_window->raise();
m_skylander_window->activateWindow();
@@ -1357,6 +1368,7 @@ void MainWindow::ShowInfinityBase()
m_infinity_window = new InfinityBaseWindow();
}
+ SetQWidgetWindowDecorations(m_infinity_window);
m_infinity_window->show();
m_infinity_window->raise();
m_infinity_window->activateWindow();
@@ -1703,6 +1715,36 @@ QSize MainWindow::sizeHint() const
return QSize(800, 600);
}
+#ifdef _WIN32
+bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, qintptr* result)
+{
+ auto* msg = reinterpret_cast<MSG*>(message);
+ if (msg && msg->message == WM_SETTINGCHANGE && msg->lParam != NULL &&
+ std::wstring_view(L"ImmersiveColorSet")
+ .compare(reinterpret_cast<const wchar_t*>(msg->lParam)) == 0)
+ {
+ // Windows light/dark theme has changed. Update our flag and refresh the theme.
+ auto& settings = Settings::Instance();
+ const bool was_dark_before = settings.IsSystemDark();
+ settings.UpdateSystemDark();
+ if (settings.IsSystemDark() != was_dark_before)
+ {
+ settings.SetCurrentUserStyle(settings.GetCurrentUserStyle());
+
+ // force the colors in the Skylander window to update
+ if (m_skylander_window)
+ m_skylander_window->RefreshList();
+ }
+
+ // TODO: When switching from light to dark, the window decorations remain light. Qt seems very
+ // convinced that it needs to change these in response to this message, so even if we set them
+ // to dark here, Qt sets them back to light afterwards.
+ }
+
+ return false;
+}
+#endif
+
void MainWindow::OnBootGameCubeIPL(DiscIO::Region region)
{
StartGame(std::make_unique<BootParameters>(BootParameters::IPL{region}));
@@ -1759,6 +1801,7 @@ void MainWindow::OnImportNANDBackup()
dialog.Reset();
});
+ SetQWidgetWindowDecorations(dialog.GetRaw());
dialog.GetRaw()->exec();
result.wait();
@@ -1866,6 +1909,7 @@ void MainWindow::ShowTASInput()
const auto si_device = Config::Get(Config::GetInfoForSIDevice(i));
if (si_device == SerialInterface::SIDEVICE_GC_GBA_EMULATED)
{
+ SetQWidgetWindowDecorations(m_gba_tas_input_windows[i]);
m_gba_tas_input_windows[i]->show();
m_gba_tas_input_windows[i]->raise();
m_gba_tas_input_windows[i]->activateWindow();
@@ -1873,6 +1917,7 @@ void MainWindow::ShowTASInput()
else if (si_device != SerialInterface::SIDEVICE_NONE &&
si_device != SerialInterface::SIDEVICE_GC_GBA)
{
+ SetQWidgetWindowDecorations(m_gc_tas_input_windows[i]);
m_gc_tas_input_windows[i]->show();
m_gc_tas_input_windows[i]->raise();
m_gc_tas_input_windows[i]->activateWindow();
@@ -1884,6 +1929,7 @@ void MainWindow::ShowTASInput()
if (Config::Get(Config::GetInfoForWiimoteSource(i)) == WiimoteSource::Emulated &&
(!Core::IsRunning() || SConfig::GetInstance().bWii))
{
+ SetQWidgetWindowDecorations(m_wii_tas_input_windows[i]);
m_wii_tas_input_windows[i]->show();
m_wii_tas_input_windows[i]->raise();
m_wii_tas_input_windows[i]->activateWindow();
@@ -1910,6 +1956,7 @@ void MainWindow::ShowAchievementsWindow()
m_achievements_window = new AchievementsWindow(this);
}
+ SetQWidgetWindowDecorations(m_achievements_window);
m_achievements_window->show();
m_achievements_window->raise();
m_achievements_window->activateWindow();
@@ -1920,6 +1967,7 @@ void MainWindow::ShowMemcardManager()
{
GCMemcardManager manager(this);
+ SetQWidgetWindowDecorations(&manager);
manager.exec();
}
@@ -1927,11 +1975,13 @@ void MainWindow::ShowResourcePackManager()
{
ResourcePackManager manager(this);
+ SetQWidgetWindowDecorations(&manager);
manager.exec();
}
void MainWindow::ShowCheatsManager()
{
+ SetQWidgetWindowDecorations(m_cheats_manager);
m_cheats_manager->show();
}
@@ -1950,6 +2000,7 @@ void MainWindow::ShowRiivolutionBootWidget(const UICommon::GameFile& game)
auto& disc = std::get<BootParameters::Disc>(boot_params->parameters);
RiivolutionBootWidget w(disc.volume->GetGameID(), disc.volume->GetRevision(),
disc.volume->GetDiscNumber(), game.GetFilePath(), this);
+ SetQWidgetWindowDecorations(&w);
w.exec();
if (!w.ShouldBoot())
return;
@@ -1961,7 +2012,10 @@ void MainWindow::ShowRiivolutionBootWidget(const UICommon::GameFile& game)
void MainWindow::Show()
{
if (!Settings::Instance().IsBatchModeEnabled())
+ {
+ SetQWidgetWindowDecorations(this);
QWidget::show();
+ }
// If the booting of a game was requested on start up, do that now
if (m_pending_boot != nullptr)
diff --git a/Source/Core/DolphinQt/MainWindow.h b/Source/Core/DolphinQt/MainWindow.h
index 4654202ed7..5b5de92fd8 100644
--- a/Source/Core/DolphinQt/MainWindow.h
+++ b/Source/Core/DolphinQt/MainWindow.h
@@ -210,6 +210,11 @@ private:
void dropEvent(QDropEvent* event) override;
QSize sizeHint() const override;
+#ifdef _WIN32
+ // This gets called for each event from the Windows message queue.
+ bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result) override;
+#endif
+
#ifdef HAVE_XRANDR
std::unique_ptr<X11Utils::XRRConfiguration> m_xrr_config;
#endif
diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp
index 37562a738c..664e40dd05 100644
--- a/Source/Core/DolphinQt/MenuBar.cpp
+++ b/Source/Core/DolphinQt/MenuBar.cpp
@@ -59,6 +59,7 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Updater.h"
@@ -1178,8 +1179,12 @@ void MenuBar::CheckNAND()
return;
}
- if (NANDRepairDialog(result, this).exec() != QDialog::Accepted)
- return;
+ {
+ NANDRepairDialog dialog(result, this);
+ SetQWidgetWindowDecorations(&dialog);
+ if (dialog.exec() != QDialog::Accepted)
+ return;
+ }
if (WiiUtils::RepairNAND(ios))
{
@@ -1336,6 +1341,7 @@ void MenuBar::GenerateSymbolsFromRSOAuto()
return matches;
});
+ SetQWidgetWindowDecorations(progress.GetRaw());
progress.GetRaw()->exec();
const auto matches = future.get();
diff --git a/Source/Core/DolphinQt/NKitWarningDialog.cpp b/Source/Core/DolphinQt/NKitWarningDialog.cpp
index d49db9da92..6c1bd5b117 100644
--- a/Source/Core/DolphinQt/NKitWarningDialog.cpp
+++ b/Source/Core/DolphinQt/NKitWarningDialog.cpp
@@ -14,14 +14,17 @@
#include "Common/Config/Config.h"
#include "Core/Config/MainSettings.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
bool NKitWarningDialog::ShowUnlessDisabled(QWidget* parent)
{
if (Config::Get(Config::MAIN_SKIP_NKIT_WARNING))
return true;
- else
- return NKitWarningDialog(parent).exec() == QDialog::Accepted;
+
+ NKitWarningDialog dialog(parent);
+ SetQWidgetWindowDecorations(&dialog);
+ return dialog.exec() == QDialog::Accepted;
}
NKitWarningDialog::NKitWarningDialog(QWidget* parent) : QDialog(parent)
diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp
index 9acd14977d..53bdedaece 100644
--- a/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp
+++ b/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp
@@ -26,6 +26,7 @@
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
NetPlayBrowser::NetPlayBrowser(QWidget* parent) : QDialog(parent)
@@ -303,6 +304,7 @@ void NetPlayBrowser::accept()
dialog->setWindowModality(Qt::WindowModal);
dialog->setTextEchoMode(QLineEdit::Password);
+ SetQWidgetWindowDecorations(dialog);
if (dialog->exec() != QDialog::Accepted)
return;
diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp
index c5edb9c0d9..509b5db28c 100644
--- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp
+++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp
@@ -51,6 +51,7 @@
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
#include "DolphinQt/QtUtils/RunOnObject.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Settings/GameCubePane.h"
@@ -213,6 +214,7 @@ void NetPlayDialog::CreateMainLayout()
m_game_digest_menu->addAction(tr("Other game..."), this, [this] {
GameListDialog gld(m_game_list_model, this);
+ SetQWidgetWindowDecorations(&gld);
if (gld.exec() != QDialog::Accepted)
return;
Settings::Instance().GetNetPlayServer()->ComputeGameDigest(
@@ -335,6 +337,7 @@ void NetPlayDialog::ConnectWidgets()
Settings::Instance().GetNetPlayServer()->KickPlayer(id);
});
connect(m_assign_ports_button, &QPushButton::clicked, [this] {
+ SetQWidgetWindowDecorations(m_pad_mapping);
m_pad_mapping->exec();
Settings::Instance().GetNetPlayServer()->SetPadMapping(m_pad_mapping->GetGCPadArray());
@@ -380,6 +383,7 @@ void NetPlayDialog::ConnectWidgets()
connect(m_game_button, &QPushButton::clicked, [this] {
GameListDialog gld(m_game_list_model, this);
+ SetQWidgetWindowDecorations(&gld);
if (gld.exec() == QDialog::Accepted)
{
Settings& settings = Settings::Instance();
diff --git a/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp b/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp
index a12088326c..e80db0ad7e 100644
--- a/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp
+++ b/Source/Core/DolphinQt/QtUtils/ModalMessageBox.cpp
@@ -5,6 +5,8 @@
#include <QApplication>
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
+
ModalMessageBox::ModalMessageBox(QWidget* parent, Qt::WindowModality modality)
: QMessageBox(parent != nullptr ? parent->window() : nullptr)
{
@@ -28,6 +30,7 @@ static inline int ExecMessageBox(ModalMessageBox::Icon icon, QWidget* parent, co
msg.setStandardButtons(buttons);
msg.setDefaultButton(default_button);
+ SetQWidgetWindowDecorations(&msg);
return msg.exec();
}
diff --git a/Source/Core/DolphinQt/QtUtils/SetWindowDecorations.cpp b/Source/Core/DolphinQt/QtUtils/SetWindowDecorations.cpp
new file mode 100644
index 0000000000..704e5a8f7f
--- /dev/null
+++ b/Source/Core/DolphinQt/QtUtils/SetWindowDecorations.cpp
@@ -0,0 +1,25 @@
+// Copyright 2023 Dolphin Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
+
+#include <QWidget>
+
+#include "DolphinQt/Settings.h"
+
+#ifdef _WIN32
+#include <dwmapi.h>
+#endif
+
+void SetQWidgetWindowDecorations(QWidget* widget)
+{
+#ifdef _WIN32
+ if (!Settings::Instance().IsSystemDark())
+ return;
+
+ BOOL use_dark_title_bar = TRUE;
+ DwmSetWindowAttribute(HWND(widget->winId()),
+ 20 /* DWMWINDOWATTRIBUTE::DWMWA_USE_IMMERSIVE_DARK_MODE */,
+ &use_dark_title_bar, DWORD(sizeof(use_dark_title_bar)));
+#endif
+}
diff --git a/Source/Core/DolphinQt/QtUtils/SetWindowDecorations.h b/Source/Core/DolphinQt/QtUtils/SetWindowDecorations.h
new file mode 100644
index 0000000000..aa4b3d8687
--- /dev/null
+++ b/Source/Core/DolphinQt/QtUtils/SetWindowDecorations.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Dolphin Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+class QWidget;
+
+// Changes the window decorations (title bar) to dark if the user uses dark mode on Windows.
+void SetQWidgetWindowDecorations(QWidget* widget);
diff --git a/Source/Core/DolphinQt/ResourcePackManager.cpp b/Source/Core/DolphinQt/ResourcePackManager.cpp
index ad464a76ea..eac48cd6c5 100644
--- a/Source/Core/DolphinQt/ResourcePackManager.cpp
+++ b/Source/Core/DolphinQt/ResourcePackManager.cpp
@@ -14,6 +14,7 @@
#include "Common/FileUtil.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "UICommon/ResourcePack/Manager.h"
ResourcePackManager::ResourcePackManager(QWidget* widget) : QDialog(widget)
@@ -241,6 +242,7 @@ void ResourcePackManager::Remove()
box.setIcon(QMessageBox::Warning);
box.setStandardButtons(QMessageBox::Yes | QMessageBox::Abort);
+ SetQWidgetWindowDecorations(&box);
if (box.exec() != QMessageBox::Yes)
return;
diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp
index c6a06336e2..ebcf90ee8e 100644
--- a/Source/Core/DolphinQt/Settings.cpp
+++ b/Source/Core/DolphinQt/Settings.cpp
@@ -4,21 +4,25 @@
#include "DolphinQt/Settings.h"
#include <atomic>
+#include <memory>
#include <QApplication>
+#include <QColor>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QFontDatabase>
+#include <QPalette>
#include <QRadioButton>
#include <QSize>
+#include <QStyle>
#include <QWidget>
#ifdef _WIN32
-#include <memory>
-
#include <fmt/format.h>
+#include <winrt/Windows.UI.ViewManagement.h>
+
#include <QTabBar>
#include <QToolButton>
#endif
@@ -47,6 +51,9 @@
#include "VideoCommon/NetPlayChatUI.h"
#include "VideoCommon/NetPlayGolfUI.h"
+static bool s_system_dark = false;
+static std::unique_ptr<QPalette> s_default_palette;
+
Settings::Settings()
{
qRegisterMetaType<Core::State>();
@@ -125,6 +132,42 @@ QString Settings::GetCurrentUserStyle() const
return QFileInfo(GetQSettings().value(QStringLiteral("userstyle/path")).toString()).fileName();
}
+void Settings::InitDefaultPalette()
+{
+ s_default_palette = std::make_unique<QPalette>(qApp->palette());
+}
+
+void Settings::UpdateSystemDark()
+{
+#ifdef _WIN32
+ // Check if the system is set to dark mode so we can set the default theme and window
+ // decorations accordingly.
+ {
+ using namespace winrt::Windows::UI::ViewManagement;
+ const UISettings settings;
+ const auto& color = settings.GetColorValue(UIColorType::Foreground);
+
+ const bool is_system_dark = 5 * color.G + 2 * color.R + color.B > 8 * 128;
+ Settings::Instance().SetSystemDark(is_system_dark);
+ }
+#endif
+}
+
+void Settings::SetSystemDark(bool dark)
+{
+ s_system_dark = dark;
+}
+
+bool Settings::IsSystemDark()
+{
+ return s_system_dark;
+}
+
+bool Settings::IsThemeDark()
+{
+ return qApp->palette().color(QPalette::Base).valueF() < 0.5;
+}
+
// Calling this before the main window has been created breaks the style of some widgets.
void Settings::SetCurrentUserStyle(const QString& stylesheet_name)
{
@@ -141,6 +184,44 @@ void Settings::SetCurrentUserStyle(const QString& stylesheet_name)
stylesheet_contents = QString::fromUtf8(stylesheet.readAll().data());
}
+#ifdef _WIN32
+ if (stylesheet_contents.isEmpty())
+ {
+ // No theme selected or found. Usually we would just fallthrough and set an empty stylesheet
+ // which would select Qt's default theme, but unlike other OSes we don't automatically get a
+ // default dark theme on Windows when the user has selected dark mode in the Windows settings.
+ // So manually check if the user wants dark mode and, if yes, load our embedded dark theme.
+ if (IsSystemDark())
+ {
+ QFile file(QStringLiteral(":/dolphin_dark_win/dark.qss"));
+ if (file.open(QFile::ReadOnly))
+ stylesheet_contents = QString::fromUtf8(file.readAll().data());
+
+ QPalette palette = qApp->style()->standardPalette();
+ palette.setColor(QPalette::Window, QColor(32, 32, 32));
+ palette.setColor(QPalette::WindowText, QColor(220, 220, 220));
+ palette.setColor(QPalette::Base, QColor(32, 32, 32));
+ palette.setColor(QPalette::AlternateBase, QColor(48, 48, 48));
+ palette.setColor(QPalette::PlaceholderText, QColor(126, 126, 126));
+ palette.setColor(QPalette::Text, QColor(220, 220, 220));
+ palette.setColor(QPalette::Button, QColor(48, 48, 48));
+ palette.setColor(QPalette::ButtonText, QColor(220, 220, 220));
+ palette.setColor(QPalette::BrightText, QColor(255, 255, 255));
+ palette.setColor(QPalette::Highlight, QColor(0, 120, 215));
+ palette.setColor(QPalette::HighlightedText, QColor(255, 255, 255));
+ palette.setColor(QPalette::Link, QColor(100, 160, 220));
+ palette.setColor(QPalette::LinkVisited, QColor(100, 160, 220));
+ qApp->setPalette(palette);
+ }
+ else
+ {
+ // reset any palette changes that may exist from a previously set dark mode
+ if (s_default_palette)
+ qApp->setPalette(*s_default_palette);
+ }
+ }
+#endif
+
// Define tooltips style if not already defined
if (!stylesheet_contents.contains(QStringLiteral("QToolTip"), Qt::CaseSensitive))
{
diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h
index 30ab757753..5583ed0628 100644
--- a/Source/Core/DolphinQt/Settings.h
+++ b/Source/Core/DolphinQt/Settings.h
@@ -52,6 +52,11 @@ public:
// UI
void SetThemeName(const QString& theme_name);
+ void InitDefaultPalette();
+ void UpdateSystemDark();
+ void SetSystemDark(bool dark);
+ bool IsSystemDark();
+ bool IsThemeDark();
void SetCurrentUserStyle(const QString& stylesheet_name);
QString GetCurrentUserStyle() const;
diff --git a/Source/Core/DolphinQt/Settings/GameCubePane.cpp b/Source/Core/DolphinQt/Settings/GameCubePane.cpp
index a19fce31fb..78be23d5f2 100644
--- a/Source/Core/DolphinQt/Settings/GameCubePane.cpp
+++ b/Source/Core/DolphinQt/Settings/GameCubePane.cpp
@@ -39,6 +39,7 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/SignalBlocking.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Settings/BroadbandAdapterSettingsDialog.h"
@@ -379,22 +380,32 @@ void GameCubePane::OnConfigPressed(ExpansionInterface::Slot slot)
BrowseAGPRom(slot);
return;
case ExpansionInterface::EXIDeviceType::Microphone:
+ {
// TODO: convert MappingWindow to use Slot?
- MappingWindow(this, MappingWindow::Type::MAPPING_GC_MICROPHONE, static_cast<int>(slot)).exec();
+ MappingWindow dialog(this, MappingWindow::Type::MAPPING_GC_MICROPHONE, static_cast<int>(slot));
+ SetQWidgetWindowDecorations(&dialog);
+ dialog.exec();
return;
+ }
case ExpansionInterface::EXIDeviceType::Ethernet:
{
- BroadbandAdapterSettingsDialog(this, BroadbandAdapterSettingsDialog::Type::Ethernet).exec();
+ BroadbandAdapterSettingsDialog dialog(this, BroadbandAdapterSettingsDialog::Type::Ethernet);
+ SetQWidgetWindowDecorations(&dialog);
+ dialog.exec();
return;
}
case ExpansionInterface::EXIDeviceType::EthernetXLink:
{
- BroadbandAdapterSettingsDialog(this, BroadbandAdapterSettingsDialog::Type::XLinkKai).exec();
+ BroadbandAdapterSettingsDialog dialog(this, BroadbandAdapterSettingsDialog::Type::XLinkKai);
+ SetQWidgetWindowDecorations(&dialog);
+ dialog.exec();
return;
}
case ExpansionInterface::EXIDeviceType::EthernetBuiltIn:
{
- BroadbandAdapterSettingsDialog(this, BroadbandAdapterSettingsDialog::Type::BuiltIn).exec();
+ BroadbandAdapterSettingsDialog dialog(this, BroadbandAdapterSettingsDialog::Type::BuiltIn);
+ SetQWidgetWindowDecorations(&dialog);
+ dialog.exec();
return;
}
default:
diff --git a/Source/Core/DolphinQt/Settings/GeneralPane.cpp b/Source/Core/DolphinQt/Settings/GeneralPane.cpp
index f958a383ec..f5f56193e0 100644
--- a/Source/Core/DolphinQt/Settings/GeneralPane.cpp
+++ b/Source/Core/DolphinQt/Settings/GeneralPane.cpp
@@ -24,6 +24,7 @@
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/SignalBlocking.h"
#include "DolphinQt/Settings.h"
@@ -370,6 +371,7 @@ void GeneralPane::GenerateNewIdentity()
message_box.setIcon(QMessageBox::Information);
message_box.setWindowTitle(tr("Identity Generation"));
message_box.setText(tr("New identity generated."));
+ SetQWidgetWindowDecorations(&message_box);
message_box.exec();
}
#endif
diff --git a/Source/Core/DolphinQt/Settings/WiiPane.cpp b/Source/Core/DolphinQt/Settings/WiiPane.cpp
index 9cb9677e20..19170b5517 100644
--- a/Source/Core/DolphinQt/Settings/WiiPane.cpp
+++ b/Source/Core/DolphinQt/Settings/WiiPane.cpp
@@ -35,6 +35,7 @@
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/QtUtils/SignalBlocking.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Settings/USBDeviceAddToWhitelistDialog.h"
@@ -288,6 +289,7 @@ void WiiPane::CreateSDCard()
progress_dialog.Reset();
return good;
});
+ SetQWidgetWindowDecorations(progress_dialog.GetRaw());
progress_dialog.GetRaw()->exec();
if (!success.get())
ModalMessageBox::warning(this, tr("Convert Folder to File Now"), tr("Conversion failed."));
@@ -312,6 +314,7 @@ void WiiPane::CreateSDCard()
progress_dialog.Reset();
return good;
});
+ SetQWidgetWindowDecorations(progress_dialog.GetRaw());
progress_dialog.GetRaw()->exec();
if (!success.get())
ModalMessageBox::warning(this, tr("Convert File to Folder Now"), tr("Conversion failed."));
@@ -468,6 +471,7 @@ void WiiPane::OnUSBWhitelistAddButton()
USBDeviceAddToWhitelistDialog usb_whitelist_dialog(this);
connect(&usb_whitelist_dialog, &USBDeviceAddToWhitelistDialog::accepted, this,
&WiiPane::PopulateUSBPassthroughListWidget);
+ SetQWidgetWindowDecorations(&usb_whitelist_dialog);
usb_whitelist_dialog.exec();
}
diff --git a/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp b/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp
index 88dcbf84a8..2ef2d43edb 100644
--- a/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp
+++ b/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp
@@ -34,6 +34,7 @@
#include "Core/System.h"
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h"
@@ -560,6 +561,7 @@ void SkylanderPortalWindow::CreateSkylanderAdvanced()
connect(buttons, &QDialogButtonBox::rejected, create_window, &QDialog::reject);
+ SetQWidgetWindowDecorations(create_window);
create_window->show();
create_window->raise();
}
@@ -610,6 +612,8 @@ void SkylanderPortalWindow::UpdateCurrentIDs()
void SkylanderPortalWindow::RefreshList()
{
+ const bool is_dark_theme = Settings::Instance().IsThemeDark();
+
const int row = m_skylander_list->currentRow();
m_skylander_list->clear();
if (m_only_show_collection->isChecked())
@@ -633,8 +637,16 @@ void SkylanderPortalWindow::RefreshList()
{
const uint qvar = (ids.first << 16) | ids.second;
QListWidgetItem* skylander = new QListWidgetItem(file.baseName());
- skylander->setBackground(GetBaseColor(ids));
- skylander->setForeground(QBrush(QColor(0, 0, 0, 255)));
+ if (is_dark_theme)
+ {
+ skylander->setBackground(GetBaseColor(ids, true));
+ skylander->setForeground(QBrush(QColor(220, 220, 220)));
+ }
+ else
+ {
+ skylander->setBackground(GetBaseColor(ids, false));
+ skylander->setForeground(QBrush(QColor(0, 0, 0)));
+ }
skylander->setData(1, qvar);
m_skylander_list->addItem(skylander);
}
@@ -650,8 +662,16 @@ void SkylanderPortalWindow::RefreshList()
{
const uint qvar = (entry.first.first << 16) | entry.first.second;
QListWidgetItem* skylander = new QListWidgetItem(tr(entry.second.name));
- skylander->setBackground(GetBaseColor(entry.first));
- skylander->setForeground(QBrush(QColor(0, 0, 0, 255)));
+ if (is_dark_theme)
+ {
+ skylander->setBackground(GetBaseColor(entry.first, true));
+ skylander->setForeground(QBrush(QColor(220, 220, 220)));
+ }
+ else
+ {
+ skylander->setBackground(GetBaseColor(entry.first, false));
+ skylander->setForeground(QBrush(QColor(0, 0, 0)));
+ }
skylander->setData(1, qvar);
m_skylander_list->addItem(skylander);
}
@@ -895,27 +915,27 @@ int SkylanderPortalWindow::GetElementRadio()
return -1;
}
-QBrush SkylanderPortalWindow::GetBaseColor(std::pair<const u16, const u16> ids)
+QBrush SkylanderPortalWindow::GetBaseColor(std::pair<const u16, const u16> ids, bool dark_theme)
{
auto skylander = IOS::HLE::USB::list_skylanders.find(ids);
if (skylander == IOS::HLE::USB::list_skylanders.end())
- return QBrush(QColor(255, 255, 255, 255));
+ return QBrush(dark_theme ? QColor(32, 32, 32) : QColor(255, 255, 255));
switch ((*skylander).second.game)
{
case IOS::HLE::USB::Game::SpyrosAdv:
- return QBrush(QColor(240, 255, 240, 255));
+ return QBrush(dark_theme ? QColor(10, 42, 90) : QColor(240, 255, 240));
case IOS::HLE::USB::Game::Giants:
- return QBrush(QColor(255, 240, 215, 255));
+ return QBrush(dark_theme ? QColor(120, 16, 12) : QColor(255, 240, 215));
case IOS::HLE::USB::Game::SwapForce:
- return QBrush(QColor(240, 245, 255, 255));
+ return QBrush(dark_theme ? QColor(28, 45, 12) : QColor(240, 245, 255));
case IOS::HLE::USB::Game::TrapTeam:
- return QBrush(QColor(255, 240, 240, 255));
+ return QBrush(dark_theme ? QColor(0, 56, 76) : QColor(255, 240, 240));
case IOS::HLE::USB::Game::Superchargers:
- return QBrush(QColor(247, 228, 215, 255));
+ return QBrush(dark_theme ? QColor(90, 12, 12) : QColor(247, 228, 215));
default:
- return QBrush(QColor(255, 255, 255, 255));
+ return QBrush(dark_theme ? QColor(32, 32, 32) : QColor(255, 255, 255));
}
}
diff --git a/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.h b/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.h
index 72ce63420a..293b056199 100644
--- a/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.h
+++ b/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.h
@@ -37,6 +37,8 @@ public:
explicit SkylanderPortalWindow(QWidget* parent = nullptr);
~SkylanderPortalWindow() override;
+ void RefreshList();
+
protected:
std::array<QLineEdit*, MAX_SKYLANDERS> m_edit_skylanders;
std::array<std::optional<Skylander>, MAX_SKYLANDERS> m_sky_slots;
@@ -60,7 +62,6 @@ private:
// Behind the scenes
void OnEmulationStateChanged(Core::State state);
void OnCollectionPathChanged();
- void RefreshList();
void UpdateCurrentIDs();
void CreateSkyfile(const QString& path, bool load_after);
void LoadSkyfilePath(u8 slot, const QString& path);
@@ -71,7 +72,7 @@ private:
QString GetFilePath(u16 id, u16 var);
u8 GetCurrentSlot();
int GetElementRadio();
- QBrush GetBaseColor(std::pair<const u16, const u16> ids);
+ QBrush GetBaseColor(std::pair<const u16, const u16> ids, bool dark_theme);
int GetGameID(IOS::HLE::USB::Game game);
int GetElementID(IOS::HLE::USB::Element elem);
diff --git a/Source/Core/DolphinQt/Styles/Dark/checkbox-checked-disabled.svg b/Source/Core/DolphinQt/Styles/Dark/checkbox-checked-disabled.svg
new file mode 100644
index 0000000000..2c630f0b8a
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/checkbox-checked-disabled.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
+<polyline points="250,700 500,950 1100,350" stroke="#7e7e7e" stroke-width="150" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/checkbox-checked.svg b/Source/Core/DolphinQt/Styles/Dark/checkbox-checked.svg
new file mode 100644
index 0000000000..a9164e1c72
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/checkbox-checked.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
+<polyline points="250,700 500,950 1100,350" stroke="#7e7e7e" stroke-width="150" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/checkbox-empty-disabled.svg b/Source/Core/DolphinQt/Styles/Dark/checkbox-empty-disabled.svg
new file mode 100644
index 0000000000..5e4660fd8a
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/checkbox-empty-disabled.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/checkbox-empty.svg b/Source/Core/DolphinQt/Styles/Dark/checkbox-empty.svg
new file mode 100644
index 0000000000..43dd3887ce
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/checkbox-empty.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/checkbox-half-disabled.svg b/Source/Core/DolphinQt/Styles/Dark/checkbox-half-disabled.svg
new file mode 100644
index 0000000000..ade83d8df5
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/checkbox-half-disabled.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
+<rect x="350" y="350" width="600" height="600" style="stroke:#7e7e7e;stroke-width:100;fill:#7e7e7e;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/checkbox-half.svg b/Source/Core/DolphinQt/Styles/Dark/checkbox-half.svg
new file mode 100644
index 0000000000..4f6aa9a032
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/checkbox-half.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<rect x="50" y="50" width="1200" height="1200" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
+<rect x="350" y="350" width="600" height="600" style="stroke:#7e7e7e;stroke-width:100;fill:#7e7e7e;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/dark.qrc b/Source/Core/DolphinQt/Styles/Dark/dark.qrc
new file mode 100644
index 0000000000..025d685de1
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/dark.qrc
@@ -0,0 +1,30 @@
+<RCC>
+ <qresource prefix="/dolphin_dark_win">
+ <file>dark.qss</file>
+ <file>checkbox-checked.svg</file>
+ <file>checkbox-checked-disabled.svg</file>
+ <file>checkbox-empty.svg</file>
+ <file>checkbox-empty-disabled.svg</file>
+ <file>checkbox-half.svg</file>
+ <file>checkbox-half-disabled.svg</file>
+ <file>dockwidget-close.svg</file>
+ <file>dockwidget-undock.svg</file>
+ <file>down-triangle.svg</file>
+ <file>down-triangle-spinbox.svg</file>
+ <file>dropdown-arrow.svg</file>
+ <file>left-triangle-tabbar.svg</file>
+ <file>radiobutton-checked.svg</file>
+ <file>radiobutton-checked-disabled.svg</file>
+ <file>radiobutton-empty.svg</file>
+ <file>radiobutton-empty-disabled.svg</file>
+ <file>right-triangle-tabbar.svg</file>
+ <file>scrollbar-arrow-down.svg</file>
+ <file>scrollbar-arrow-left.svg</file>
+ <file>scrollbar-arrow-right.svg</file>
+ <file>scrollbar-arrow-up.svg</file>
+ <file>table-header-sort-arrow-down.svg</file>
+ <file>table-header-sort-arrow-up.svg</file>
+ <file>up-triangle.svg</file>
+ <file>up-triangle-spinbox.svg</file>
+ </qresource>
+</RCC>
diff --git a/Source/Core/DolphinQt/Styles/Dark/dark.qss b/Source/Core/DolphinQt/Styles/Dark/dark.qss
new file mode 100644
index 0000000000..9d41736fdb
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/dark.qss
@@ -0,0 +1,487 @@
+/*
+Theme for a look and feel like our default Windows theme, but dark
+*/
+
+* {
+ color: #dcdcdc;
+}
+*:disabled {
+ color: #7e7e7e;
+}
+
+/*
+window title bars apparently can't be styled
+would be #000000 for active, #2b2b2b for background
+*/
+
+QMenu {
+ border: 1px solid #7e7e7e;
+}
+QMenuBar {
+ background-color: #202020;
+ color: #dcdcdc;
+ border: 0px;
+}
+QMenu {
+ background-color: #202020;
+ color: #dcdcdc;
+ border: 1px solid #7e7e7e;
+}
+QMenuBar::item {
+ background-color: #202020;
+ color: #dcdcdc;
+ border: 0px;
+ padding-left: 8px;
+ padding-right: 8px;
+ padding-top: 3px;
+ padding-bottom: 2px;
+ margin: 0px;
+}
+QMenuBar {
+ border-color: #404040;
+}
+QMenu::item {
+ background-color: #202020;
+ color: #dcdcdc;
+ border: 0px;
+ padding-left: 8px;
+ padding-right: 32px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ margin: 0px;
+}
+QMenuBar::item:hover, QMenuBar::item:selected, QMenu::item:hover, QMenu::item:selected {
+ background-color: #404040;
+ color: #dcdcdc;
+}
+QMenuBar::item:disabled, QMenu::item:disabled {
+ color: #7e7e7e;
+}
+QMenu::separator {
+ height: 1px;
+ background-color: #7e7e7e;
+ margin-left: 2px;
+ margin-right: 2px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+QWidget {
+ background-color: #202020;
+}
+QColumnView, QListView, QTableView, QTableWidget, QTreeView {
+ background-color: #202020;
+ alternate-background-color: #303030;
+ border: 1px solid #7e7e7e;
+ selection-background-color: #505050; /* #202050; */
+ gridline-color: #606060;
+}
+/*
+would be consistent with Explorer, but Qt keeps the focus color even if you click away from the item, which is confusing
+QColumnView::item:focus, QListView::item:focus, QTableView::item:focus, QTableWidget::item:focus, QTreeView::item:focus {
+ background-color: #606060;
+}
+*/
+QHeaderView::section {
+ background-color: #202020;
+ border: 0px;
+ border-right: 1px solid #7e7e7e;
+ padding: 0px;
+ text-align: right;
+
+ /*
+ this is a hack, Qt is extremely convinced that the sort arrow belongs on the right side
+ of the header and will reserve space for it there. so this applies that same space to the left
+ so the text is still centered correctly.
+ */
+ padding-left: 10px;
+}
+QHeaderView::section:last {
+ border-right: 0px;
+}
+QHeaderView::section:hover, QHeaderView::section:checked {
+ background-color: #404040;
+}
+QHeaderView::down-arrow {
+ subcontrol-origin: margin;
+ subcontrol-position: top center;
+ image: url(:/dolphin_dark_win/table-header-sort-arrow-down.svg);
+ width: 10px;
+ height: 7px;
+ background: transparent;
+}
+QHeaderView::up-arrow {
+ subcontrol-origin: margin;
+ subcontrol-position: top center;
+ image: url(:/dolphin_dark_win/table-header-sort-arrow-up.svg);
+ width: 10px;
+ height: 7px;
+ background: transparent;
+}
+
+QTabWidget::pane {
+ border: 1px solid #7e7e7e;
+ top: -1px; /* move border behind tabs */
+}
+QTabWidget::tab-bar {
+ left: 2px; /* leave space on the side of the tabs */
+}
+
+QTabBar {
+ /* The outline on the focused tab has an incorrect position and as far as I can tell there's no way to move it.
+ So as a hack, remove it and apply an underline to the text instead. */
+ outline: 0px;
+}
+QTabBar::tab {
+ background-color: #303030;
+ border-left: 1px solid #7e7e7e;
+ border-right: 1px solid #7e7e7e;
+ border-top: 1px solid #7e7e7e;
+ border-bottom: 1px solid #7e7e7e;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ padding-left: 9px;
+ padding-right: 10px;
+ margin-right: -1px; /* so adjacent tab borders overlap */
+}
+QTabBar::tab:only-one {
+ margin-right: 0px;
+}
+QTabBar::tab:last {
+ margin-right: 0px;
+}
+QTabBar::tab:hover {
+ background-color: #404040;
+}
+QTabBar::tab:selected {
+ border-bottom: 0px;
+ background-color: #202020;
+ padding-bottom: 1px;
+}
+QTabBar::tab:focus {
+ text-decoration: underline;
+}
+QTabBar::tab:!selected {
+ margin-top: 2px;
+}
+
+QDockWidget {
+ background-color: #404040;
+ titlebar-close-icon: url(:/dolphin_dark_win/dockwidget-close.svg);
+ titlebar-normal-icon: url(:/dolphin_dark_win/dockwidget-undock.svg);
+}
+
+QPushButton, QToolButton {
+ background-color: #303030;
+ border: 1px solid #7e7e7e;
+ padding: 2px;
+ min-width: 67px;
+}
+QPushButton:hover, QToolButton:hover {
+ background-color: #404040;
+}
+QPushButton:focus, QToolButton:focus {
+ background-color: #404040;
+}
+QPushButton:disabled, QToolButton:disabled {
+ background-color: #505050;
+}
+
+/* the dropdownarrow on the right of the button in menu popup mode */
+QToolButton[popupMode="1"] {
+ padding-right: 19px;
+}
+QToolButton::menu-button {
+ border: 0px;
+ border-left: 1px solid #7e7e7e;
+ width: 18px;
+}
+QToolButton::menu-arrow {
+ image: url(:/dolphin_dark_win/down-triangle.svg);
+ width: 14px;
+}
+
+/* the icon bar at the top of the main window */
+QToolBar {
+ border: 0px;
+}
+QToolBar QToolButton {
+ border: 0px;
+ padding: 0px;
+ padding-left: 3px;
+ padding-right: 2px;
+ min-width: 50px;
+ background-color: #202020;
+}
+QToolBar QToolButton:hover {
+ background-color: #404040;
+}
+QToolBar QToolButton:focus {
+ background-color: #404040;
+}
+QToolBar QToolButton:disabled {
+ background-color: #202020;
+}
+QToolBar::separator {
+ min-width: 0px;
+ width: 1px;
+ margin-left: 3px;
+ margin-right: 2px;
+ background-color: #7e7e7e;
+}
+
+QGroupBox {
+ border: 1px solid #7e7e7e;
+ margin-top: 9px;
+ padding-top: 7px;
+ padding-bottom: 0px;
+ padding-left: 1px;
+ padding-right: 1px;
+}
+QGroupBox::title {
+ subcontrol-origin: margin;
+ subcontrol-position: top left;
+ left: 9px;
+ padding-top: 1px;
+ min-width: 0px;
+}
+
+QLineEdit, QTextEdit {
+ border: 1px solid #7e7e7e;
+}
+QLineEdit:disabled, QTextEdit:disabled {
+ background-color: #505050;
+}
+
+QComboBox {
+ background-color: #303030;
+ border: 1px solid #7e7e7e;
+ margin: 0px;
+ padding-left: 3px;
+ padding-right: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+}
+QComboBox:disabled {
+ background-color: #505050;
+}
+QComboBox:selected {
+ background-color: #404040;
+}
+QComboBox:editable {
+ background-color: #202020;
+}
+QComboBox::drop-down {
+ border: 0px;
+}
+QComboBox::down-arrow {
+ image: url(:/dolphin_dark_win/dropdown-arrow.svg);
+ height: 10px;
+ width: 15px;
+}
+QComboBox QAbstractItemView {
+ background-color: #303030;
+ selection-background-color: #404040;
+ border: 1px solid #7e7e7e;
+ padding: 0px;
+ margin: 0px;
+ outline: 0px;
+}
+QComboBox QAbstractItemView::item:selected {
+ color: #dcdcdc;
+ background-color: #404040;
+}
+QComboBox QAbstractItemView::item:last {
+ border: 0px;
+}
+
+QScrollBar:vertical {
+ border: 0px;
+ background: #303030;
+ width: 15px;
+ margin: 15px 0px;
+}
+QScrollBar::handle:vertical { /* the bar in the middle */
+ border: 0px;
+ background: #606060;
+ min-height: 20px;
+}
+QScrollBar::add-line:vertical { /* the down button at the bottom */
+ border: 0px;
+ background: #303030;
+ height: 15px;
+ subcontrol-position: bottom;
+ subcontrol-origin: margin;
+}
+QScrollBar::sub-line:vertical { /* the up button at the top */
+ border: 0px;
+ background: #303030;
+ height: 15px;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+}
+QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { /* the area between the bar and the up/down buttons */
+ border: 0px;
+ background: none;
+}
+QScrollBar::up-arrow:vertical {
+ image: url(:/dolphin_dark_win/scrollbar-arrow-up.svg);
+ height: 15px;
+}
+QScrollBar::down-arrow:vertical {
+ image: url(:/dolphin_dark_win/scrollbar-arrow-down.svg);
+ height: 15px;
+}
+QScrollBar:horizontal {
+ border: 0px;
+ background: #303030;
+ height: 15px;
+ margin: 0px 15px;
+}
+QScrollBar::handle:horizontal { /* the bar in the middle */
+ border: 0px;
+ background: #606060;
+ min-width: 20px;
+}
+QScrollBar::add-line:horizontal { /* the right button */
+ border: 0px;
+ background: #303030;
+ width: 15px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+}
+QScrollBar::sub-line:horizontal { /* the left button */
+ border: 0px;
+ background: #303030;
+ width: 15px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+}
+QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { /* the area between the bar and the left/right buttons */
+ border: 0px;
+ background: none;
+}
+QScrollBar::left-arrow:horizontal {
+ image: url(:/dolphin_dark_win/scrollbar-arrow-left.svg);
+ width: 15px;
+}
+QScrollBar::right-arrow:horizontal {
+ image: url(:/dolphin_dark_win/scrollbar-arrow-right.svg);
+ width: 15px;
+}
+
+QSpinBox, QDateEdit, QDateTimeEdit, QTimeEdit, QDoubleSpinBox {
+ border: 1px solid #7e7e7e;
+ padding-right: 15px;
+}
+QSpinBox:disabled, QDateEdit:disabled, QDateTimeEdit:disabled, QTimeEdit:disabled, QDoubleSpinBox:disabled {
+ background-color: #505050;
+}
+QSpinBox::up-button, QDateEdit::up-button, QDateTimeEdit::up-button, QTimeEdit::up-button, QDoubleSpinBox::up-button {
+ border: 1px transparent;
+ subcontrol-origin: border;
+ subcontrol-position: top right;
+ width: 16px;
+}
+QSpinBox::down-button, QDateEdit::down-button, QDateTimeEdit::down-button, QTimeEdit::down-button, QDoubleSpinBox::down-button {
+ border: 1px transparent;
+ subcontrol-origin: border;
+ subcontrol-position: bottom right;
+ width: 16px;
+}
+QSpinBox::up-arrow, QDateEdit::up-arrow, QDateTimeEdit::up-arrow, QTimeEdit::up-arrow, QDoubleSpinBox::up-arrow {
+ image: url(:/dolphin_dark_win/up-triangle-spinbox.svg);
+ width: 14px;
+ height: 7px;
+}
+QSpinBox::down-arrow, QDateEdit::down-arrow, QDateTimeEdit::down-arrow, QTimeEdit::down-arrow, QDoubleSpinBox::down-arrow {
+ image: url(:/dolphin_dark_win/down-triangle-spinbox.svg);
+ width: 14px;
+ height: 7px;
+}
+
+/*
+QSlider ticks break if you try to style the groove.
+https://stackoverflow.com/questions/27531542/tick-marks-disappear-on-styled-qslider
+https://bugreports.qt.io/browse/QTBUG-3564 (yes that's from 2009 and it's still accurate)
+Truly bizarre. I'll just refrain from styling it from now...
+*/
+QSlider::handle {
+ background-color: #dcdcdc;
+}
+QSlider::handle:disabled {
+ background-color: #7e7e7e;
+}
+
+QCheckBox {
+ padding: 2px 0px;
+}
+QCheckBox::indicator {
+ padding: 0px;
+ margin: 0px;
+ border: 0px;
+ width: 13px;
+ height: 13px;
+}
+QCheckBox::indicator:unchecked {
+ image: url(:/dolphin_dark_win/checkbox-empty.svg);
+}
+QCheckBox::indicator:unchecked:disabled {
+ image: url(:/dolphin_dark_win/checkbox-empty-disabled.svg);
+}
+QCheckBox::indicator:checked {
+ image: url(:/dolphin_dark_win/checkbox-checked.svg);
+}
+QCheckBox::indicator:checked:disabled {
+ image: url(:/dolphin_dark_win/checkbox-checked-disabled.svg);
+}
+QCheckBox::indicator:indeterminate {
+ image: url(:/dolphin_dark_win/checkbox-half.svg);
+}
+QCheckBox::indicator:indeterminate:disabled {
+ image: url(:/dolphin_dark_win/checkbox-half-disabled.svg);
+}
+
+QRadioButton {
+ padding: 2px 0px;
+}
+QRadioButton::indicator {
+ padding: 0px;
+ margin: 0px;
+ border: 0px;
+ width: 13px;
+ height: 13px;
+}
+QRadioButton::indicator:unchecked {
+ image: url(:/dolphin_dark_win/radiobutton-empty.svg);
+}
+QRadioButton::indicator:unchecked:disabled {
+ image: url(:/dolphin_dark_win/radiobutton-empty-disabled.svg);
+}
+QRadioButton::indicator:checked {
+ image: url(:/dolphin_dark_win/radiobutton-checked.svg);
+}
+QRadioButton::indicator:checked:disabled {
+ image: url(:/dolphin_dark_win/radiobutton-checked-disabled.svg);
+}
+
+QListView::indicator:unchecked {
+ image: url(:/dolphin_dark_win/checkbox-empty.svg);
+}
+QListView::indicator:checked {
+ image: url(:/dolphin_dark_win/checkbox-checked.svg);
+}
+QListView::indicator:indeterminate {
+ image: url(:/dolphin_dark_win/checkbox-half.svg);
+}
+
+QTabBar QToolButton {
+ background-color: #202020;
+ min-width: 0px;
+}
+QTabBar QToolButton::left-arrow {
+ image: url(:/dolphin_dark_win/left-triangle-tabbar.svg);
+}
+QTabBar QToolButton::right-arrow {
+ image: url(:/dolphin_dark_win/right-triangle-tabbar.svg);
+}
diff --git a/Source/Core/DolphinQt/Styles/Dark/dockwidget-close.svg b/Source/Core/DolphinQt/Styles/Dark/dockwidget-close.svg
new file mode 100644
index 0000000000..a58a58caa9
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/dockwidget-close.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<line x1="100" y1="100" x2="1200" y2="1200" stroke="#7e7e7e" stroke-width="100" />
+<line x1="100" y1="1200" x2="1200" y2="100" stroke="#7e7e7e" stroke-width="100" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/dockwidget-undock.svg b/Source/Core/DolphinQt/Styles/Dark/dockwidget-undock.svg
new file mode 100644
index 0000000000..a3d7563030
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/dockwidget-undock.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1300" height="1300" viewBox="0 0 1300 1300" xmlns="http://www.w3.org/2000/svg">
+<rect x="50" y="350" width="900" height="900" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
+<polyline points="350,350 350,50 1250,50 1250,950 950,950" stroke="#7e7e7e" stroke-width="100" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/down-triangle-spinbox.svg b/Source/Core/DolphinQt/Styles/Dark/down-triangle-spinbox.svg
new file mode 100644
index 0000000000..f406b170d9
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/down-triangle-spinbox.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="40" viewBox="0 0 100 40" xmlns="http://www.w3.org/2000/svg">
+<polyline points="20,5 50,35 80,5" fill="#dcdcdc" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/down-triangle.svg b/Source/Core/DolphinQt/Styles/Dark/down-triangle.svg
new file mode 100644
index 0000000000..4884cff9b1
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/down-triangle.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="20,40 50,70 80,40" fill="#dcdcdc" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/dropdown-arrow.svg b/Source/Core/DolphinQt/Styles/Dark/dropdown-arrow.svg
new file mode 100644
index 0000000000..b5e46941b8
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/dropdown-arrow.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="20,50 50,80 80,50" stroke="#dcdcdc" stroke-width="15" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/left-triangle-tabbar.svg b/Source/Core/DolphinQt/Styles/Dark/left-triangle-tabbar.svg
new file mode 100644
index 0000000000..cebe58fd57
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/left-triangle-tabbar.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="40" height="100" viewBox="0 0 40 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="35,20 5,50 35,80" fill="#dcdcdc" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/radiobutton-checked-disabled.svg b/Source/Core/DolphinQt/Styles/Dark/radiobutton-checked-disabled.svg
new file mode 100644
index 0000000000..7cef56e7c8
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/radiobutton-checked-disabled.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
+<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
+<circle cx="500" cy="500" r="250" style="fill:#7e7e7e;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/radiobutton-checked.svg b/Source/Core/DolphinQt/Styles/Dark/radiobutton-checked.svg
new file mode 100644
index 0000000000..3f1a655397
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/radiobutton-checked.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
+<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
+<circle cx="500" cy="500" r="250" style="fill:#7e7e7e;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/radiobutton-empty-disabled.svg b/Source/Core/DolphinQt/Styles/Dark/radiobutton-empty-disabled.svg
new file mode 100644
index 0000000000..693e47d72d
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/radiobutton-empty-disabled.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
+<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:#505050;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/radiobutton-empty.svg b/Source/Core/DolphinQt/Styles/Dark/radiobutton-empty.svg
new file mode 100644
index 0000000000..11bfe01b83
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/radiobutton-empty.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="1000" height="1000" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg">
+<circle cx="500" cy="500" r="450" style="stroke:#7e7e7e;stroke-width:100;fill:none;" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/right-triangle-tabbar.svg b/Source/Core/DolphinQt/Styles/Dark/right-triangle-tabbar.svg
new file mode 100644
index 0000000000..eff00545b4
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/right-triangle-tabbar.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="40" height="100" viewBox="0 0 40 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="5,20 35,50 5,80" fill="#dcdcdc" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-down.svg b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-down.svg
new file mode 100644
index 0000000000..10b5aaa26f
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-down.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="25,35 50,60 75,35" stroke="#dcdcdc" stroke-width="15" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-left.svg b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-left.svg
new file mode 100644
index 0000000000..a7754c9fd2
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-left.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="65,25 40,50 65,75" stroke="#dcdcdc" stroke-width="15" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-right.svg b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-right.svg
new file mode 100644
index 0000000000..342d4e49f8
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-right.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="35,25 60,50 35,75" stroke="#dcdcdc" stroke-width="15" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-up.svg b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-up.svg
new file mode 100644
index 0000000000..935c4f7db7
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-up.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="25,65 50,40 75,65" stroke="#dcdcdc" stroke-width="15" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-down.svg b/Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-down.svg
new file mode 100644
index 0000000000..3fde763da9
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-down.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="60" height="50" viewBox="0 0 60 50" xmlns="http://www.w3.org/2000/svg">
+<polyline points="5,10 30,35 55,10" stroke="#dcdcdc" stroke-width="10" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-up.svg b/Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-up.svg
new file mode 100644
index 0000000000..ed4a4822af
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-up.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="60" height="50" viewBox="0 0 60 50" xmlns="http://www.w3.org/2000/svg">
+<polyline points="5,35 30,10 55,35" stroke="#dcdcdc" stroke-width="10" fill="none" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/up-triangle-spinbox.svg b/Source/Core/DolphinQt/Styles/Dark/up-triangle-spinbox.svg
new file mode 100644
index 0000000000..4dc1312209
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/up-triangle-spinbox.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="40" viewBox="0 0 100 40" xmlns="http://www.w3.org/2000/svg">
+<polyline points="20,35 50,5 80,35" fill="#dcdcdc" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/Styles/Dark/up-triangle.svg b/Source/Core/DolphinQt/Styles/Dark/up-triangle.svg
new file mode 100644
index 0000000000..d8be2c7d92
--- /dev/null
+++ b/Source/Core/DolphinQt/Styles/Dark/up-triangle.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+<polyline points="20,60 50,30 80,60" fill="#dcdcdc" />
+</svg> \ No newline at end of file
diff --git a/Source/Core/DolphinQt/TAS/WiiTASInputWindow.cpp b/Source/Core/DolphinQt/TAS/WiiTASInputWindow.cpp
index dc08148b79..4762024a61 100644
--- a/Source/Core/DolphinQt/TAS/WiiTASInputWindow.cpp
+++ b/Source/Core/DolphinQt/TAS/WiiTASInputWindow.cpp
@@ -28,6 +28,7 @@
#include "DolphinQt/QtUtils/AspectRatioWidget.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/TAS/IRWidget.h"
#include "DolphinQt/TAS/TASCheckBox.h"
#include "DolphinQt/TAS/TASSpinBox.h"
@@ -395,15 +396,21 @@ void WiiTASInputWindow::UpdateExt()
if (m_active_extension == WiimoteEmu::ExtensionNumber::NUNCHUK)
{
setWindowTitle(tr("Wii TAS Input %1 - Wii Remote + Nunchuk").arg(m_num + 1));
+ SetQWidgetWindowDecorations(m_ir_box);
m_ir_box->show();
+ SetQWidgetWindowDecorations(m_nunchuk_stick_box);
m_nunchuk_stick_box->show();
m_classic_right_stick_box->hide();
m_classic_left_stick_box->hide();
+ SetQWidgetWindowDecorations(m_remote_accelerometer_box);
m_remote_accelerometer_box->show();
m_remote_gyroscope_box->setVisible(m_is_motion_plus_attached);
+ SetQWidgetWindowDecorations(m_nunchuk_accelerometer_box);
m_nunchuk_accelerometer_box->show();
m_triggers_box->hide();
+ SetQWidgetWindowDecorations(m_nunchuk_buttons_box);
m_nunchuk_buttons_box->show();
+ SetQWidgetWindowDecorations(m_remote_buttons_box);
m_remote_buttons_box->show();
m_classic_buttons_box->hide();
}
@@ -412,14 +419,18 @@ void WiiTASInputWindow::UpdateExt()
setWindowTitle(tr("Wii TAS Input %1 - Classic Controller").arg(m_num + 1));
m_ir_box->hide();
m_nunchuk_stick_box->hide();
+ SetQWidgetWindowDecorations(m_classic_right_stick_box);
m_classic_right_stick_box->show();
+ SetQWidgetWindowDecorations(m_classic_left_stick_box);
m_classic_left_stick_box->show();
m_remote_accelerometer_box->hide();
m_remote_gyroscope_box->hide();
m_nunchuk_accelerometer_box->hide();
+ SetQWidgetWindowDecorations(m_triggers_box);
m_triggers_box->show();
m_remote_buttons_box->hide();
m_nunchuk_buttons_box->hide();
+ SetQWidgetWindowDecorations(m_classic_buttons_box);
m_classic_buttons_box->show();
}
else
@@ -429,10 +440,12 @@ void WiiTASInputWindow::UpdateExt()
m_nunchuk_stick_box->hide();
m_classic_right_stick_box->hide();
m_classic_left_stick_box->hide();
+ SetQWidgetWindowDecorations(m_remote_accelerometer_box);
m_remote_accelerometer_box->show();
m_remote_gyroscope_box->setVisible(m_is_motion_plus_attached);
m_nunchuk_accelerometer_box->hide();
m_triggers_box->hide();
+ SetQWidgetWindowDecorations(m_remote_buttons_box);
m_remote_buttons_box->show();
m_nunchuk_buttons_box->hide();
m_classic_buttons_box->hide();
diff --git a/Source/Core/DolphinQt/Updater.cpp b/Source/Core/DolphinQt/Updater.cpp
index 47eb57ef39..881c638914 100644
--- a/Source/Core/DolphinQt/Updater.cpp
+++ b/Source/Core/DolphinQt/Updater.cpp
@@ -17,6 +17,7 @@
#include "Common/Version.h"
#include "DolphinQt/QtUtils/RunOnObject.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
// Refer to docs/autoupdate_overview.md for a detailed overview of the autoupdate process
@@ -100,6 +101,7 @@ void Updater::OnUpdateAvailable(const NewVersionInformation& info)
connect(buttons, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
connect(buttons, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
+ SetQWidgetWindowDecorations(dialog);
return dialog->exec();
});
diff --git a/Source/Core/DolphinQt/WiiUpdate.cpp b/Source/Core/DolphinQt/WiiUpdate.cpp
index fc5d9ea8e9..633f02c2ce 100644
--- a/Source/Core/DolphinQt/WiiUpdate.cpp
+++ b/Source/Core/DolphinQt/WiiUpdate.cpp
@@ -21,6 +21,7 @@
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
+#include "DolphinQt/QtUtils/SetWindowDecorations.h"
namespace WiiUpdate
{
@@ -130,6 +131,7 @@ static WiiUtils::UpdateResult ShowProgress(QWidget* parent, Callable function, A
return res;
});
+ SetQWidgetWindowDecorations(&dialog);
dialog.exec();
return result.get();
}