From 101ab26069717367ae151f82e1122ed47e18edc2 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 30 Dec 2023 14:05:33 +0100 Subject: [PATCH] Add option to check single settings value in Filter condition --- data/locale/de-DE.ini | 4 +- data/locale/en-US.ini | 6 +- data/locale/es-ES.ini | 4 +- data/locale/fr-FR.ini | 4 +- data/locale/tr-TR.ini | 4 +- data/locale/zh-CN.ini | 4 +- src/macro-core/macro-condition-filter.cpp | 115 +++++++++++++++++----- src/macro-core/macro-condition-filter.hpp | 15 ++- 8 files changed, 116 insertions(+), 40 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index b709fa60..50b51c60 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -274,9 +274,9 @@ AdvSceneSwitcher.condition.virtualCamera.entry="{{states}}" AdvSceneSwitcher.condition.filter="Filter" AdvSceneSwitcher.condition.filter.type.active="Ist aktiviert" AdvSceneSwitcher.condition.filter.type.showing="Ist deaktiviert" -AdvSceneSwitcher.condition.filter.type.settings="Einstellungen passen" +AdvSceneSwitcher.condition.filter.type.settingsMatch="Einstellungen passen" AdvSceneSwitcher.condition.filter.getSettings="Aktuelle Einstellungen abrufen" -AdvSceneSwitcher.condition.filter.entry.line1="Auf {{sources}} {{filters}} {{conditions}}" +AdvSceneSwitcher.condition.filter.entry.line1="Auf{{sources}}{{filters}}{{conditions}}{{settingSelection}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Reihenfolge der Szenenelemente" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 405639ac..77042d42 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -366,10 +366,12 @@ AdvSceneSwitcher.condition.virtualCamera.entry="{{states}}" 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.settingsMatch="Settings match" AdvSceneSwitcher.condition.filter.type.settingsChanged="Settings changed" +AdvSceneSwitcher.condition.filter.type.individualSettingMatches="Settings value matches" +AdvSceneSwitcher.condition.filter.type.individualSettingChanged="Settings value changed" AdvSceneSwitcher.condition.filter.getSettings="Get current settings" -AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}" +AdvSceneSwitcher.condition.filter.entry.line1="On{{sources}}{{filters}}{{conditions}}{{settingSelection}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}}{{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Scene item order" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 87d29823..aa0f85a6 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -226,9 +226,9 @@ AdvSceneSwitcher.condition.virtualCamera.entry="{{states}}" AdvSceneSwitcher.condition.filter="Filtro" AdvSceneSwitcher.condition.filter.type.active="Está habilitado" AdvSceneSwitcher.condition.filter.type.showing="Está deshabilitado" -AdvSceneSwitcher.condition.filter.type.settings="Coincidencia de configuración" +AdvSceneSwitcher.condition.filter.type.settingsMatch="Coincidencia de configuración" AdvSceneSwitcher.condition.filter.getSettings="Obtener la configuración actual" -AdvSceneSwitcher.condition.filter.entry.line1="En {{sources}} {{filters}} {{conditions}}" +AdvSceneSwitcher.condition.filter.entry.line1="En{{sources}}{{filters}}{{conditions}}{{settingSelection}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Orden de elementos de escena" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 60f33c90..be020b04 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -340,10 +340,10 @@ AdvSceneSwitcher.condition.virtualCamera.state.stop="Arrêt de la caméra virtue AdvSceneSwitcher.condition.filter="Filtre" AdvSceneSwitcher.condition.filter.type.active="Est activé" AdvSceneSwitcher.condition.filter.type.showing="Est désactivé" -AdvSceneSwitcher.condition.filter.type.settings="Correspond aux paramètres" +AdvSceneSwitcher.condition.filter.type.settingsMatch="Correspond aux paramètres" AdvSceneSwitcher.condition.filter.type.settingsChanged="Paramètres modifiés" AdvSceneSwitcher.condition.filter.getSettings="Obtenir les paramètres actuels" -AdvSceneSwitcher.condition.filter.entry.line1="Sur{{sources}}{{filters}}{{conditions}}" +AdvSceneSwitcher.condition.filter.entry.line1="Sur{{sources}}{{filters}}{{conditions}}{{settingSelection}}" AdvSceneSwitcher.condition.sceneOrder="Ordre des éléments de la scène" AdvSceneSwitcher.condition.sceneOrder.type.above="Est au-dessus de" AdvSceneSwitcher.condition.sceneOrder.type.below="Est en dessous de" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index edeec3ef..5f84f6a2 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -202,9 +202,9 @@ AdvSceneSwitcher.condition.virtualCamera.entry="{{states}}" AdvSceneSwitcher.condition.filter="Filtrele" AdvSceneSwitcher.condition.filter.type.active="Etkinleştirildi" AdvSceneSwitcher.condition.filter.type.showing="Etkisizleştirildi" -AdvSceneSwitcher.condition.filter.type.settings="Ayarlar eşleşti" +AdvSceneSwitcher.condition.filter.type.settingsMatch="Ayarlar eşleşti" AdvSceneSwitcher.condition.filter.getSettings="Mevcut ayarları al" -AdvSceneSwitcher.condition.filter.entry.line1="Açık {{sources}} {{filters}} {{conditions}}" +AdvSceneSwitcher.condition.filter.entry.line1="Açık{{sources}}{{filters}}{{conditions}}{{settingSelection}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="Sahne öğesi sırası" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 0e08e362..ee5dbfe5 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -320,9 +320,9 @@ AdvSceneSwitcher.condition.virtualCamera.entry="{{states}}" AdvSceneSwitcher.condition.filter="滤镜" AdvSceneSwitcher.condition.filter.type.active="已启用" AdvSceneSwitcher.condition.filter.type.showing="已关闭" -AdvSceneSwitcher.condition.filter.type.settings="设置完全匹配" +AdvSceneSwitcher.condition.filter.type.settingsMatch="设置完全匹配" AdvSceneSwitcher.condition.filter.getSettings="获取当前设置" -AdvSceneSwitcher.condition.filter.entry.line1="在 {{sources}} 的 {{filters}} 是 {{conditions}}" +AdvSceneSwitcher.condition.filter.entry.line1="在{{sources}}的{{filters}}是{{conditions}}{{settingSelection}}" AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}" AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}" AdvSceneSwitcher.condition.sceneOrder="场景项目顺序" diff --git a/src/macro-core/macro-condition-filter.cpp b/src/macro-core/macro-condition-filter.cpp index b5dc5fab..7b3dde59 100644 --- a/src/macro-core/macro-condition-filter.cpp +++ b/src/macro-core/macro-condition-filter.cpp @@ -19,9 +19,13 @@ const static std::map {MacroConditionFilter::Condition::DISABLED, "AdvSceneSwitcher.condition.filter.type.showing"}, {MacroConditionFilter::Condition::SETTINGS_MATCH, - "AdvSceneSwitcher.condition.filter.type.settings"}, + "AdvSceneSwitcher.condition.filter.type.settingsMatch"}, {MacroConditionFilter::Condition::SETTINGS_CHANGED, "AdvSceneSwitcher.condition.filter.type.settingsChanged"}, + {MacroConditionFilter::Condition::INDIVIDUAL_SETTING_MATCH, + "AdvSceneSwitcher.condition.filter.type.individualSettingMatches"}, + {MacroConditionFilter::Condition::INDIVIDUAL_SETTING_CHANGED, + "AdvSceneSwitcher.condition.filter.type.individualSettingChanged"}, }; bool MacroConditionFilter::CheckConditionHelper(const OBSWeakSource &filter) @@ -46,12 +50,26 @@ bool MacroConditionFilter::CheckConditionHelper(const OBSWeakSource &filter) } break; case Condition::SETTINGS_CHANGED: { - std::string settings = GetSourceSettings(_source.GetSource()); + std::string settings = GetSourceSettings(filter); ret = !_currentSettings.empty() && settings != _currentSettings; _currentSettings = settings; SetVariableValue(settings); break; } + case Condition::INDIVIDUAL_SETTING_MATCH: { + std::string value = GetSourceSettingValue(filter, _setting); + ret = _regex.Enabled() ? _regex.Matches(value, _settings) + : value == std::string(_settings); + SetVariableValue(value); + break; + } + case Condition::INDIVIDUAL_SETTING_CHANGED: { + std::string value = GetSourceSettingValue(filter, _setting); + ret = _currentSettingsValue != value; + _currentSettingsValue = value; + SetVariableValue(value); + break; + } default: break; } @@ -85,6 +103,7 @@ bool MacroConditionFilter::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; } @@ -101,6 +120,7 @@ bool MacroConditionFilter::Load(obs_data_t *obj) _regex.CreateBackwardsCompatibleRegex( obs_data_get_bool(obj, "regex")); } + _setting.Load(obj); return true; } @@ -128,7 +148,8 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( _getSettings(new QPushButton(obs_module_text( "AdvSceneSwitcher.condition.filter.getSettings"))), _settings(new VariableTextEdit(this)), - _regex(new RegexConfigWidget(parent)) + _regex(new RegexConfigWidget(parent)), + _settingSelection(new SourceSettingSelection()) { populateConditionSelection(_conditions); auto sources = GetSourcesWithFilterNames(); @@ -149,11 +170,19 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( 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}, {"{{filters}}", _filters}, - {"{{conditions}}", _conditions}, {"{{settings}}", _settings}, - {"{{getSettings}}", _getSettings}, {"{{regex}}", _regex}, + {"{{sources}}", _sources}, + {"{{filters}}", _filters}, + {"{{conditions}}", _conditions}, + {"{{settings}}", _settings}, + {"{{getSettings}}", _getSettings}, + {"{{regex}}", _regex}, + {"{{settingSelection}}", _settingSelection}, + }; auto line1Layout = new QHBoxLayout; line1Layout->setContentsMargins(0, 0, 0, 0); @@ -171,7 +200,7 @@ MacroConditionFilterEdit::MacroConditionFilterEdit( "AdvSceneSwitcher.condition.filter.entry.line3"), line3Layout, widgetPlaceholders); - QVBoxLayout *mainLayout = new QVBoxLayout; + auto mainLayout = new QVBoxLayout; mainLayout->addLayout(line1Layout); mainLayout->addLayout(line2Layout); mainLayout->addLayout(line3Layout); @@ -198,8 +227,13 @@ void MacroConditionFilterEdit::FilterChanged(const FilterSelection &filter) return; } - auto lock = LockContext(); - _entryData->_filter = filter; + { + auto lock = LockContext(); + _entryData->_filter = filter; + } + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _settingSelection->SetSource(filters.empty() ? nullptr : filters.at(0)); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -213,9 +247,7 @@ void MacroConditionFilterEdit::ConditionChanged(int index) auto lock = LockContext(); _entryData->_condition = static_cast(index); - SetSettingsSelectionVisible( - _entryData->_condition == - MacroConditionFilter::Condition::SETTINGS_MATCH); + SetWidgetVisibility(); } void MacroConditionFilterEdit::GetSettingsClicked() @@ -225,12 +257,26 @@ void MacroConditionFilterEdit::GetSettingsClicked() return; } - QString json = FormatJsonString(GetSourceSettings( - _entryData->_filter.GetFilters(_entryData->_source).at(0))); - if (_entryData->_regex.Enabled()) { - json = EscapeForRegex(json); + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + if (filters.empty()) { + _settings->setPlainText(QString("")); + return; } - _settings->setPlainText(json); + + QString value; + if (_entryData->_condition == + MacroConditionFilter::Condition::SETTINGS_MATCH) { + value = FormatJsonString(GetSourceSettings(filters.at(0))); + } else { + value = QString::fromStdString(GetSourceSettingValue( + filters.at(0), _entryData->_setting)); + } + + if (_entryData->_regex.Enabled()) { + value = EscapeForRegex(value); + } + _settings->setPlainText(value); } void MacroConditionFilterEdit::SettingsChanged() @@ -259,11 +305,30 @@ void MacroConditionFilterEdit::RegexChanged(RegexConfig conf) updateGeometry(); } -void MacroConditionFilterEdit::SetSettingsSelectionVisible(bool visible) +void MacroConditionFilterEdit::SettingSelectionChanged( + const SourceSetting &setting) { - _settings->setVisible(visible); - _getSettings->setVisible(visible); - _regex->setVisible(visible); + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_setting = setting; +} + +void MacroConditionFilterEdit::SetWidgetVisibility() +{ + const bool showSettingsControls = + _entryData->_condition == + MacroConditionFilter::Condition::SETTINGS_MATCH || + _entryData->_condition == + MacroConditionFilter::Condition::INDIVIDUAL_SETTING_MATCH; + _settings->setVisible(showSettingsControls); + _getSettings->setVisible(showSettingsControls); + _regex->setVisible(showSettingsControls); + _settingSelection->setVisible( + _entryData->_condition == + MacroConditionFilter::Condition::INDIVIDUAL_SETTING_MATCH); adjustSize(); updateGeometry(); } @@ -279,9 +344,11 @@ void MacroConditionFilterEdit::UpdateEntryData() _conditions->setCurrentIndex(static_cast(_entryData->_condition)); _settings->setPlainText(_entryData->_settings); _regex->SetRegexConfig(_entryData->_regex); - SetSettingsSelectionVisible( - _entryData->_condition == - MacroConditionFilter::Condition::SETTINGS_MATCH); + const auto filters = + _entryData->_filter.GetFilters(_entryData->_source); + _settingSelection->SetSource(filters.empty() ? nullptr : filters.at(0)); + _settingSelection->SetSetting(_entryData->_setting); + SetWidgetVisibility(); adjustSize(); updateGeometry(); diff --git a/src/macro-core/macro-condition-filter.hpp b/src/macro-core/macro-condition-filter.hpp index 64031287..b930dc9c 100644 --- a/src/macro-core/macro-condition-filter.hpp +++ b/src/macro-core/macro-condition-filter.hpp @@ -4,6 +4,7 @@ #include "regex-config.hpp" #include "source-selection.hpp" #include "filter-selection.hpp" +#include "source-setting.hpp" #include #include @@ -29,6 +30,8 @@ public: DISABLED, SETTINGS_MATCH, SETTINGS_CHANGED, + INDIVIDUAL_SETTING_MATCH, + INDIVIDUAL_SETTING_CHANGED, }; SourceSelection _source; @@ -36,11 +39,14 @@ public: Condition _condition = Condition::ENABLED; StringVariable _settings = ""; RegexConfig _regex; + SourceSetting _setting; private: bool CheckConditionHelper(const OBSWeakSource &); std::string _currentSettings; + std::string _currentSettingsValue; + static bool _registered; static const std::string id; }; @@ -68,21 +74,22 @@ private slots: void GetSettingsClicked(); void SettingsChanged(); void RegexChanged(RegexConfig); + void SettingSelectionChanged(const SourceSetting &); signals: void HeaderInfoChanged(const QString &); -protected: +private: + void SetWidgetVisibility(); + SourceSelectionWidget *_sources; FilterSelectionWidget *_filters; QComboBox *_conditions; QPushButton *_getSettings; VariableTextEdit *_settings; RegexConfigWidget *_regex; + SourceSettingSelection *_settingSelection; std::shared_ptr _entryData; - -private: - void SetSettingsSelectionVisible(bool visible); bool _loading = true; };