From a202d84570f510c2152591ef0b7e5f42bf5e043b Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Tue, 7 Mar 2023 18:39:26 -0800 Subject: [PATCH 01/11] msbuild: auto generate and embed qt rcc files --- Source/VSProps/QtCompile.props | 37 +- Source/VSProps/qtmoc.props | 83 --- Source/VSProps/{QtCompile.xml => qtmoc.xml} | 0 Source/VSProps/qtrcc.targets | 580 ++++++++++++++++++++ Source/VSProps/qtrcc.xml | 5 + 5 files changed, 619 insertions(+), 86 deletions(-) delete mode 100644 Source/VSProps/qtmoc.props rename Source/VSProps/{QtCompile.xml => qtmoc.xml} (100%) create mode 100644 Source/VSProps/qtrcc.targets create mode 100644 Source/VSProps/qtrcc.xml diff --git a/Source/VSProps/QtCompile.props b/Source/VSProps/QtCompile.props index 2b4ceed3c4..c42c823f88 100644 --- a/Source/VSProps/QtCompile.props +++ b/Source/VSProps/QtCompile.props @@ -51,9 +51,14 @@ but not the include paths, as passing include paths drastically slows down moc, and it doesn't appear to actually need them anyway. --> - + + + + moc %(Identity) + $(QtHostToolsDir) + %(FullPath) $(QtToolOutDir)moc_68\moc_%(Filename).cpp + $(QtToolOutDir)moc_68\ + moc_%(Filename).cpp + output + true + [AllOptions] [AdditionalOptions] + %(OutputFile) + false - - + + + + + rcc %(Identity) + $(QtHostToolsDir) + %(FullPath) + $(QtToolOutDir)rcc\qrc_%(Filename).cpp + $(QtToolOutDir)rcc\ + qrc_%(Filename).cpp + %(Filename) + default + false + output + true + [AllOptions] [AdditionalOptions] + %(OutputFile) + + + + diff --git a/Source/VSProps/qtmoc.props b/Source/VSProps/qtmoc.props deleted file mode 100644 index 18832a6e93..0000000000 --- a/Source/VSProps/qtmoc.props +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - moc %(Identity) - - $(QtHostToolsDir) - $(QtInstallDir) - - %(FullPath) - - $(ProjectDir)GeneratedFiles\$(Configuration)\moc_%(Filename).cpp - - $(IntDir)moc\ - moc_%(Filename).cpp - - output - true - [AllOptions] [AdditionalOptions] - %(OutputFile) - false - - - - - - - diff --git a/Source/VSProps/QtCompile.xml b/Source/VSProps/qtmoc.xml similarity index 100% rename from Source/VSProps/QtCompile.xml rename to Source/VSProps/qtmoc.xml diff --git a/Source/VSProps/qtrcc.targets b/Source/VSProps/qtrcc.targets new file mode 100644 index 0000000000..3b60e5848c --- /dev/null +++ b/Source/VSProps/qtrcc.targets @@ -0,0 +1,580 @@ + + + + + + + + + + + QtRcc;$(QtBuildTargets) + + + + + + + + + + + + + + + + + + Qt;_ClCompile + + + + QtRule40_Rcc + + + + + + + + $([System.IO.Path]::Combine('%(QtRcc.QtRccDir)','%(QtRcc.QtRccFileName)')) + + + + + + + + + + + + + + + + + + + + + + @(res_file) + %(QtRcc.AdditionalDependencies);@(res_file->'%(FullPath)') + + + + + + + + + + + + + + + + + + + + + [@(selected_files->'%(Identity)','][')] + [@(QtRcc->'%(Identity)')] + @(QtRcc->'%(OutputFile)') + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(input_changed) + + + + + + + + + + + QtPrepare; + QtRccPrepare; + QtRccSetModified; + $(QtRccDependsOn) + + + + + + + + + + + + true + + + + + + + + + + + + + + + + $([System.String]::Copy('%(Value)').Replace('"', '')) + + + %(Value)\ + + + "%(Value)" + + + + + + %(Value) + + + + + -o %(Value) + + + + + + + + --temp %(Value) + + + + + --name %(Value) + + + + + --root %(Value) + + + + + --compress 1 + + + --compress 2 + + + --compress 3 + + + --compress 4 + + + --compress 5 + + + --compress 6 + + + --compress 7 + + + --compress 8 + + + --compress 9 + + + + + + + + + + + --no-compress + + + + + --threshold %(Value) + + + + + + + + --binary + + + + + + + + --no-zstd + + + + + --pass %(Value) + + + + + + + + --namespace + + + + + + + + --verbose + + + + + + + + --list + + + + + + + + --project + + + + + --format-version %(Value) + + + + @(options->'%(Value)', ' ') + + + + + + %(QtRcc.InputChanged) + true + + + true + + + true + + + $([MSBuild]::MakeRelative($(ProjectDir), %(QtRcc.OutputFile)).TrimStart('\')) + + + + + + rcc + $(QtToolsPath)/rcc + %(QtRcc.QTDIR)\bin\rcc.exe + $(options) + %(QtRcc.ExecutionDescription) + $(dependencies_changed) + $(input_changed) + true + false + + %(QtRcc.ExecutionDescription) [pass 1] + 1 + $(options) + $(options) -pass 1 -o "%(OutputFile)" + Disabled + + $(output_relative) + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + $(ComputeLinkInputsTargets); + ;QtRccPass2_Link; + + + $(ComputeLibInputsTargets); + ;QtRccPass2_Lib; + + + + + + + diff --git a/Source/VSProps/qtrcc.xml b/Source/VSProps/qtrcc.xml new file mode 100644 index 0000000000..d373d8b49e --- /dev/null +++ b/Source/VSProps/qtrcc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From f2300d89cc88cd9720cbd7af603d66fee3ab4b41 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 31 Jul 2023 00:22:25 +0200 Subject: [PATCH 02/11] CMake: Turn on rcc file embedding. --- Source/Core/DolphinQt/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Core/DolphinQt/CMakeLists.txt b/Source/Core/DolphinQt/CMakeLists.txt index 032f237eba..2f22853179 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}") From 5d33f2abd1355e792566a51129a0df13db9a03c2 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 31 Jul 2023 00:27:48 +0200 Subject: [PATCH 03/11] DolphinQt: On Windows, detect whether the system is using a dark theme. Co-authored-by: FearlessTobi --- Source/Core/DolphinQt/Main.cpp | 18 +++++++++++++++++- Source/Core/DolphinQt/Settings.cpp | 12 ++++++++++++ Source/Core/DolphinQt/Settings.h | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 1c658e8d62..a530f14f8d 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -2,11 +2,13 @@ // SPDX-License-Identifier: GPL-2.0-or-later #ifdef _WIN32 +#include #include #include #include -#include + +#include #endif #ifdef __linux__ @@ -244,6 +246,20 @@ int main(int argc, char* argv[]) DolphinAnalytics::Instance().ReportDolphinStart("qt"); MainWindow win{std::move(boot), static_cast(options.get("movie"))}; + +#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 + Settings::Instance().SetCurrentUserStyle(Settings::Instance().GetCurrentUserStyle()); win.Show(); diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index c6a06336e2..4849ab4adb 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -47,6 +47,8 @@ #include "VideoCommon/NetPlayChatUI.h" #include "VideoCommon/NetPlayGolfUI.h" +static bool s_system_dark = false; + Settings::Settings() { qRegisterMetaType(); @@ -125,6 +127,16 @@ QString Settings::GetCurrentUserStyle() const return QFileInfo(GetQSettings().value(QStringLiteral("userstyle/path")).toString()).fileName(); } +void Settings::SetSystemDark(bool dark) +{ + s_system_dark = dark; +} + +bool Settings::IsSystemDark() +{ + return s_system_dark; +} + // Calling this before the main window has been created breaks the style of some widgets. void Settings::SetCurrentUserStyle(const QString& stylesheet_name) { diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index 30ab757753..ae58aca8a5 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -52,6 +52,8 @@ public: // UI void SetThemeName(const QString& theme_name); + void SetSystemDark(bool dark); + bool IsSystemDark(); void SetCurrentUserStyle(const QString& stylesheet_name); QString GetCurrentUserStyle() const; From ea30651cd73f2e74bc52c5138329a366c338962d Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 31 Jul 2023 00:32:28 +0200 Subject: [PATCH 04/11] DolphinQt: Embed custom dark theme for Windows. --- Source/Core/DolphinQt/CMakeLists.txt | 6 + Source/Core/DolphinQt/DolphinQt.vcxproj | 4 + .../Styles/Dark/checkbox-checked-disabled.svg | 5 + .../Styles/Dark/checkbox-checked.svg | 5 + .../Styles/Dark/checkbox-empty-disabled.svg | 4 + .../DolphinQt/Styles/Dark/checkbox-empty.svg | 4 + .../Styles/Dark/checkbox-half-disabled.svg | 5 + .../DolphinQt/Styles/Dark/checkbox-half.svg | 5 + Source/Core/DolphinQt/Styles/Dark/dark.qrc | 30 ++ Source/Core/DolphinQt/Styles/Dark/dark.qss | 487 ++++++++++++++++++ .../Styles/Dark/dockwidget-close.svg | 5 + .../Styles/Dark/dockwidget-undock.svg | 5 + .../Styles/Dark/down-triangle-spinbox.svg | 4 + .../DolphinQt/Styles/Dark/down-triangle.svg | 4 + .../DolphinQt/Styles/Dark/dropdown-arrow.svg | 4 + .../Styles/Dark/left-triangle-tabbar.svg | 4 + .../Dark/radiobutton-checked-disabled.svg | 5 + .../Styles/Dark/radiobutton-checked.svg | 5 + .../Dark/radiobutton-empty-disabled.svg | 4 + .../Styles/Dark/radiobutton-empty.svg | 4 + .../Styles/Dark/right-triangle-tabbar.svg | 4 + .../Styles/Dark/scrollbar-arrow-down.svg | 4 + .../Styles/Dark/scrollbar-arrow-left.svg | 4 + .../Styles/Dark/scrollbar-arrow-right.svg | 4 + .../Styles/Dark/scrollbar-arrow-up.svg | 4 + .../Dark/table-header-sort-arrow-down.svg | 4 + .../Dark/table-header-sort-arrow-up.svg | 4 + .../Styles/Dark/up-triangle-spinbox.svg | 4 + .../DolphinQt/Styles/Dark/up-triangle.svg | 4 + 29 files changed, 635 insertions(+) create mode 100644 Source/Core/DolphinQt/Styles/Dark/checkbox-checked-disabled.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/checkbox-checked.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/checkbox-empty-disabled.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/checkbox-empty.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/checkbox-half-disabled.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/checkbox-half.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/dark.qrc create mode 100644 Source/Core/DolphinQt/Styles/Dark/dark.qss create mode 100644 Source/Core/DolphinQt/Styles/Dark/dockwidget-close.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/dockwidget-undock.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/down-triangle-spinbox.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/down-triangle.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/dropdown-arrow.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/left-triangle-tabbar.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/radiobutton-checked-disabled.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/radiobutton-checked.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/radiobutton-empty-disabled.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/radiobutton-empty.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/right-triangle-tabbar.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-down.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-left.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-right.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/scrollbar-arrow-up.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-down.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/table-header-sort-arrow-up.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/up-triangle-spinbox.svg create mode 100644 Source/Core/DolphinQt/Styles/Dark/up-triangle.svg diff --git a/Source/Core/DolphinQt/CMakeLists.txt b/Source/Core/DolphinQt/CMakeLists.txt index 2f22853179..50dbbbf57a 100644 --- a/Source/Core/DolphinQt/CMakeLists.txt +++ b/Source/Core/DolphinQt/CMakeLists.txt @@ -363,6 +363,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 diff --git a/Source/Core/DolphinQt/DolphinQt.vcxproj b/Source/Core/DolphinQt/DolphinQt.vcxproj index ff17a0a4b1..5eaf14fa9f 100644 --- a/Source/Core/DolphinQt/DolphinQt.vcxproj +++ b/Source/Core/DolphinQt/DolphinQt.vcxproj @@ -415,6 +415,10 @@ + + + + {D79392F7-06D6-4B4B-A39F-4D587C215D3A} 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + dark.qss + checkbox-checked.svg + checkbox-checked-disabled.svg + checkbox-empty.svg + checkbox-empty-disabled.svg + checkbox-half.svg + checkbox-half-disabled.svg + dockwidget-close.svg + dockwidget-undock.svg + down-triangle.svg + down-triangle-spinbox.svg + dropdown-arrow.svg + left-triangle-tabbar.svg + radiobutton-checked.svg + radiobutton-checked-disabled.svg + radiobutton-empty.svg + radiobutton-empty-disabled.svg + right-triangle-tabbar.svg + scrollbar-arrow-down.svg + scrollbar-arrow-left.svg + scrollbar-arrow-right.svg + scrollbar-arrow-up.svg + table-header-sort-arrow-down.svg + table-header-sort-arrow-up.svg + up-triangle.svg + up-triangle-spinbox.svg + + 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ 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 @@ + + + + \ No newline at end of file From adbe56ce156b5699a97bde1bda0433a3ed189ae5 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 31 Jul 2023 00:35:48 +0200 Subject: [PATCH 05/11] DolphinQt: Auto-load embedded dark theme on Windows if the user uses a system-wide dark theme. --- Source/Core/DolphinQt/Settings.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index 4849ab4adb..2a7b7b41fb 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -153,6 +153,22 @@ 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()); + } + } +#endif + // Define tooltips style if not already defined if (!stylesheet_contents.contains(QStringLiteral("QToolTip"), Qt::CaseSensitive)) { From e8d23af0f2799337af0b0c69a34aa717bf88766e Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 31 Jul 2023 00:40:15 +0200 Subject: [PATCH 06/11] DolphinQt: Add function to set a QWidget's window decorations to dark ones on Windows. --- Source/Core/DolphinQt/CMakeLists.txt | 3 +++ Source/Core/DolphinQt/DolphinQt.vcxproj | 2 ++ .../QtUtils/SetWindowDecorations.cpp | 25 +++++++++++++++++++ .../DolphinQt/QtUtils/SetWindowDecorations.h | 9 +++++++ Source/VSProps/Base.Dolphin.props | 2 ++ 5 files changed, 41 insertions(+) create mode 100644 Source/Core/DolphinQt/QtUtils/SetWindowDecorations.cpp create mode 100644 Source/Core/DolphinQt/QtUtils/SetWindowDecorations.h diff --git a/Source/Core/DolphinQt/CMakeLists.txt b/Source/Core/DolphinQt/CMakeLists.txt index 50dbbbf57a..2633b3d264 100644 --- a/Source/Core/DolphinQt/CMakeLists.txt +++ b/Source/Core/DolphinQt/CMakeLists.txt @@ -294,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 @@ -403,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/DolphinQt.vcxproj b/Source/Core/DolphinQt/DolphinQt.vcxproj index 5eaf14fa9f..9217cc3788 100644 --- a/Source/Core/DolphinQt/DolphinQt.vcxproj +++ b/Source/Core/DolphinQt/DolphinQt.vcxproj @@ -188,6 +188,7 @@ + @@ -379,6 +380,7 @@ + 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 + +#include "DolphinQt/Settings.h" + +#ifdef _WIN32 +#include +#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/VSProps/Base.Dolphin.props b/Source/VSProps/Base.Dolphin.props index a575d9290b..96fe8b6d2a 100644 --- a/Source/VSProps/Base.Dolphin.props +++ b/Source/VSProps/Base.Dolphin.props @@ -79,6 +79,8 @@ avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;bcrypt.lib;%(AdditionalDependencies) Crypt32.lib;%(AdditionalDependencies) + + dwmapi.lib;%(AdditionalDependencies) enableCompatPatches From e2fb8fab2f695ee53ab0aa7a5ff2fe752c719ce8 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 31 Jul 2023 00:42:15 +0200 Subject: [PATCH 07/11] DolphinQt: Set window decorations for all top-level QWidgets. --- Source/Core/DolphinQt/Config/ARCodeWidget.cpp | 4 ++++ .../Config/CommonControllersWidget.cpp | 2 ++ .../DualShockUDPClientWidget.cpp | 2 ++ .../DolphinQt/Config/FilesystemWidget.cpp | 2 ++ .../Core/DolphinQt/Config/FreeLookWidget.cpp | 2 ++ .../Config/GamecubeControllersWidget.cpp | 8 ++++++- .../Core/DolphinQt/Config/GeckoCodeWidget.cpp | 3 +++ .../Config/Graphics/EnhancementsWidget.cpp | 9 +++++-- .../Config/Graphics/GeneralWidget.cpp | 2 ++ .../Config/Mapping/FreeLookRotation.cpp | 2 ++ .../Config/Mapping/MappingButton.cpp | 2 ++ .../Config/Mapping/MappingWidget.cpp | 3 +++ .../Config/Mapping/MappingWindow.cpp | 4 ++++ .../WiimoteEmuExtensionMotionInput.cpp | 2 ++ .../Mapping/WiimoteEmuMotionControlIMU.cpp | 2 ++ .../Core/DolphinQt/Config/PatchesWidget.cpp | 17 +++++++++++-- Source/Core/DolphinQt/Config/VerifyWidget.cpp | 2 ++ .../Config/WiimoteControllersWidget.cpp | 2 ++ Source/Core/DolphinQt/ConvertDialog.cpp | 4 ++++ .../DolphinQt/Debugger/BreakpointWidget.cpp | 4 ++++ .../DolphinQt/Debugger/CodeViewWidget.cpp | 3 +++ Source/Core/DolphinQt/Debugger/CodeWidget.cpp | 2 ++ .../DolphinQt/Debugger/RegisterWidget.cpp | 2 ++ Source/Core/DolphinQt/DiscordHandler.cpp | 2 ++ Source/Core/DolphinQt/GBAWidget.cpp | 2 ++ Source/Core/DolphinQt/GCMemcardManager.cpp | 2 ++ Source/Core/DolphinQt/GameList/GameList.cpp | 8 +++++++ .../InfinityBase/InfinityBaseWindow.cpp | 2 ++ Source/Core/DolphinQt/Main.cpp | 3 +++ Source/Core/DolphinQt/MainWindow.cpp | 24 +++++++++++++++++++ Source/Core/DolphinQt/MenuBar.cpp | 10 ++++++-- Source/Core/DolphinQt/NKitWarningDialog.cpp | 7 ++++-- .../Core/DolphinQt/NetPlay/NetPlayBrowser.cpp | 2 ++ .../Core/DolphinQt/NetPlay/NetPlayDialog.cpp | 4 ++++ .../DolphinQt/QtUtils/ModalMessageBox.cpp | 3 +++ Source/Core/DolphinQt/ResourcePackManager.cpp | 2 ++ .../Core/DolphinQt/Settings/GameCubePane.cpp | 19 +++++++++++---- .../Core/DolphinQt/Settings/GeneralPane.cpp | 2 ++ Source/Core/DolphinQt/Settings/WiiPane.cpp | 4 ++++ .../SkylanderPortal/SkylanderPortalWindow.cpp | 2 ++ .../Core/DolphinQt/TAS/WiiTASInputWindow.cpp | 13 ++++++++++ Source/Core/DolphinQt/Updater.cpp | 2 ++ Source/Core/DolphinQt/WiiUpdate.cpp | 2 ++ 43 files changed, 187 insertions(+), 13 deletions(-) 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(¤t_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/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(index), this).exec(); + { + GCPadWiiUConfigDialog dialog(static_cast(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(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/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 volume) : m_volume(std::move(volume)) @@ -180,6 +181,7 @@ void VerifyWidget::Verify() return result; }); + SetQWidgetWindowDecorations(progress.GetRaw()); progress.GetRaw()->exec(); std::optional 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(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..65ddd69692 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" @@ -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 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/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 a530f14f8d..611efe47ed 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -35,6 +35,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" @@ -92,6 +93,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; @@ -284,6 +286,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..b193fe15c7 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(); @@ -1759,6 +1771,7 @@ void MainWindow::OnImportNANDBackup() dialog.Reset(); }); + SetQWidgetWindowDecorations(dialog.GetRaw()); dialog.GetRaw()->exec(); result.wait(); @@ -1866,6 +1879,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 +1887,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 +1899,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 +1926,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 +1937,7 @@ void MainWindow::ShowMemcardManager() { GCMemcardManager manager(this); + SetQWidgetWindowDecorations(&manager); manager.exec(); } @@ -1927,11 +1945,13 @@ void MainWindow::ShowResourcePackManager() { ResourcePackManager manager(this); + SetQWidgetWindowDecorations(&manager); manager.exec(); } void MainWindow::ShowCheatsManager() { + SetQWidgetWindowDecorations(m_cheats_manager); m_cheats_manager->show(); } @@ -1950,6 +1970,7 @@ void MainWindow::ShowRiivolutionBootWidget(const UICommon::GameFile& game) auto& disc = std::get(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 +1982,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/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 +#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/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/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(slot)).exec(); + MappingWindow dialog(this, MappingWindow::Type::MAPPING_GC_MICROPHONE, static_cast(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..af3d463b8c 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(); } 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(); } From 250d5f55deb0febb9ea94090332bbbbd91d1af5c Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Mon, 31 Jul 2023 23:22:53 +0200 Subject: [PATCH 08/11] DolphinQt: Switch dark/light theme when Windows theme changes. --- Source/Core/DolphinQt/Main.cpp | 17 +---------------- Source/Core/DolphinQt/MainWindow.cpp | 24 ++++++++++++++++++++++++ Source/Core/DolphinQt/MainWindow.h | 5 +++++ Source/Core/DolphinQt/Settings.cpp | 18 ++++++++++++++++++ Source/Core/DolphinQt/Settings.h | 1 + 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 611efe47ed..aa1697c6a7 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -7,8 +7,6 @@ #include #include - -#include #endif #ifdef __linux__ @@ -248,20 +246,7 @@ int main(int argc, char* argv[]) DolphinAnalytics::Instance().ReportDolphinStart("qt"); MainWindow win{std::move(boot), static_cast(options.get("movie"))}; - -#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 - + Settings::Instance().UpdateSystemDark(); Settings::Instance().SetCurrentUserStyle(Settings::Instance().GetCurrentUserStyle()); win.Show(); diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index b193fe15c7..1f5223179c 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -1715,6 +1715,30 @@ QSize MainWindow::sizeHint() const return QSize(800, 600); } +#ifdef _WIN32 +bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, qintptr* result) +{ + auto* msg = reinterpret_cast(message); + if (msg && msg->message == WM_SETTINGCHANGE && msg->lParam != NULL && + std::wstring_view(L"ImmersiveColorSet") + .compare(reinterpret_cast(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()); + + // 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::IPL{region})); 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 m_xrr_config; #endif diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index 2a7b7b41fb..e35be9a8ba 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -19,6 +19,8 @@ #include +#include + #include #include #endif @@ -127,6 +129,22 @@ QString Settings::GetCurrentUserStyle() const return QFileInfo(GetQSettings().value(QStringLiteral("userstyle/path")).toString()).fileName(); } +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; diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index ae58aca8a5..1e1e4b1d7e 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -52,6 +52,7 @@ public: // UI void SetThemeName(const QString& theme_name); + void UpdateSystemDark(); void SetSystemDark(bool dark); bool IsSystemDark(); void SetCurrentUserStyle(const QString& stylesheet_name); From d725aaa5bcb6760522997a3ba43676c88b341d63 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Tue, 1 Aug 2023 19:52:36 +0200 Subject: [PATCH 09/11] DolphinQt: Set the application palette to a matching one when the Windows dark theme is in use. --- Source/Core/DolphinQt/Main.cpp | 1 + Source/Core/DolphinQt/Settings.cpp | 34 ++++++++++++++++++++++++++++-- Source/Core/DolphinQt/Settings.h | 1 + 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index aa1697c6a7..3cf943b17b 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -246,6 +246,7 @@ int main(int argc, char* argv[]) DolphinAnalytics::Instance().ReportDolphinStart("qt"); MainWindow win{std::move(boot), static_cast(options.get("movie"))}; + Settings::Instance().InitDefaultPalette(); Settings::Instance().UpdateSystemDark(); Settings::Instance().SetCurrentUserStyle(Settings::Instance().GetCurrentUserStyle()); win.Show(); diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index e35be9a8ba..3c4461db1c 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -4,19 +4,21 @@ #include "DolphinQt/Settings.h" #include +#include #include +#include #include #include #include #include +#include #include #include +#include #include #ifdef _WIN32 -#include - #include #include @@ -50,6 +52,7 @@ #include "VideoCommon/NetPlayGolfUI.h" static bool s_system_dark = false; +static std::unique_ptr s_default_palette; Settings::Settings() { @@ -129,6 +132,11 @@ QString Settings::GetCurrentUserStyle() const return QFileInfo(GetQSettings().value(QStringLiteral("userstyle/path")).toString()).fileName(); } +void Settings::InitDefaultPalette() +{ + s_default_palette = std::make_unique(qApp->palette()); +} + void Settings::UpdateSystemDark() { #ifdef _WIN32 @@ -183,6 +191,28 @@ void Settings::SetCurrentUserStyle(const QString& stylesheet_name) 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 diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index 1e1e4b1d7e..b95b768250 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -52,6 +52,7 @@ public: // UI void SetThemeName(const QString& theme_name); + void InitDefaultPalette(); void UpdateSystemDark(); void SetSystemDark(bool dark); bool IsSystemDark(); From c2e29153e9e1e831f4b29bbc7e19ebf39d18bc79 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Tue, 1 Aug 2023 20:14:03 +0200 Subject: [PATCH 10/11] DolphinQt: Set the theme before constructing the MainWindow, some panels that explicitly request palette colors get the wrong colors otherwise. --- Source/Core/DolphinQt/Main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Core/DolphinQt/Main.cpp b/Source/Core/DolphinQt/Main.cpp index 3cf943b17b..39aa5c6f1f 100644 --- a/Source/Core/DolphinQt/Main.cpp +++ b/Source/Core/DolphinQt/Main.cpp @@ -245,10 +245,11 @@ int main(int argc, char* argv[]) { DolphinAnalytics::Instance().ReportDolphinStart("qt"); - MainWindow win{std::move(boot), static_cast(options.get("movie"))}; Settings::Instance().InitDefaultPalette(); Settings::Instance().UpdateSystemDark(); Settings::Instance().SetCurrentUserStyle(Settings::Instance().GetCurrentUserStyle()); + + MainWindow win{std::move(boot), static_cast(options.get("movie"))}; win.Show(); #if defined(USE_ANALYTICS) && USE_ANALYTICS From 24012cfc7f396177732e9a8b7d849045a65a5512 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Tue, 1 Aug 2023 20:47:17 +0200 Subject: [PATCH 11/11] DolphinQt: Adjust panel-specific colors and syntax highlighting for dark theme. --- .../Config/GameConfigHighlighter.cpp | 27 ++++++++++-- .../DolphinQt/Config/Mapping/IOWindow.cpp | 33 +++++++++++---- .../DolphinQt/Debugger/CodeViewWidget.cpp | 6 +-- Source/Core/DolphinQt/MainWindow.cpp | 6 +++ Source/Core/DolphinQt/Settings.cpp | 5 +++ Source/Core/DolphinQt/Settings.h | 1 + .../SkylanderPortal/SkylanderPortalWindow.cpp | 42 +++++++++++++------ .../SkylanderPortal/SkylanderPortalWindow.h | 5 ++- 8 files changed, 97 insertions(+), 28 deletions(-) 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 +#include + +#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/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 #include +#include +#include #include #include #include @@ -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/Debugger/CodeViewWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp index 65ddd69692..5507875997 100644 --- a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp @@ -307,7 +307,7 @@ void CodeViewWidget::Update(const Core::CPUThreadGuard* guard) const std::optional 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(); @@ -350,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)); } } @@ -372,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") diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 1f5223179c..67d4ac46bb 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -1728,8 +1728,14 @@ bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, qintptr 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. diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index 3c4461db1c..ebcf90ee8e 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -163,6 +163,11 @@ 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) { diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index b95b768250..5583ed0628 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -56,6 +56,7 @@ public: 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/SkylanderPortal/SkylanderPortalWindow.cpp b/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp index af3d463b8c..2ef2d43edb 100644 --- a/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp +++ b/Source/Core/DolphinQt/SkylanderPortal/SkylanderPortalWindow.cpp @@ -612,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()) @@ -635,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); } @@ -652,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); } @@ -897,27 +915,27 @@ int SkylanderPortalWindow::GetElementRadio() return -1; } -QBrush SkylanderPortalWindow::GetBaseColor(std::pair ids) +QBrush SkylanderPortalWindow::GetBaseColor(std::pair 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 m_edit_skylanders; std::array, 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 ids); + QBrush GetBaseColor(std::pair ids, bool dark_theme); int GetGameID(IOS::HLE::USB::Game game); int GetElementID(IOS::HLE::USB::Element elem);