From c6155c9fea1120e065c2885045bda286cbc9f66b Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Thu, 26 Jun 2025 21:10:29 +0200 Subject: [PATCH] Add default settings support --- data/locale/en-US.ini | 2 + plugins/base/macro-action-filter.cpp | 5 +- plugins/base/macro-action-source.cpp | 6 +- plugins/base/macro-condition-filter.cpp | 56 +++++++++++--- plugins/base/macro-condition-filter.hpp | 5 +- plugins/base/macro-condition-source.cpp | 75 ++++++++++++++----- plugins/base/macro-condition-source.hpp | 7 +- plugins/base/utils/source-setting.cpp | 30 ++++---- plugins/base/utils/source-setting.hpp | 1 - .../base/utils/source-settings-helpers.cpp | 34 +++++---- .../base/utils/source-settings-helpers.hpp | 12 ++- 11 files changed, 161 insertions(+), 72 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 4d246564..3cb2ec81 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -518,6 +518,7 @@ AdvSceneSwitcher.condition.source.sizeCompare.equal="Equals" AdvSceneSwitcher.condition.source.sizeCompare.more="Bigger than" AdvSceneSwitcher.condition.source.refresh="Refresh" AdvSceneSwitcher.condition.source.refresh.tooltip="Repopulate the source settings selection with the settings of the source which's name matches the variable value." +AdvSceneSwitcher.condition.source.includeDefaults="Include default settings values" AdvSceneSwitcher.condition.source.sceneVisibilityHint="Scene specific visibility can be checked using the \"Scene item visibility\" condition" AdvSceneSwitcher.condition.source.getSettings="Get current settings" AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}{{refresh}}{{sizeCompareMethods}}{{size}}" @@ -537,6 +538,7 @@ AdvSceneSwitcher.condition.filter.type.individualSettingListSelectionMatches="Se AdvSceneSwitcher.condition.filter.type.individualSettingChanged="Settings value changed" AdvSceneSwitcher.condition.filter.refresh="Refresh" AdvSceneSwitcher.condition.filter.refresh.tooltip="Repopulate the filter settings selection with the settings of the filter which's name matches the variable value." +AdvSceneSwitcher.condition.filter.includeDefaults="Include default settings values" AdvSceneSwitcher.condition.filter.getSettings="Get current settings" AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}{{settingSelection}}{{refresh}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" diff --git a/plugins/base/macro-action-filter.cpp b/plugins/base/macro-action-filter.cpp index c01c8b66..bb1696fe 100644 --- a/plugins/base/macro-action-filter.cpp +++ b/plugins/base/macro-action-filter.cpp @@ -396,9 +396,10 @@ void MacroActionFilterEdit::GetSettingsClicked() case MacroActionFilter::SettingsInputMethod::JSON_STRING: { const auto filters = _entryData->_filter.GetFilters(_entryData->_source); + const auto settings = GetSourceSettings( + filters.empty() ? nullptr : filters.at(0), true); _settingsString->setPlainText( - FormatJsonString(GetSourceSettings( - filters.empty() ? nullptr : filters.at(0)))); + FormatJsonString(settings ? *settings : "")); break; } } diff --git a/plugins/base/macro-action-source.cpp b/plugins/base/macro-action-source.cpp index f7ae5743..d2bd0fbd 100644 --- a/plugins/base/macro-action-source.cpp +++ b/plugins/base/macro-action-source.cpp @@ -461,8 +461,10 @@ void MacroActionSourceEdit::GetSettingsClicked() case MacroActionSource::SettingsInputMethod::INDIVIDUAL_TEMPVAR: break; case MacroActionSource::SettingsInputMethod::JSON_STRING: - _settingsString->setPlainText(FormatJsonString( - GetSourceSettings(_entryData->_source.GetSource()))); + const auto settings = GetSourceSettings( + _entryData->_source.GetSource(), true); + _settingsString->setPlainText( + FormatJsonString(settings ? *settings : "")); break; } } diff --git a/plugins/base/macro-condition-filter.cpp b/plugins/base/macro-condition-filter.cpp index 7b171f7d..e3dea445 100644 --- a/plugins/base/macro-condition-filter.cpp +++ b/plugins/base/macro-condition-filter.cpp @@ -52,18 +52,28 @@ bool MacroConditionFilter::CheckConditionHelper(const OBSWeakSource &filter) ret = !obs_source_enabled(filterSource); break; case Condition::SETTINGS_MATCH: { - ret = CompareSourceSettings(filter, _settings, _regex); - const auto settings = GetSourceSettings(filter); - SetVariableValue(settings); - SetTempVarValue("settings", settings); + const auto settings = + GetSourceSettings(filter, _includeDefaults); + if (!settings) { + break; + } + + ret = CompareSourceSettings(*settings, _settings, _regex); + SetVariableValue(*settings); + SetTempVarValue("settings", *settings); break; } case Condition::SETTINGS_CHANGED: { - const auto settings = GetSourceSettings(filter); - ret = !_currentSettings.empty() && settings != _currentSettings; + const auto settings = + GetSourceSettings(filter, _includeDefaults); + ret = _currentSettings.has_value() && + settings != _currentSettings; _currentSettings = settings; - SetVariableValue(settings); - SetTempVarValue("settings", settings); + if (!settings) { + break; + } + SetVariableValue(*settings); + SetTempVarValue("settings", *settings); break; } case Condition::INDIVIDUAL_SETTING_MATCH: { @@ -134,6 +144,7 @@ bool MacroConditionFilter::Save(obs_data_t *obj) const _settings.Save(obj, "settings"); _regex.Save(obj); _setting.Save(obj); + obs_data_set_bool(obj, "includeDefaults", _includeDefaults); return true; } @@ -152,6 +163,7 @@ bool MacroConditionFilter::Load(obs_data_t *obj) obs_data_get_bool(obj, "regex")); } _setting.Load(obj); + _includeDefaults = obs_data_get_bool(obj, "includeDefaults"); return true; } @@ -221,8 +233,12 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( _settings(new VariableTextEdit(this)), _regex(new RegexConfigWidget(parent)), _settingSelection(new SourceSettingSelection()), - _refreshSettingSelection(new QPushButton( - obs_module_text("AdvSceneSwitcher.condition.filter.refresh"))) + _refreshSettingSelection(new QPushButton(obs_module_text( + "AdvSceneSwitcher.condition.filter.refresh"))), + _includeDefaults(new QCheckBox( + obs_module_text( + "AdvSceneSwitcher.condition.filter.includeDefaults"), + this)) { populateConditionSelection(_conditions); @@ -249,6 +265,8 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( SLOT(SettingSelectionChanged(const SourceSetting &))); QWidget::connect(_refreshSettingSelection, SIGNAL(clicked()), this, SLOT(RefreshVariableSourceSelectionValue())); + QWidget::connect(_includeDefaults, SIGNAL(stateChanged(int)), this, + SLOT(IncludeDefaultsChanged(int))); const std::unordered_map widgetPlaceholders = { {"{{sources}}", _sources}, @@ -280,6 +298,7 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( mainLayout->addLayout(line1Layout); mainLayout->addLayout(line2Layout); mainLayout->addLayout(line3Layout); + mainLayout->addWidget(_includeDefaults); setLayout(mainLayout); _entryData = entryData; @@ -332,7 +351,11 @@ void MacroConditionFilterEdit::GetSettingsClicked() QString value; if (_entryData->GetCondition() == MacroConditionFilter::Condition::SETTINGS_MATCH) { - value = FormatJsonString(GetSourceSettings(filters.at(0))); + const auto settings = GetSourceSettings( + filters.at(0), _entryData->_includeDefaults); + if (settings) { + value = FormatJsonString(*settings); + } } else if (_entryData->GetCondition() == MacroConditionFilter::Condition:: INDIVIDUAL_SETTING_LIST_ENTRY_MATCH) { @@ -387,6 +410,12 @@ void MacroConditionFilterEdit::RefreshVariableSourceSelectionValue() _settingSelection->SetSource(filters.empty() ? nullptr : filters.at(0)); } +void MacroConditionFilterEdit::IncludeDefaultsChanged(int state) +{ + GUARD_LOADING_AND_LOCK(); + _entryData->_includeDefaults = state; +} + static QString GetIndividualListEntryName() { static const auto matchesInput = @@ -440,6 +469,10 @@ void MacroConditionFilterEdit::SetWidgetVisibility() SetRowVisibleByValue(_conditions, GetIndividualListEntryName(), _entryData->_setting.IsList()); + _includeDefaults->setVisible( + _entryData->GetCondition() == + MacroConditionFilter::Condition::SETTINGS_MATCH); + adjustSize(); updateGeometry(); } @@ -461,6 +494,7 @@ void MacroConditionFilterEdit::UpdateEntryData() _settingSelection->SetSelection(filters.empty() ? nullptr : filters.at(0), _entryData->_setting); + _includeDefaults->setChecked(_entryData->_includeDefaults); SetWidgetVisibility(); adjustSize(); diff --git a/plugins/base/macro-condition-filter.hpp b/plugins/base/macro-condition-filter.hpp index 364fc56e..aa44c1b3 100644 --- a/plugins/base/macro-condition-filter.hpp +++ b/plugins/base/macro-condition-filter.hpp @@ -42,13 +42,14 @@ public: StringVariable _settings = ""; RegexConfig _regex; SourceSetting _setting; + bool _includeDefaults = false; private: void SetupTempVars(); bool CheckConditionHelper(const OBSWeakSource &); Condition _condition = Condition::ENABLED; - std::string _currentSettings; + std::optional _currentSettings; std::string _currentSettingsValue; static bool _registered; @@ -80,6 +81,7 @@ private slots: void RegexChanged(const RegexConfig &); void SettingSelectionChanged(const SourceSetting &); void RefreshVariableSourceSelectionValue(); + void IncludeDefaultsChanged(int); signals: void HeaderInfoChanged(const QString &); @@ -94,6 +96,7 @@ private: RegexConfigWidget *_regex; SourceSettingSelection *_settingSelection; QPushButton *_refreshSettingSelection; + QCheckBox *_includeDefaults; std::shared_ptr _entryData; bool _loading = true; diff --git a/plugins/base/macro-condition-source.cpp b/plugins/base/macro-condition-source.cpp index 9fcc0cbb..9ca84c3f 100644 --- a/plugins/base/macro-condition-source.cpp +++ b/plugins/base/macro-condition-source.cpp @@ -82,19 +82,28 @@ bool MacroConditionSource::CheckCondition() ret = obs_source_showing(s); break; case Condition::ALL_SETTINGS_MATCH: { - ret = CompareSourceSettings(_source.GetSource(), _settings, - _regex); - const auto settings = GetSourceSettings(_source.GetSource()); - SetVariableValue(settings); - SetTempVarValue("settings", settings); + const auto settings = GetSourceSettings(_source.GetSource(), + _includeDefaults); + if (!settings) { + break; + } + + ret = CompareSourceSettings(*settings, _settings, _regex); + SetVariableValue(*settings); + SetTempVarValue("settings", *settings); break; } case Condition::SETTINGS_CHANGED: { - const auto settings = GetSourceSettings(_source.GetSource()); - ret = !_currentSettings.empty() && settings != _currentSettings; + const auto settings = GetSourceSettings(_source.GetSource(), + _includeDefaults); + ret = _currentSettings.has_value() && + settings != _currentSettings; _currentSettings = settings; - SetVariableValue(settings); - SetTempVarValue("settings", settings); + if (!settings) { + break; + } + SetVariableValue(*settings); + SetTempVarValue("settings", *settings); break; } case Condition::INDIVIDUAL_SETTING_MATCH: { @@ -135,13 +144,13 @@ bool MacroConditionSource::CheckCondition() } case Condition::HEIGHT: { const auto height = obs_source_get_height(s); - ret = compareSourceSize(_comparision, height, _size); + ret = compareSourceSize(_comparison, height, _size); SetTempVarValue("height", std::to_string(height)); break; } case Condition::WIDTH: { const auto width = obs_source_get_width(s); - ret = compareSourceSize(_comparision, width, _size); + ret = compareSourceSize(_comparison, width, _size); SetTempVarValue("width", std::to_string(width)); break; } @@ -165,8 +174,9 @@ bool MacroConditionSource::Save(obs_data_t *obj) const _regex.Save(obj); _setting.Save(obj); _size.Save(obj, "size"); - obs_data_set_int(obj, "sizeComparisionMethod", - static_cast(_comparision)); + obs_data_set_int(obj, "sizeComparisonMethod", + static_cast(_comparison)); + obs_data_set_bool(obj, "includeDefaults", _includeDefaults); return true; } @@ -185,8 +195,11 @@ bool MacroConditionSource::Load(obs_data_t *obj) } _setting.Load(obj); _size.Load(obj, "size"); - _comparision = static_cast( - obs_data_get_int(obj, "sizeComparisionMethod")); + _comparison = static_cast(obs_data_get_int( + obj, obs_data_has_user_value(obj, "sizeComparisionMethod") + ? "sizeComparisionMethod" + : "sizeComparisonMethod")); + _includeDefaults = obs_data_get_bool(obj, "includeDefaults"); return true; } @@ -268,7 +281,11 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( _refreshSettingSelection(new QPushButton(obs_module_text( "AdvSceneSwitcher.condition.source.refresh"))), _size(new VariableSpinBox(this)), - _sizeCompareMethods(new QComboBox()) + _sizeCompareMethods(new QComboBox()), + _includeDefaults(new QCheckBox( + obs_module_text( + "AdvSceneSwitcher.condition.source.includeDefaults"), + this)) { populateSelection(_conditions, sourceConditionTypes); populateSelection(_sizeCompareMethods, compareMethods); @@ -300,6 +317,8 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( this, SLOT(SizeChanged(const NumberVariable &))); QWidget::connect(_sizeCompareMethods, SIGNAL(currentIndexChanged(int)), this, SLOT(CompareMethodChanged(int))); + QWidget::connect(_includeDefaults, SIGNAL(stateChanged(int)), this, + SLOT(IncludeDefaultsChanged(int))); auto line1Layout = new QHBoxLayout; line1Layout->setContentsMargins(0, 0, 0, 0); @@ -328,6 +347,7 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( mainLayout->addLayout(line1Layout); mainLayout->addLayout(line2Layout); mainLayout->addLayout(line3Layout); + mainLayout->addWidget(_includeDefaults); setLayout(mainLayout); _entryData = entryData; @@ -364,8 +384,12 @@ void MacroConditionSourceEdit::GetSettingsClicked() QString value; if (_entryData->GetCondition() == MacroConditionSource::Condition::ALL_SETTINGS_MATCH) { - value = FormatJsonString( - GetSourceSettings(_entryData->_source.GetSource())); + const auto settings = + GetSourceSettings(_entryData->_source.GetSource(), + _entryData->_includeDefaults); + if (settings) { + value = FormatJsonString(*settings); + } } else if (_entryData->GetCondition() == MacroConditionSource::Condition:: INDIVIDUAL_SETTING_LIST_ENTRY_MATCH) { @@ -427,10 +451,16 @@ void MacroConditionSourceEdit::SizeChanged(const NumberVariable &value) void MacroConditionSourceEdit::CompareMethodChanged(int index) { GUARD_LOADING_AND_LOCK(); - _entryData->_comparision = + _entryData->_comparison = static_cast(index); } +void MacroConditionSourceEdit::IncludeDefaultsChanged(int state) +{ + GUARD_LOADING_AND_LOCK(); + _entryData->_includeDefaults = state; +} + static QString GetIndividualListEntryName() { static const auto matchesInput = @@ -500,6 +530,10 @@ void MacroConditionSourceEdit::SetWidgetVisibility() SetRowVisibleByValue(_conditions, GetIndividualListEntryName(), _entryData->_setting.IsList()); + _includeDefaults->setVisible( + _entryData->GetCondition() == + MacroConditionSource::Condition::ALL_SETTINGS_MATCH); + adjustSize(); updateGeometry(); } @@ -519,7 +553,8 @@ void MacroConditionSourceEdit::UpdateEntryData() _entryData->_setting); _size->SetValue(_entryData->_size); _sizeCompareMethods->setCurrentIndex( - static_cast(_entryData->_comparision)); + static_cast(_entryData->_comparison)); + _includeDefaults->setChecked(_entryData->_includeDefaults); SetWidgetVisibility(); } diff --git a/plugins/base/macro-condition-source.hpp b/plugins/base/macro-condition-source.hpp index 89f90810..b2f295b9 100644 --- a/plugins/base/macro-condition-source.hpp +++ b/plugins/base/macro-condition-source.hpp @@ -45,13 +45,14 @@ public: SourceSetting _setting; RegexConfig _regex; IntVariable _size; - SizeComparision _comparision = SizeComparision::EQUAL; + SizeComparision _comparison = SizeComparision::EQUAL; + bool _includeDefaults = false; private: void SetupTempVars(); Condition _condition = Condition::ACTIVE; - std::string _currentSettings; + std::optional _currentSettings; std::string _currentSettingsValue; static bool _registered; @@ -84,6 +85,7 @@ private slots: void RefreshVariableSourceSelectionValue(); void SizeChanged(const NumberVariable &value); void CompareMethodChanged(int); + void IncludeDefaultsChanged(int); signals: void HeaderInfoChanged(const QString &); @@ -97,6 +99,7 @@ protected: QPushButton *_refreshSettingSelection; VariableSpinBox *_size; QComboBox *_sizeCompareMethods; + QCheckBox *_includeDefaults; std::shared_ptr _entryData; diff --git a/plugins/base/utils/source-setting.cpp b/plugins/base/utils/source-setting.cpp index 9ca3d17a..fdda1387 100644 --- a/plugins/base/utils/source-setting.cpp +++ b/plugins/base/utils/source-setting.cpp @@ -133,20 +133,6 @@ static void addSettingsHelper(obs_property_t *property, } while (obs_property_next(&property)); } -std::vector GetSoruceSettings(obs_source_t *source) -{ - properties_t properties(obs_source_properties(source), - obs_properties_destroy); - if (!properties) { - return {}; - } - std::vector settings; - - auto it = obs_properties_first(properties.get()); - addSettingsHelper(it, settings); - return settings; -} - static std::optional getDataJsonWithDefaults(const OBSWeakSource &ws) { @@ -495,11 +481,25 @@ void SourceSettingSelection::SelectionIdxChanged(int idx) emit SelectionChanged(setting); } +static std::vector getSourceSettings(obs_source_t *source) +{ + properties_t properties(obs_source_properties(source), + obs_properties_destroy); + if (!properties) { + return {}; + } + std::vector settings; + + auto it = obs_properties_first(properties.get()); + addSettingsHelper(it, settings); + return settings; +} + void SourceSettingSelection::Populate(const OBSWeakSource &source) { _settings->clear(); OBSSourceAutoRelease s = obs_weak_source_get_source(source); - auto settings = GetSoruceSettings(s); + const auto settings = getSourceSettings(s); for (const auto &setting : settings) { QVariant variant; variant.setValue(setting); diff --git a/plugins/base/utils/source-setting.hpp b/plugins/base/utils/source-setting.hpp index 343a6e31..7b17a3b7 100644 --- a/plugins/base/utils/source-setting.hpp +++ b/plugins/base/utils/source-setting.hpp @@ -32,7 +32,6 @@ private: friend class SourceSettingSelection; }; -std::vector GetSoruceSettings(obs_source_t *source); std::optional GetSourceSettingValue(const OBSWeakSource &source, const SourceSetting &setting); std::optional diff --git a/plugins/base/utils/source-settings-helpers.cpp b/plugins/base/utils/source-settings-helpers.cpp index e065e271..fb2674f9 100644 --- a/plugins/base/utils/source-settings-helpers.cpp +++ b/plugins/base/utils/source-settings-helpers.cpp @@ -4,23 +4,30 @@ namespace advss { -std::string GetSourceSettings(OBSWeakSource ws) +std::optional GetSourceSettings(OBSWeakSource ws, + bool includeDefaults) { if (!ws) { - return ""; + return {}; } - std::string settings; - auto s = obs_weak_source_get_source(ws); - obs_data_t *data = obs_source_get_settings(s); + OBSSourceAutoRelease source = obs_weak_source_get_source(ws); + OBSDataAutoRelease dataWithoutDefaults = + obs_source_get_settings(source); + if (!dataWithoutDefaults) { + return {}; + } + + OBSDataAutoRelease dataWithDefaults = + obs_data_get_defaults(dataWithoutDefaults); + obs_data_apply(dataWithDefaults, dataWithoutDefaults); + + auto &data = includeDefaults ? dataWithDefaults : dataWithoutDefaults; auto json = obs_data_get_json(data); - if (json) { - settings = json; + if (!json) { + return {}; } - obs_data_release(data); - obs_source_release(s); - - return settings; + return json; } void SetSourceSettings(obs_source_t *s, const std::string &settings) @@ -39,12 +46,11 @@ void SetSourceSettings(obs_source_t *s, const std::string &settings) obs_data_release(data); } -bool CompareSourceSettings(const OBSWeakSource &source, +bool CompareSourceSettings(const std::string &sourceSettings, const std::string &settings, const RegexConfig ®ex) { - std::string currentSettings = GetSourceSettings(source); - return MatchJson(currentSettings, settings, regex); + return MatchJson(sourceSettings, settings, regex); } } // namespace advss diff --git a/plugins/base/utils/source-settings-helpers.hpp b/plugins/base/utils/source-settings-helpers.hpp index c90d235a..64eccefc 100644 --- a/plugins/base/utils/source-settings-helpers.hpp +++ b/plugins/base/utils/source-settings-helpers.hpp @@ -1,13 +1,17 @@ #pragma once -#include -#include #include +#include + +#include +#include + namespace advss { -std::string GetSourceSettings(OBSWeakSource ws); +std::optional GetSourceSettings(OBSWeakSource ws, + bool includeDefaults); void SetSourceSettings(obs_source_t *s, const std::string &settings); -bool CompareSourceSettings(const OBSWeakSource &source, +bool CompareSourceSettings(const std::string &sourceSettings, const std::string &settings, const RegexConfig ®ex);