diff --git a/src/duckstation-qt/CMakeLists.txt b/src/duckstation-qt/CMakeLists.txt
index a00ef65cb..03f30745a 100644
--- a/src/duckstation-qt/CMakeLists.txt
+++ b/src/duckstation-qt/CMakeLists.txt
@@ -3,7 +3,7 @@ set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
add_executable(duckstation-qt
- resources/icons.qrc
+ resources/resources.qrc
aboutdialog.cpp
aboutdialog.h
advancedsettingswidget.cpp
diff --git a/src/duckstation-qt/duckstation-qt.vcxproj b/src/duckstation-qt/duckstation-qt.vcxproj
index 1b55b2df5..bbbb62936 100644
--- a/src/duckstation-qt/duckstation-qt.vcxproj
+++ b/src/duckstation-qt/duckstation-qt.vcxproj
@@ -148,7 +148,7 @@
-
+
Document
@@ -171,7 +171,7 @@
-
+
diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp
index 7aa1f2368..67ee2f97b 100644
--- a/src/duckstation-qt/mainwindow.cpp
+++ b/src/duckstation-qt/mainwindow.cpp
@@ -16,6 +16,7 @@
#include "settingsdialog.h"
#include "settingwidgetbinder.h"
#include
+#include
#include
#include
#include
@@ -40,6 +41,7 @@ MainWindow::MainWindow(QtHostInterface* host_interface) : QMainWindow(nullptr),
m_ui.setupUi(this);
setupAdditionalUi();
connectSignals();
+ updateTheme();
resize(800, 700);
}
@@ -603,6 +605,52 @@ void MainWindow::connectSignals()
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.actionDebugShowTimersState,
"Debug/ShowTimersState");
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.actionDebugShowMDECState, "Debug/ShowMDECState");
+
+ addThemeToMenu(tr("Default"), QStringLiteral("default"));
+ addThemeToMenu(tr("Dark"), QStringLiteral("qdarkstyle"));
+}
+
+void MainWindow::addThemeToMenu(const QString& name, const QString& key)
+{
+ QAction* action = m_ui.menuSettingsTheme->addAction(name);
+ action->setCheckable(true);
+ action->setData(key);
+ connect(action, &QAction::toggled, [this, key](bool) { setTheme(key); });
+}
+
+void MainWindow::setTheme(const QString& theme)
+{
+ m_host_interface->putSettingValue(QStringLiteral("UI/Theme"), theme);
+ updateTheme();
+}
+
+void MainWindow::updateTheme()
+{
+ QString theme = m_host_interface->getSettingValue(QStringLiteral("UI/Theme"), QStringLiteral("default")).toString();
+ if (theme == QStringLiteral("qdarkstyle"))
+ {
+ QFile f(QStringLiteral(":qdarkstyle/style.qss"));
+ if (f.open(QFile::ReadOnly | QFile::Text))
+ qApp->setStyleSheet(f.readAll());
+ }
+ else
+ {
+ qApp->setStyleSheet(QString());
+ }
+
+ for (QObject* obj : m_ui.menuSettingsTheme->children())
+ {
+ QAction* action = qobject_cast(obj);
+ if (action)
+ {
+ QVariant action_data(action->data());
+ if (action_data.isValid())
+ {
+ QSignalBlocker blocker(action);
+ action->setChecked(action_data == theme);
+ }
+ }
+ }
}
SettingsDialog* MainWindow::getSettingsDialog()
diff --git a/src/duckstation-qt/mainwindow.h b/src/duckstation-qt/mainwindow.h
index df4ce7fa7..3d6440c61 100644
--- a/src/duckstation-qt/mainwindow.h
+++ b/src/duckstation-qt/mainwindow.h
@@ -35,6 +35,9 @@ private Q_SLOTS:
void destroyDisplay();
void focusDisplayWidget();
+ void setTheme(const QString& theme);
+ void updateTheme();
+
void onEmulationStarting();
void onEmulationStarted();
void onEmulationStopped();
@@ -65,6 +68,7 @@ protected:
private:
void setupAdditionalUi();
void connectSignals();
+ void addThemeToMenu(const QString& name, const QString& key);
void updateEmulationActions(bool starting, bool running);
void switchToGameListView();
void switchToEmulationView();
diff --git a/src/duckstation-qt/mainwindow.ui b/src/duckstation-qt/mainwindow.ui
index c1cbcd42e..19e2a6e6f 100644
--- a/src/duckstation-qt/mainwindow.ui
+++ b/src/duckstation-qt/mainwindow.ui
@@ -85,6 +85,11 @@
S&ettings
+
@@ -101,6 +106,7 @@
+