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