diff --git a/src/duckstation-qt/consolesettingswidget.cpp b/src/duckstation-qt/consolesettingswidget.cpp
index 93462083a..766db2621 100644
--- a/src/duckstation-qt/consolesettingswidget.cpp
+++ b/src/duckstation-qt/consolesettingswidget.cpp
@@ -1,8 +1,17 @@
#include "consolesettingswidget.h"
+#include "settingwidgetbinder.h"
-ConsoleSettingsWidget::ConsoleSettingsWidget(QWidget* parent /*= nullptr*/) : QWidget(parent)
+ConsoleSettingsWidget::ConsoleSettingsWidget(QtHostInterface* host_interface, QWidget* parent /* = nullptr */)
+ : QWidget(parent), m_host_interface(host_interface)
{
m_ui.setupUi(this);
+
+ SettingWidgetBinder::BindWidgetToSetting(m_host_interface, m_ui.region, &Settings::region);
+ SettingWidgetBinder::BindWidgetToSetting(m_host_interface, m_ui.biosPath, &Settings::bios_path);
+ SettingWidgetBinder::BindWidgetToSetting(m_host_interface, m_ui.enableTTYOutput, &Settings::bios_patch_tty_enable);
+ SettingWidgetBinder::BindWidgetToSetting(m_host_interface, m_ui.fastBoot, &Settings::bios_patch_fast_boot);
+ SettingWidgetBinder::BindWidgetToSetting(m_host_interface, m_ui.enableSpeedLimiter, &Settings::speed_limiter_enabled);
+ SettingWidgetBinder::BindWidgetToSetting(m_host_interface, m_ui.pauseOnStart, &Settings::start_paused);
}
ConsoleSettingsWidget::~ConsoleSettingsWidget() = default;
diff --git a/src/duckstation-qt/consolesettingswidget.h b/src/duckstation-qt/consolesettingswidget.h
index 2ec8bb05b..5d45284b9 100644
--- a/src/duckstation-qt/consolesettingswidget.h
+++ b/src/duckstation-qt/consolesettingswidget.h
@@ -4,14 +4,18 @@
#include "ui_consolesettingswidget.h"
+class QtHostInterface;
+
class ConsoleSettingsWidget : public QWidget
{
Q_OBJECT
public:
- explicit ConsoleSettingsWidget(QWidget* parent = nullptr);
+ explicit ConsoleSettingsWidget(QtHostInterface* host_interface, QWidget* parent = nullptr);
~ConsoleSettingsWidget();
private:
Ui::ConsoleSettingsWidget m_ui;
+
+ QtHostInterface* m_host_interface;
};
diff --git a/src/duckstation-qt/consolesettingswidget.ui b/src/duckstation-qt/consolesettingswidget.ui
index cfe94d238..713c73791 100644
--- a/src/duckstation-qt/consolesettingswidget.ui
+++ b/src/duckstation-qt/consolesettingswidget.ui
@@ -40,13 +40,13 @@
-
-
- NTSC-U (US)
-
+
+ NTSC-J (Japan)
+
-
- NTSC-J (Japan)
+ NTSC-U (US)
-
diff --git a/src/duckstation-qt/duckstation-qt.vcxproj b/src/duckstation-qt/duckstation-qt.vcxproj
index 3f88d915b..4f17e2a6c 100644
--- a/src/duckstation-qt/duckstation-qt.vcxproj
+++ b/src/duckstation-qt/duckstation-qt.vcxproj
@@ -47,6 +47,7 @@
+
diff --git a/src/duckstation-qt/duckstation-qt.vcxproj.filters b/src/duckstation-qt/duckstation-qt.vcxproj.filters
index c10cb7a9f..525f2f987 100644
--- a/src/duckstation-qt/duckstation-qt.vcxproj.filters
+++ b/src/duckstation-qt/duckstation-qt.vcxproj.filters
@@ -11,30 +11,41 @@
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- resources
-
+
{3b2587ae-ce3b-4eb5-ada2-237e853620cf}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp
index c07913da7..b7d36548a 100644
--- a/src/duckstation-qt/qthostinterface.cpp
+++ b/src/duckstation-qt/qthostinterface.cpp
@@ -36,10 +36,15 @@ void QtHostInterface::ReportMessage(const char* message)
void QtHostInterface::setDefaultSettings()
{
- QtSettingsInterface si(m_qsettings);
m_settings.SetDefaults();
+ updateQSettings();
+}
+
+void QtHostInterface::updateQSettings()
+{
+ QtSettingsInterface si(m_qsettings);
m_settings.Save(si);
- m_qsettings.sync();
+ // m_qsettings.sync();
}
void QtHostInterface::applySettings()
@@ -69,6 +74,8 @@ void QtHostInterface::checkSettings()
m_qsettings.setValue(settings_version_key, expected_version);
setDefaultSettings();
}
+
+ applySettings();
}
void QtHostInterface::createGameList()
diff --git a/src/duckstation-qt/qthostinterface.h b/src/duckstation-qt/qthostinterface.h
index 37ebfe80c..d6034bba1 100644
--- a/src/duckstation-qt/qthostinterface.h
+++ b/src/duckstation-qt/qthostinterface.h
@@ -25,8 +25,13 @@ public:
const QSettings& getQSettings() const { return m_qsettings; }
QSettings& getQSettings() { return m_qsettings; }
void setDefaultSettings();
+ void updateQSettings();
void applySettings();
+ const Settings& GetCoreSettings() const { return m_settings; }
+ Settings& GetCoreSettings() { return m_settings; }
+ //void UpdateCoreSettingsGPU();
+
const GameList* getGameList() const { return m_game_list.get(); }
GameList* getGameList() { return m_game_list.get(); }
void updateGameListDatabase(bool refresh_list = true);
diff --git a/src/duckstation-qt/settingsdialog.cpp b/src/duckstation-qt/settingsdialog.cpp
index 3f219bb34..3d4ef2a9a 100644
--- a/src/duckstation-qt/settingsdialog.cpp
+++ b/src/duckstation-qt/settingsdialog.cpp
@@ -9,7 +9,7 @@ SettingsDialog::SettingsDialog(QtHostInterface* host_interface, QWidget* parent
{
m_ui.setupUi(this);
- m_console_settings = new ConsoleSettingsWidget(m_ui.settingsContainer);
+ m_console_settings = new ConsoleSettingsWidget(host_interface, m_ui.settingsContainer);
m_game_list_settings = new GameListSettingsWidget(host_interface, m_ui.settingsContainer);
m_cpu_settings = new QWidget(m_ui.settingsContainer);
m_gpu_settings = new QWidget(m_ui.settingsContainer);
diff --git a/src/duckstation-qt/settingsdialog.ui b/src/duckstation-qt/settingsdialog.ui
index 2e33176a7..0351c7552 100644
--- a/src/duckstation-qt/settingsdialog.ui
+++ b/src/duckstation-qt/settingsdialog.ui
@@ -102,7 +102,7 @@
Qt::Horizontal
- QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults
+ QDialogButtonBox::Close|QDialogButtonBox::RestoreDefaults
diff --git a/src/duckstation-qt/settingwidgetbinder.h b/src/duckstation-qt/settingwidgetbinder.h
new file mode 100644
index 000000000..574e18801
--- /dev/null
+++ b/src/duckstation-qt/settingwidgetbinder.h
@@ -0,0 +1,139 @@
+#pragma once
+#include
+
+#include "core/settings.h"
+#include "qthostinterface.h"
+
+#include
+#include
+#include
+
+namespace SettingWidgetBinder {
+
+template
+struct SettingAccessor
+{
+ static bool getBoolValue(const T* widget);
+ static void setBoolValue(T* widget, bool value);
+
+ static int getIntValue(const T* widget);
+ static void setIntValue(T* widget, int value);
+
+ static QString getStringValue(const T* widget);
+ static void setStringValue(T* widget, const QString& value);
+
+ template
+ static void connectValueChanged(T* widget, F func);
+};
+
+template<>
+struct SettingAccessor
+{
+ static bool getBoolValue(const QLineEdit* widget) { return widget->text().toInt() != 0; }
+ static void setBoolValue(QLineEdit* widget, bool value)
+ {
+ widget->setText(value ? QStringLiteral("1") : QStringLiteral("0"));
+ }
+
+ static int getIntValue(const QLineEdit* widget) { return widget->text().toInt(); }
+ static void setIntValue(QLineEdit* widget, int value) { widget->setText(QStringLiteral("%1").arg(value)); }
+
+ static QString getStringValue(const QLineEdit* widget) { return widget->text(); }
+ static void setStringValue(QLineEdit* widget, const QString& value) { widget->setText(value); }
+
+ template
+ static void connectValueChanged(QLineEdit* widget, F func)
+ {
+ widget->connect(widget, &QLineEdit::textChanged, func);
+ }
+};
+
+template<>
+struct SettingAccessor
+{
+ static bool getBoolValue(const QComboBox* widget) { return widget->currentText() > 0; }
+ static void setBoolValue(QComboBox* widget, bool value) { widget->setCurrentIndex(value ? 1 : 0); }
+
+ static int getIntValue(const QComboBox* widget) { return widget->currentIndex(); }
+ static void setIntValue(QComboBox* widget, int value) { widget->setCurrentIndex(value); }
+
+ static QString getStringValue(const QComboBox* widget) { return widget->currentText(); }
+ static void setStringValue(QComboBox* widget, const QString& value) { widget->setCurrentText(value); }
+
+ template
+ static void connectValueChanged(QComboBox* widget, F func)
+ {
+ widget->connect(widget, static_cast(&QComboBox::currentIndexChanged), func);
+ }
+};
+
+template<>
+struct SettingAccessor
+{
+ static bool getBoolValue(const QCheckBox* widget) { return widget->isChecked(); }
+ static void setBoolValue(QCheckBox* widget, bool value) { widget->setChecked(value); }
+
+ static int getIntValue(const QCheckBox* widget) { return widget->isChecked() ? 1 : 0; }
+ static void setIntValue(QCheckBox* widget, int value) { widget->setChecked(value != 0); }
+
+ static QString getStringValue(const QCheckBox* widget)
+ {
+ return widget->isChecked() ? QStringLiteral("1") : QStringLiteral("0");
+ }
+ static void setStringValue(QCheckBox* widget, const QString& value) { widget->setChecked(value.toInt() != 0); }
+
+ template
+ static void connectValueChanged(QCheckBox* widget, F func)
+ {
+ widget->connect(widget, &QCheckBox::stateChanged, func);
+ }
+};
+
+/// Binds a widget's value to a setting, updating it when the value changes.
+// template
+// void BindWidgetToSetting(QtHostInterface* hi, WidgetType* widget, DataType Settings::*settings_ptr);
+
+template
+void BindWidgetToSetting(QtHostInterface* hi, WidgetType* widget, bool Settings::*settings_ptr)
+{
+ using Accessor = SettingAccessor;
+
+ Accessor::setBoolValue(widget, hi->GetCoreSettings().*settings_ptr);
+
+ Accessor::connectValueChanged(widget, [hi, widget, settings_ptr]() {
+ (hi->GetCoreSettings().*settings_ptr) = Accessor::getBoolValue(widget);
+ hi->updateQSettings();
+ });
+}
+
+template
+void BindWidgetToSetting(QtHostInterface* hi, WidgetType* widget, std::string Settings::*settings_ptr)
+{
+ using Accessor = SettingAccessor;
+
+ Accessor::setStringValue(widget, QString::fromStdString(hi->GetCoreSettings().*settings_ptr));
+
+ Accessor::connectValueChanged(widget, [hi, widget, settings_ptr]() {
+ const QString value = Accessor::getStringValue(widget);
+ (hi->GetCoreSettings().*settings_ptr) = value.toStdString();
+ hi->updateQSettings();
+ });
+}
+
+template
+void BindWidgetToSetting(QtHostInterface* hi, WidgetType* widget, DataType Settings::*settings_ptr,
+ std::enable_if_t, int>* v = nullptr)
+{
+ using Accessor = SettingAccessor;
+ using UnderlyingType = std::underlying_type_t;
+
+ Accessor::setIntValue(widget, static_cast(static_cast(hi->GetCoreSettings().*settings_ptr)));
+
+ Accessor::connectValueChanged(widget, [hi, widget, settings_ptr](int) {
+ const int value = Accessor::getIntValue(widget);
+ (hi->GetCoreSettings().*settings_ptr) = static_cast(static_cast(value));
+ hi->updateQSettings();
+ });
+}
+
+} // namespace SettingWidgetBinder
\ No newline at end of file