From 481da80d4cbd96736813f302dd4d6b3fec850fdf Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 30 Dec 2023 01:02:42 +0100 Subject: [PATCH] Add option to check single settings values in Source condition --- data/locale/de-DE.ini | 3 +- data/locale/en-US.ini | 6 +- data/locale/es-ES.ini | 3 +- data/locale/fr-FR.ini | 2 +- data/locale/tr-TR.ini | 3 +- data/locale/zh-CN.ini | 3 +- src/macro-core/macro-condition-source.cpp | 104 +++++++++++++++++----- src/macro-core/macro-condition-source.hpp | 9 +- 8 files changed, 97 insertions(+), 36 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index c2bbab7a..b709fa60 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -263,9 +263,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="Aktuelle Anzahl: {{currentCo AdvSceneSwitcher.condition.source="Quelle" AdvSceneSwitcher.condition.source.type.active="Ist aktiv" AdvSceneSwitcher.condition.source.type.showing="Wird angezeigt" -AdvSceneSwitcher.condition.source.type.settings="Einstellungen stimmen überein" +AdvSceneSwitcher.condition.source.type.settingsMatch="Einstellungen stimmen überein" AdvSceneSwitcher.condition.source.getSettings="Aktuelle Einstellungen abfragen" -AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.virtualCamera="Virtuelle Kamera" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 94ad5c7a..405639ac 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -350,11 +350,13 @@ AdvSceneSwitcher.condition.macro.paused.entry="Macro{{macros}}is paused" 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.settingsMatch="Settings match" AdvSceneSwitcher.condition.source.type.settingsChanged="Settings changed" +AdvSceneSwitcher.condition.source.type.individualSettingMatches="Setting value matches" +AdvSceneSwitcher.condition.source.type.individualSettingChanged="Setting value 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}}" +AdvSceneSwitcher.condition.source.entry.line1="{{sources}}{{conditions}}{{settingSelection}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}}{{getSettings}}" AdvSceneSwitcher.condition.virtualCamera="Virtual camera" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 2c806d45..87d29823 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -215,9 +215,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="Recuento actual: {{currentCo AdvSceneSwitcher.condition.source="Fuente" AdvSceneSwitcher.condition.source.type.active="Está activo" AdvSceneSwitcher.condition.source.type.showing="Se muestra" -AdvSceneSwitcher.condition.source.type.settings="Coincidencia de configuración" +AdvSceneSwitcher.condition.source.type.settingsMatch="Coincidencia de configuración" AdvSceneSwitcher.condition.source.getSettings="Obtener la configuración actual" -AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.virtualCamera="Cámara virtual" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 0b5894d5..60f33c90 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -330,7 +330,7 @@ AdvSceneSwitcher.condition.macro.actionState.enabled.entry="L'action{{actionInde AdvSceneSwitcher.condition.source="Source" AdvSceneSwitcher.condition.source.type.active="Est actif" AdvSceneSwitcher.condition.source.type.showing="Est affiché" -AdvSceneSwitcher.condition.source.type.settings="Correspond aux paramètres" +AdvSceneSwitcher.condition.source.type.settingsMatch="Correspond aux paramètres" AdvSceneSwitcher.condition.source.type.settingsChanged="Paramètres modifiés" AdvSceneSwitcher.condition.source.sceneVisibilityHint="La visibilité spécifique à la scène peut être vérifiée en utilisant la condition \"Visibilité de l'élément de la scène\"" AdvSceneSwitcher.condition.source.getSettings="Obtenir les paramètres actuels" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 3d368d81..edeec3ef 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -191,9 +191,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="Mevcut sayı: {{currentCount AdvSceneSwitcher.condition.source="Kaynak" AdvSceneSwitcher.condition.source.type.active="Aktiftir" AdvSceneSwitcher.condition.source.type.showing="gösteriyor" -AdvSceneSwitcher.condition.source.type.settings="Ayarlar eşleştirildi" +AdvSceneSwitcher.condition.source.type.settingsMatch="Ayarlar eşleştirildi" AdvSceneSwitcher.condition.source.getSettings="Mevcut ayarları al" -AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.virtualCamera="Sanal kamera" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 6f196988..0e08e362 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -309,9 +309,8 @@ AdvSceneSwitcher.condition.macro.count.entry.line2="当前计数: {{currentCount AdvSceneSwitcher.condition.source="源" AdvSceneSwitcher.condition.source.type.active="是激活状态" AdvSceneSwitcher.condition.source.type.showing="是显示状态" -AdvSceneSwitcher.condition.source.type.settings="设置完全匹配" +AdvSceneSwitcher.condition.source.type.settingsMatch="设置完全匹配" AdvSceneSwitcher.condition.source.getSettings="获取当前设置" -AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}" AdvSceneSwitcher.condition.source.entry.line2="{{settings}}" AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.virtualCamera="虚拟摄像机" diff --git a/src/macro-core/macro-condition-source.cpp b/src/macro-core/macro-condition-source.cpp index 43fe4798..5e012e9c 100644 --- a/src/macro-core/macro-condition-source.cpp +++ b/src/macro-core/macro-condition-source.cpp @@ -16,10 +16,14 @@ const static std::map "AdvSceneSwitcher.condition.source.type.active"}, {MacroConditionSource::Condition::SHOWING, "AdvSceneSwitcher.condition.source.type.showing"}, - {MacroConditionSource::Condition::SETTINGS_MATCH, - "AdvSceneSwitcher.condition.source.type.settings"}, + {MacroConditionSource::Condition::ALL_SETTINGS_MATCH, + "AdvSceneSwitcher.condition.source.type.settingsMatch"}, {MacroConditionSource::Condition::SETTINGS_CHANGED, "AdvSceneSwitcher.condition.source.type.settingsChanged"}, + {MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH, + "AdvSceneSwitcher.condition.source.type.individualSettingMatches"}, + {MacroConditionSource::Condition::INDIVIDUAL_SETTING_CHANGED, + "AdvSceneSwitcher.condition.source.type.individualSettingChanged"}, }; bool MacroConditionSource::CheckCondition() @@ -29,7 +33,8 @@ bool MacroConditionSource::CheckCondition() } bool ret = false; - auto s = obs_weak_source_get_source(_source.GetSource()); + OBSSourceAutoRelease s = + obs_weak_source_get_source(_source.GetSource()); switch (_condition) { case Condition::ACTIVE: @@ -38,7 +43,7 @@ bool MacroConditionSource::CheckCondition() case Condition::SHOWING: ret = obs_source_showing(s); break; - case Condition::SETTINGS_MATCH: + case Condition::ALL_SETTINGS_MATCH: ret = CompareSourceSettings(_source.GetSource(), _settings, _regex); if (IsReferencedInVars()) { @@ -53,12 +58,26 @@ bool MacroConditionSource::CheckCondition() SetVariableValue(settings); break; } + case Condition::INDIVIDUAL_SETTING_MATCH: { + std::string value = + GetSourceSettingValue(_source.GetSource(), _setting); + ret = _regex.Enabled() ? _regex.Matches(value, _settings) + : value == std::string(_settings); + SetVariableValue(value); + break; + } + case Condition::INDIVIDUAL_SETTING_CHANGED: { + std::string value = + GetSourceSettingValue(_source.GetSource(), _setting); + ret = _currentSettingsValue != value; + _currentSettingsValue = value; + SetVariableValue(value); + break; + } default: break; } - obs_source_release(s); - if (GetVariableValue().empty()) { SetVariableValue(ret ? "true" : "false"); } @@ -73,6 +92,7 @@ bool MacroConditionSource::Save(obs_data_t *obj) const obs_data_set_int(obj, "condition", static_cast(_condition)); _settings.Save(obj, "settings"); _regex.Save(obj); + _setting.Save(obj); return true; } @@ -88,6 +108,7 @@ bool MacroConditionSource::Load(obs_data_t *obj) _regex.CreateBackwardsCompatibleRegex( obs_data_get_bool(obj, "regex")); } + _setting.Load(obj); return true; } @@ -109,9 +130,10 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( _sources(new SourceSelectionWidget(this, QStringList(), true)), _conditions(new QComboBox()), _getSettings(new QPushButton(obs_module_text( - "AdvSceneSwitcher.condition.filter.getSettings"))), + "AdvSceneSwitcher.condition.source.getSettings"))), _settings(new VariableTextEdit(this)), - _regex(new RegexConfigWidget(parent)) + _regex(new RegexConfigWidget(parent)), + _settingSelection(new SourceSettingSelection()) { populateConditionSelection(_conditions); auto sources = GetSourceNames(); @@ -131,12 +153,18 @@ MacroConditionSourceEdit::MacroConditionSourceEdit( SLOT(SettingsChanged())); QWidget::connect(_regex, SIGNAL(RegexConfigChanged(RegexConfig)), this, SLOT(RegexChanged(RegexConfig))); + QWidget::connect(_settingSelection, + SIGNAL(SelectionChanged(const SourceSetting &)), this, + SLOT(SettingSelectionChanged(const SourceSetting &))); std::unordered_map widgetPlaceholders = { - {"{{sources}}", _sources}, {"{{conditions}}", _conditions}, - {"{{settings}}", _settings}, {"{{getSettings}}", _getSettings}, + {"{{sources}}", _sources}, + {"{{conditions}}", _conditions}, + {"{{settings}}", _settings}, + {"{{getSettings}}", _getSettings}, {"{{regex}}", _regex}, - }; + {"{{settingSelection}}", _settingSelection}}; + auto line1Layout = new QHBoxLayout; line1Layout->setContentsMargins(0, 0, 0, 0); PlaceWidgets(obs_module_text( @@ -169,8 +197,11 @@ void MacroConditionSourceEdit::SourceChanged(const SourceSelection &source) return; } - auto lock = LockContext(); - _entryData->_source = source; + { + auto lock = LockContext(); + _entryData->_source = source; + } + _settingSelection->SetSource(_entryData->_source.GetSource()); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -193,12 +224,20 @@ void MacroConditionSourceEdit::GetSettingsClicked() return; } - QString json = FormatJsonString( - GetSourceSettings(_entryData->_source.GetSource())); - if (_entryData->_regex.Enabled()) { - json = EscapeForRegex(json); + QString value; + if (_entryData->_condition == + MacroConditionSource::Condition::ALL_SETTINGS_MATCH) { + value = FormatJsonString( + GetSourceSettings(_entryData->_source.GetSource())); + } else { + value = QString::fromStdString(GetSourceSettingValue( + _entryData->_source.GetSource(), _entryData->_setting)); } - _settings->setPlainText(json); + + if (_entryData->_regex.Enabled()) { + value = EscapeForRegex(value); + } + _settings->setPlainText(value); } void MacroConditionSourceEdit::SettingsChanged() @@ -227,15 +266,30 @@ void MacroConditionSourceEdit::RegexChanged(RegexConfig conf) updateGeometry(); } +void MacroConditionSourceEdit::SettingSelectionChanged( + const SourceSetting &setting) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_setting = setting; +} + void MacroConditionSourceEdit::SetWidgetVisibility() { - _settings->setVisible(_entryData->_condition == - MacroConditionSource::Condition::SETTINGS_MATCH); - _getSettings->setVisible( + const bool settingsMatch = _entryData->_condition == - MacroConditionSource::Condition::SETTINGS_MATCH); - _regex->setVisible(_entryData->_condition == - MacroConditionSource::Condition::SETTINGS_MATCH); + MacroConditionSource::Condition::ALL_SETTINGS_MATCH || + _entryData->_condition == + MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH; + _settings->setVisible(settingsMatch); + _getSettings->setVisible(settingsMatch); + _regex->setVisible(settingsMatch); + _settingSelection->setVisible( + _entryData->_condition == + MacroConditionSource::Condition::INDIVIDUAL_SETTING_MATCH); setToolTip( (_entryData->_condition == @@ -260,6 +314,8 @@ void MacroConditionSourceEdit::UpdateEntryData() _conditions->setCurrentIndex(static_cast(_entryData->_condition)); _settings->setPlainText(_entryData->_settings); _regex->SetRegexConfig(_entryData->_regex); + _settingSelection->SetSource(_entryData->_source.GetSource()); + _settingSelection->SetSetting(_entryData->_setting); SetWidgetVisibility(); } diff --git a/src/macro-core/macro-condition-source.hpp b/src/macro-core/macro-condition-source.hpp index 39ff817f..069e201d 100644 --- a/src/macro-core/macro-condition-source.hpp +++ b/src/macro-core/macro-condition-source.hpp @@ -3,6 +3,7 @@ #include "variable-text-edit.hpp" #include "regex-config.hpp" #include "source-selection.hpp" +#include "source-setting.hpp" #include #include @@ -26,17 +27,21 @@ public: enum class Condition { ACTIVE, SHOWING, - SETTINGS_MATCH, + ALL_SETTINGS_MATCH, SETTINGS_CHANGED, + INDIVIDUAL_SETTING_MATCH, + INDIVIDUAL_SETTING_CHANGED, }; SourceSelection _source; Condition _condition = Condition::ACTIVE; StringVariable _settings = ""; + SourceSetting _setting; RegexConfig _regex; private: std::string _currentSettings; + std::string _currentSettingsValue; static bool _registered; static const std::string id; @@ -64,6 +69,7 @@ private slots: void GetSettingsClicked(); void SettingsChanged(); void RegexChanged(RegexConfig); + void SettingSelectionChanged(const SourceSetting &); signals: void HeaderInfoChanged(const QString &); @@ -73,6 +79,7 @@ protected: QPushButton *_getSettings; VariableTextEdit *_settings; RegexConfigWidget *_regex; + SourceSettingSelection *_settingSelection; std::shared_ptr _entryData;