diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index d7729706..92c2779d 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -341,6 +341,7 @@ AdvSceneSwitcher.condition.source="Source" AdvSceneSwitcher.condition.source.type.active="Is active" AdvSceneSwitcher.condition.source.type.showing="Is showing" AdvSceneSwitcher.condition.source.type.settings="Settings match" +AdvSceneSwitcher.condition.source.type.settingsChanged="Settings changed" 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}}" @@ -354,6 +355,7 @@ AdvSceneSwitcher.condition.filter="Filter" AdvSceneSwitcher.condition.filter.type.active="Is enabled" AdvSceneSwitcher.condition.filter.type.showing="Is disabled" AdvSceneSwitcher.condition.filter.type.settings="Settings match" +AdvSceneSwitcher.condition.filter.type.settingsChanged="Settings changed" AdvSceneSwitcher.condition.filter.getSettings="Get current settings" AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" diff --git a/src/macro-core/macro-condition-filter.cpp b/src/macro-core/macro-condition-filter.cpp index a43df0d6..f3b7715d 100644 --- a/src/macro-core/macro-condition-filter.cpp +++ b/src/macro-core/macro-condition-filter.cpp @@ -18,8 +18,10 @@ const static std::map "AdvSceneSwitcher.condition.filter.type.active"}, {MacroConditionFilter::Condition::DISABLED, "AdvSceneSwitcher.condition.filter.type.showing"}, - {MacroConditionFilter::Condition::SETTINGS, + {MacroConditionFilter::Condition::SETTINGS_MATCH, "AdvSceneSwitcher.condition.filter.type.settings"}, + {MacroConditionFilter::Condition::SETTINGS_CHANGED, + "AdvSceneSwitcher.condition.filter.type.settingsChanged"}, }; bool MacroConditionFilter::CheckCondition() @@ -38,13 +40,20 @@ bool MacroConditionFilter::CheckCondition() case Condition::DISABLED: ret = !obs_source_enabled(filterSource); break; - case Condition::SETTINGS: + case Condition::SETTINGS_MATCH: ret = CompareSourceSettings(filterWeakSource, _settings, _regex); if (IsReferencedInVars()) { SetVariableValue(GetSourceSettings(filterWeakSource)); } break; + case Condition::SETTINGS_CHANGED: { + std::string settings = GetSourceSettings(_source.GetSource()); + ret = !_currentSettings.empty() && settings != _currentSettings; + _currentSettings = settings; + SetVariableValue(settings); + break; + } default: break; } @@ -95,8 +104,8 @@ std::string MacroConditionFilter::GetShortDesc() const static inline void populateConditionSelection(QComboBox *list) { - for (auto entry : filterConditionTypes) { - list->addItem(obs_module_text(entry.second.c_str())); + for (const auto &[_, name] : filterConditionTypes) { + list->addItem(obs_module_text(name.c_str())); } } @@ -194,8 +203,9 @@ void MacroConditionFilterEdit::ConditionChanged(int index) auto lock = LockContext(); _entryData->_condition = static_cast(index); - SetSettingsSelectionVisible(_entryData->_condition == - MacroConditionFilter::Condition::SETTINGS); + SetSettingsSelectionVisible( + _entryData->_condition == + MacroConditionFilter::Condition::SETTINGS_MATCH); } void MacroConditionFilterEdit::GetSettingsClicked() @@ -259,8 +269,9 @@ void MacroConditionFilterEdit::UpdateEntryData() _conditions->setCurrentIndex(static_cast(_entryData->_condition)); _settings->setPlainText(_entryData->_settings); _regex->SetRegexConfig(_entryData->_regex); - SetSettingsSelectionVisible(_entryData->_condition == - MacroConditionFilter::Condition::SETTINGS); + SetSettingsSelectionVisible( + _entryData->_condition == + MacroConditionFilter::Condition::SETTINGS_MATCH); adjustSize(); updateGeometry(); diff --git a/src/macro-core/macro-condition-filter.hpp b/src/macro-core/macro-condition-filter.hpp index 5d0e6965..e0c36b3e 100644 --- a/src/macro-core/macro-condition-filter.hpp +++ b/src/macro-core/macro-condition-filter.hpp @@ -27,7 +27,8 @@ public: enum class Condition { ENABLED, DISABLED, - SETTINGS, + SETTINGS_MATCH, + SETTINGS_CHANGED, }; SourceSelection _source; @@ -37,6 +38,8 @@ public: RegexConfig _regex; private: + std::string _currentSettings; + static bool _registered; static const std::string id; }; diff --git a/src/macro-core/macro-condition-source.cpp b/src/macro-core/macro-condition-source.cpp index c6857750..43fe4798 100644 --- a/src/macro-core/macro-condition-source.cpp +++ b/src/macro-core/macro-condition-source.cpp @@ -10,13 +10,16 @@ bool MacroConditionSource::_registered = MacroConditionFactory::Register( {MacroConditionSource::Create, MacroConditionSourceEdit::Create, "AdvSceneSwitcher.condition.source"}); -const static std::map sourceConditionTypes = { - {SourceCondition::ACTIVE, - "AdvSceneSwitcher.condition.source.type.active"}, - {SourceCondition::SHOWING, - "AdvSceneSwitcher.condition.source.type.showing"}, - {SourceCondition::SETTINGS, - "AdvSceneSwitcher.condition.source.type.settings"}, +const static std::map + sourceCnditionTypes = { + {MacroConditionSource::Condition::ACTIVE, + "AdvSceneSwitcher.condition.source.type.active"}, + {MacroConditionSource::Condition::SHOWING, + "AdvSceneSwitcher.condition.source.type.showing"}, + {MacroConditionSource::Condition::SETTINGS_MATCH, + "AdvSceneSwitcher.condition.source.type.settings"}, + {MacroConditionSource::Condition::SETTINGS_CHANGED, + "AdvSceneSwitcher.condition.source.type.settingsChanged"}, }; bool MacroConditionSource::CheckCondition() @@ -29,13 +32,13 @@ bool MacroConditionSource::CheckCondition() auto s = obs_weak_source_get_source(_source.GetSource()); switch (_condition) { - case SourceCondition::ACTIVE: + case Condition::ACTIVE: ret = obs_source_active(s); break; - case SourceCondition::SHOWING: + case Condition::SHOWING: ret = obs_source_showing(s); break; - case SourceCondition::SETTINGS: + case Condition::SETTINGS_MATCH: ret = CompareSourceSettings(_source.GetSource(), _settings, _regex); if (IsReferencedInVars()) { @@ -43,6 +46,13 @@ bool MacroConditionSource::CheckCondition() GetSourceSettings(_source.GetSource())); } break; + case Condition::SETTINGS_CHANGED: { + std::string settings = GetSourceSettings(_source.GetSource()); + ret = !_currentSettings.empty() && settings != _currentSettings; + _currentSettings = settings; + SetVariableValue(settings); + break; + } default: break; } @@ -70,8 +80,7 @@ bool MacroConditionSource::Load(obs_data_t *obj) { MacroCondition::Load(obj); _source.Load(obj); - _condition = static_cast( - obs_data_get_int(obj, "condition")); + _condition = static_cast(obs_data_get_int(obj, "condition")); _settings.Load(obj, "settings"); _regex.Load(obj); // TOOD: remove in future version @@ -89,8 +98,8 @@ std::string MacroConditionSource::GetShortDesc() const static inline void populateConditionSelection(QComboBox *list) { - for (auto entry : sourceConditionTypes) { - list->addItem(obs_module_text(entry.second.c_str())); + for (const auto &[_, name] : sourceCnditionTypes) { + list->addItem(obs_module_text(name.c_str())); } } @@ -173,7 +182,8 @@ void MacroConditionSourceEdit::ConditionChanged(int index) } auto lock = LockContext(); - _entryData->_condition = static_cast(index); + _entryData->_condition = + static_cast(index); SetWidgetVisibility(); } @@ -220,14 +230,18 @@ void MacroConditionSourceEdit::RegexChanged(RegexConfig conf) void MacroConditionSourceEdit::SetWidgetVisibility() { _settings->setVisible(_entryData->_condition == - SourceCondition::SETTINGS); - _getSettings->setVisible(_entryData->_condition == - SourceCondition::SETTINGS); - _regex->setVisible(_entryData->_condition == SourceCondition::SETTINGS); + MacroConditionSource::Condition::SETTINGS_MATCH); + _getSettings->setVisible( + _entryData->_condition == + MacroConditionSource::Condition::SETTINGS_MATCH); + _regex->setVisible(_entryData->_condition == + MacroConditionSource::Condition::SETTINGS_MATCH); setToolTip( - (_entryData->_condition == SourceCondition::ACTIVE || - _entryData->_condition == SourceCondition::SHOWING) + (_entryData->_condition == + MacroConditionSource::Condition::ACTIVE || + _entryData->_condition == + MacroConditionSource::Condition::SHOWING) ? obs_module_text( "AdvSceneSwitcher.condition.source.sceneVisibilityHint") : ""); diff --git a/src/macro-core/macro-condition-source.hpp b/src/macro-core/macro-condition-source.hpp index ee554785..39ff817f 100644 --- a/src/macro-core/macro-condition-source.hpp +++ b/src/macro-core/macro-condition-source.hpp @@ -10,12 +10,6 @@ namespace advss { -enum class SourceCondition { - ACTIVE, - SHOWING, - SETTINGS, -}; - class MacroConditionSource : public MacroCondition { public: MacroConditionSource(Macro *m) : MacroCondition(m, true) {} @@ -29,12 +23,21 @@ public: return std::make_shared(m); } + enum class Condition { + ACTIVE, + SHOWING, + SETTINGS_MATCH, + SETTINGS_CHANGED, + }; + SourceSelection _source; - SourceCondition _condition = SourceCondition::ACTIVE; + Condition _condition = Condition::ACTIVE; StringVariable _settings = ""; RegexConfig _regex; private: + std::string _currentSettings; + static bool _registered; static const std::string id; };