From ae25b4d023e6d22624b227fb618624512a5f0b56 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Fri, 28 Feb 2025 20:39:29 +0100 Subject: [PATCH] Improve setting selection handling Will now try to keep the current selection if possible. This can be useful when switching between source of the same time. --- plugins/base/macro-action-filter.cpp | 3 +-- plugins/base/macro-action-source.cpp | 3 +-- plugins/base/macro-condition-filter.cpp | 5 +++-- plugins/base/macro-condition-source.cpp | 4 ++-- plugins/base/utils/source-setting.cpp | 14 +++++++++++--- plugins/base/utils/source-setting.hpp | 5 +++-- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/plugins/base/macro-action-filter.cpp b/plugins/base/macro-action-filter.cpp index b26ee717..9c9ce1fc 100644 --- a/plugins/base/macro-action-filter.cpp +++ b/plugins/base/macro-action-filter.cpp @@ -307,8 +307,7 @@ void MacroActionFilterEdit::UpdateEntryData() const auto filters = _entryData->_filter.GetFilters(_entryData->_source); OBSWeakSource firstFilter = filters.empty() ? nullptr : filters.at(0); - _filterSettings->SetSource(firstFilter); - _filterSettings->SetSetting(_entryData->_setting); + _filterSettings->SetSelection(firstFilter, _entryData->_setting); _settingsInputMethods->setCurrentIndex(_settingsInputMethods->findData( static_cast(_entryData->_settingsInputMethod))); _tempVars->SetVariable(_entryData->_tempVar); diff --git a/plugins/base/macro-action-source.cpp b/plugins/base/macro-action-source.cpp index a02cd06d..5ed04715 100644 --- a/plugins/base/macro-action-source.cpp +++ b/plugins/base/macro-action-source.cpp @@ -384,8 +384,7 @@ void MacroActionSourceEdit::UpdateEntryData() _settingsButtons->SetSelection(weakSource, _entryData->_button); _actions->setCurrentIndex(static_cast(_entryData->_action)); _sources->SetSource(_entryData->_source); - _sourceSettings->SetSource(weakSource); - _sourceSettings->SetSetting(_entryData->_setting); + _sourceSettings->SetSelection(weakSource, _entryData->_setting); _settingsString->setPlainText(_entryData->_settingsString); _deinterlaceMode->setCurrentIndex(_deinterlaceMode->findData( static_cast(_entryData->_deinterlaceMode))); diff --git a/plugins/base/macro-condition-filter.cpp b/plugins/base/macro-condition-filter.cpp index 90e437ee..80a73e9e 100644 --- a/plugins/base/macro-condition-filter.cpp +++ b/plugins/base/macro-condition-filter.cpp @@ -420,8 +420,9 @@ void MacroConditionFilterEdit::UpdateEntryData() _regex->SetRegexConfig(_entryData->_regex); const auto filters = _entryData->_filter.GetFilters(_entryData->_source); - _settingSelection->SetSource(filters.empty() ? nullptr : filters.at(0)); - _settingSelection->SetSetting(_entryData->_setting); + _settingSelection->SetSelection(filters.empty() ? nullptr + : filters.at(0), + _entryData->_setting); SetWidgetVisibility(); adjustSize(); diff --git a/plugins/base/macro-condition-source.cpp b/plugins/base/macro-condition-source.cpp index 5b5d628a..28f147ab 100644 --- a/plugins/base/macro-condition-source.cpp +++ b/plugins/base/macro-condition-source.cpp @@ -483,8 +483,8 @@ void MacroConditionSourceEdit::UpdateEntryData() static_cast(_entryData->GetCondition())); _settings->setPlainText(_entryData->_settings); _regex->SetRegexConfig(_entryData->_regex); - _settingSelection->SetSource(_entryData->_source.GetSource()); - _settingSelection->SetSetting(_entryData->_setting); + _settingSelection->SetSelection(_entryData->_source.GetSource(), + _entryData->_setting); _size->SetValue(_entryData->_size); _sizeCompareMethods->setCurrentIndex( static_cast(_entryData->_comparision)); diff --git a/plugins/base/utils/source-setting.cpp b/plugins/base/utils/source-setting.cpp index 7c627284..3fefe676 100644 --- a/plugins/base/utils/source-setting.cpp +++ b/plugins/base/utils/source-setting.cpp @@ -249,14 +249,21 @@ SourceSettingSelection::SourceSettingSelection(QWidget *parent) setLayout(layout); } -void SourceSettingSelection::SetSource(const OBSWeakSource &source) +void SourceSettingSelection::SetSource(const OBSWeakSource &source, + bool restorePreviousSelection) { - _settings->clear(); + const auto previousSelection = _settings->currentData(); Populate(source); + if (restorePreviousSelection) { + _settings->setCurrentIndex( + _settings->findData(previousSelection)); + } } -void SourceSettingSelection::SetSetting(const SourceSetting &setting) +void SourceSettingSelection::SetSelection(const OBSWeakSource &source, + const SourceSetting &setting) { + SetSource(source, false); QVariant variant; variant.setValue(setting); _settings->setCurrentIndex(_settings->findData(variant)); @@ -281,6 +288,7 @@ void SourceSettingSelection::SelectionIdxChanged(int idx) void SourceSettingSelection::Populate(const OBSWeakSource &source) { + _settings->clear(); OBSSourceAutoRelease s = obs_weak_source_get_source(source); auto settings = GetSoruceSettings(s); for (const auto &setting : settings) { diff --git a/plugins/base/utils/source-setting.hpp b/plugins/base/utils/source-setting.hpp index 9b01934e..0b78841d 100644 --- a/plugins/base/utils/source-setting.hpp +++ b/plugins/base/utils/source-setting.hpp @@ -40,8 +40,9 @@ class SourceSettingSelection : public QWidget { public: SourceSettingSelection(QWidget *parent = nullptr); - void SetSource(const OBSWeakSource &); - void SetSetting(const SourceSetting &); + void SetSource(const OBSWeakSource &, + bool restorePreviousSelection = true); + void SetSelection(const OBSWeakSource &source, const SourceSetting &); private slots: void SelectionIdxChanged(int);