diff --git a/src/duckstation-qt/audiosettingswidget.cpp b/src/duckstation-qt/audiosettingswidget.cpp index 45c425859..1b56c6723 100644 --- a/src/duckstation-qt/audiosettingswidget.cpp +++ b/src/duckstation-qt/audiosettingswidget.cpp @@ -168,7 +168,7 @@ void AudioSettingsWidget::updateDeviceNames() std::vector devices = AudioStream::GetOutputDevices(backend, driver_name.c_str(), SPU::SAMPLE_RATE); - m_ui.outputDevice->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.outputDevice); m_ui.outputDevice->clear(); m_output_device_latency = 0; diff --git a/src/duckstation-qt/graphicssettingswidget.cpp b/src/duckstation-qt/graphicssettingswidget.cpp index 94742ff29..f89a8619e 100644 --- a/src/duckstation-qt/graphicssettingswidget.cpp +++ b/src/duckstation-qt/graphicssettingswidget.cpp @@ -870,7 +870,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_ SettingsInterface* const sif = m_dialog->getSettingsInterface(); { - m_ui.adapter->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.adapter); m_ui.adapter->clear(); m_ui.adapter->addItem(tr("Default"), QVariant(QString())); @@ -906,7 +906,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_ } { - m_ui.fullscreenMode->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.fullscreenMode); m_ui.fullscreenMode->clear(); m_ui.fullscreenMode->addItem(tr("Borderless Fullscreen"), QVariant(QString())); @@ -944,7 +944,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_ if (!m_dialog->hasGameTrait(GameDatabase::Trait::DisableUpscaling)) { - m_ui.resolutionScale->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.resolutionScale); m_ui.resolutionScale->clear(); const int max_scale = @@ -957,7 +957,7 @@ void GraphicsSettingsWidget::populateGPUAdaptersAndResolutions(RenderAPI render_ } { - m_ui.msaaMode->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.msaaMode); m_ui.msaaMode->clear(); if (m_dialog->isPerGameSettings()) @@ -1115,7 +1115,7 @@ void GraphicsSettingsWidget::onMediaCaptureBackendChanged() .value_or(Settings::DEFAULT_MEDIA_CAPTURE_BACKEND); { - m_ui.captureContainer->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.captureContainer); m_ui.captureContainer->clear(); for (const auto& [name, display_name] : MediaCapture::GetContainerList(backend)) @@ -1146,7 +1146,7 @@ void GraphicsSettingsWidget::onMediaCaptureContainerChanged() const std::string container = m_dialog->getEffectiveStringValue("MediaCapture", "Container", "mp4"); { - m_ui.videoCaptureCodec->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.videoCaptureCodec); m_ui.videoCaptureCodec->clear(); m_ui.videoCaptureCodec->addItem(tr("Default"), QVariant(QString())); @@ -1160,7 +1160,7 @@ void GraphicsSettingsWidget::onMediaCaptureContainerChanged() } { - m_ui.audioCaptureCodec->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.audioCaptureCodec); m_ui.audioCaptureCodec->clear(); m_ui.audioCaptureCodec->addItem(tr("Default"), QVariant(QString())); diff --git a/src/duckstation-qt/settingswindow.cpp b/src/duckstation-qt/settingswindow.cpp index 34d55c1c6..57f31e554 100644 --- a/src/duckstation-qt/settingswindow.cpp +++ b/src/duckstation-qt/settingswindow.cpp @@ -201,7 +201,7 @@ void SettingsWindow::reloadPages() if (isPerGameSettings()) { m_game_summary->reloadGameSettings(); - m_ui.safeMode->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.safeMode); } m_widget_help_text_map.clear(); diff --git a/src/duckstation-qt/settingwidgetbinder.h b/src/duckstation-qt/settingwidgetbinder.h index ee8ae1118..911f6a900 100644 --- a/src/duckstation-qt/settingwidgetbinder.h +++ b/src/duckstation-qt/settingwidgetbinder.h @@ -70,6 +70,8 @@ struct SettingAccessor template static void connectValueChanged(T* widget, F func); + + static void disconnect(T* widget); }; template<> @@ -121,6 +123,8 @@ struct SettingAccessor { widget->connect(widget, &QLineEdit::textChanged, func); } + + static void disconnect(QLineEdit* widget) { QObject::disconnect(widget, &QLineEdit::textChanged, nullptr, nullptr); } }; template<> @@ -210,6 +214,12 @@ struct SettingAccessor { widget->connect(widget, static_cast(&QComboBox::currentIndexChanged), func); } + + static void disconnect(QComboBox* widget) + { + QObject::disconnect(widget, static_cast(&QComboBox::currentIndexChanged), nullptr, + nullptr); + } }; template<> @@ -280,6 +290,11 @@ struct SettingAccessor { widget->connect(widget, &QCheckBox::checkStateChanged, func); } + + static void disconnect(QCheckBox* widget) + { + QObject::disconnect(widget, &QCheckBox::checkStateChanged, nullptr, nullptr); + } }; template<> @@ -389,6 +404,13 @@ struct SettingAccessor }); } } + + static void disconnect(QSlider* widget) + { + QObject::disconnect(widget, &QSlider::valueChanged, nullptr, nullptr); + if (isNullable(widget)) + QObject::disconnect(widget, &QSlider::customContextMenuRequested, nullptr, nullptr); + } }; template<> @@ -521,6 +543,13 @@ struct SettingAccessor }); } } + + static void disconnect(QSpinBox* widget) + { + QObject::disconnect(widget, QOverload::of(&QSpinBox::valueChanged), nullptr, nullptr); + if (isNullable(widget)) + QObject::disconnect(widget, &QSpinBox::customContextMenuRequested, nullptr, nullptr); + } }; template<> @@ -654,6 +683,13 @@ struct SettingAccessor }); } } + + static void disconnect(QDoubleSpinBox* widget) + { + QObject::disconnect(widget, QOverload::of(&QDoubleSpinBox::valueChanged), nullptr, nullptr); + if (isNullable(widget)) + QObject::disconnect(widget, &QDoubleSpinBox::customContextMenuRequested, nullptr, nullptr); + } }; template<> @@ -702,6 +738,8 @@ struct SettingAccessor { widget->connect(widget, &QAction::toggled, func); } + + static void disconnect(QAction* widget) { QObject::disconnect(widget, &QAction::toggled, nullptr, nullptr); } }; /// Binds a widget's value to a setting, updating it when the value changes. @@ -1492,4 +1530,11 @@ static inline void SetAvailability(WidgetType* widget, bool available) widget->setEnabled(false); } +template +static inline void DisconnectWidget(WidgetType* widget) +{ + using Accessor = SettingAccessor; + Accessor::disconnect(widget); +} + } // namespace SettingWidgetBinder diff --git a/src/duckstation-qt/setupwizarddialog.cpp b/src/duckstation-qt/setupwizarddialog.cpp index 185831ce5..c57490432 100644 --- a/src/duckstation-qt/setupwizarddialog.cpp +++ b/src/duckstation-qt/setupwizarddialog.cpp @@ -518,7 +518,7 @@ void SetupWizardDialog::doMultipleDeviceAutomaticBinding(u32 port, QLabel* updat void SetupWizardDialog::setupGraphicsPage(bool initial) { - m_ui.renderer->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.renderer); m_ui.renderer->clear(); for (u32 i = 0; i < static_cast(GPURenderer::Count); i++) @@ -529,14 +529,14 @@ void SetupWizardDialog::setupGraphicsPage(bool initial) SettingWidgetBinder::BindWidgetToEnumSetting(nullptr, m_ui.renderer, "GPU", "Renderer", &Settings::ParseRendererName, &Settings::GetRendererName, Settings::DEFAULT_GPU_RENDERER); - m_ui.resolutionScale->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.resolutionScale); m_ui.resolutionScale->clear(); GraphicsSettingsWidget::populateUpscalingModes(m_ui.resolutionScale, 16); SettingWidgetBinder::BindWidgetToIntSetting(nullptr, m_ui.resolutionScale, "GPU", "ResolutionScale", 1); - m_ui.textureFiltering->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.textureFiltering); m_ui.textureFiltering->clear(); - m_ui.spriteTextureFiltering->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.spriteTextureFiltering); m_ui.spriteTextureFiltering->clear(); for (u32 i = 0; i < static_cast(GPUTextureFilter::Count); i++) @@ -554,7 +554,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial) &Settings::ParseTextureFilterName, &Settings::GetTextureFilterName, Settings::DEFAULT_GPU_TEXTURE_FILTER); - m_ui.gpuDitheringMode->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.gpuDitheringMode); m_ui.gpuDitheringMode->clear(); for (u32 i = 0; i < static_cast(GPUDitheringMode::MaxCount); i++) @@ -567,7 +567,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial) &Settings::ParseGPUDitheringModeName, &Settings::GetGPUDitheringModeName, Settings::DEFAULT_GPU_DITHERING_MODE); - m_ui.displayAspectRatio->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.displayAspectRatio); m_ui.displayAspectRatio->clear(); for (u32 i = 0; i < static_cast(DisplayAspectRatio::Count); i++) @@ -587,7 +587,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial) &SetupWizardDialog::onGraphicsAspectRatioChanged); onGraphicsAspectRatioChanged(); - m_ui.displayCropMode->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.displayCropMode); m_ui.displayCropMode->clear(); for (u32 i = 0; i < static_cast(DisplayCropMode::MaxCount); i++) @@ -600,7 +600,7 @@ void SetupWizardDialog::setupGraphicsPage(bool initial) &Settings::ParseDisplayCropMode, &Settings::GetDisplayCropModeName, Settings::DEFAULT_DISPLAY_CROP_MODE); - m_ui.displayScaling->disconnect(); + SettingWidgetBinder::DisconnectWidget(m_ui.displayScaling); m_ui.displayScaling->clear(); for (u32 i = 0; i < static_cast(DisplayScalingMode::Count); i++)