From 0906c6bb3fd14e354bce2e9d8ab0f5a5adb1ece9 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 30 Aug 2024 19:36:09 +0200 Subject: [PATCH] Add regex settings option to scene name pattern check --- data/locale/de-DE.ini | 2 - data/locale/en-US.ini | 2 +- data/locale/es-ES.ini | 2 - data/locale/pt-BR.ini | 2 - data/locale/tr-TR.ini | 2 - data/locale/zh-CN.ini | 2 - plugins/base/macro-condition-scene.cpp | 72 ++++++++++++-------------- plugins/base/macro-condition-scene.hpp | 4 ++ 8 files changed, 39 insertions(+), 49 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 69d03bdd..41d9978d 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -142,8 +142,6 @@ AdvSceneSwitcher.condition.scene.type.currentPattern="Aktuelle Szene entspricht" AdvSceneSwitcher.condition.scene.type.previousPattern="Vorherige Szene entspricht" AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="Während des Übergangs die Ziel-Szene überprüfen" AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="Während des Übergangs die Quell-Szene überprüfen" -AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}" -AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}" AdvSceneSwitcher.condition.window="Fenster" AdvSceneSwitcher.condition.file="Datei" AdvSceneSwitcher.condition.file.type.match="entspricht" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 3c640d80..16061c45 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -290,7 +290,7 @@ AdvSceneSwitcher.condition.scene.type.previousPattern="Previous scene matches" AdvSceneSwitcher.condition.scene.type.previewPattern="Preview scene matches" AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="During transition check for transition target scene" AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="During transition check for transition source scene" -AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}" +AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}{{regex}}" AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}" AdvSceneSwitcher.condition.window="Window" AdvSceneSwitcher.condition.window.entry.window="{{checkTitle}}Window title matches{{windowRegex}}{{windows}}" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 46a7fb02..a313835d 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -117,8 +117,6 @@ AdvSceneSwitcher.condition.scene.type.changed="Escena cambiada" AdvSceneSwitcher.condition.scene.type.notChanged="La escena no ha cambiado" AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="Durante la transición, verifique la escena de destino de la transición" AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="Durante la transición, verifique la escena de origen de la transición" -AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}" -AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}" AdvSceneSwitcher.condition.window="Ventana" AdvSceneSwitcher.condition.file="Archivo" AdvSceneSwitcher.condition.file.entry.line1="Contenido de{{fileType}}{{filePath}}{{conditions}}{{useRegex}}" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index 6eca9276..57963c89 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -284,8 +284,6 @@ AdvSceneSwitcher.condition.scene.type.previousPattern="A cena anterior correspon AdvSceneSwitcher.condition.scene.type.previewPattern="A cena de pré-visualização corresponde" AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="Durante a transição, verificar a cena de destino da transição" AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="Durante a transição, verificar a cena de origem da transição" -AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}" -AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}" AdvSceneSwitcher.condition.window="Janela" AdvSceneSwitcher.condition.window.entry.window="{{checkTitle}}O título da janela corresponde{{windowRegex}}{{windows}}" AdvSceneSwitcher.condition.window.entry.fullscreen="{{fullscreen}}A janela está em tela cheia" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 98cd45ac..f089e212 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -107,8 +107,6 @@ AdvSceneSwitcher.condition.scene.type.previous="Önceki Sahne" AdvSceneSwitcher.condition.scene.type.changed="Sahne değişti" AdvSceneSwitcher.condition.scene.type.notChanged="Sahne değişmedi" AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="Geçiş hedefi sahnesi için geçiş kontrolü sırasında" -AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}" -AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}" AdvSceneSwitcher.condition.window="Pencere" AdvSceneSwitcher.condition.file="Dosya" AdvSceneSwitcher.condition.file.entry.line1="İçerik{{fileType}}{{filePath}}{{conditions}}{{useRegex}}" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index a51795e2..c5706419 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -159,8 +159,6 @@ AdvSceneSwitcher.condition.scene.type.currentPattern="当前场景匹配" AdvSceneSwitcher.condition.scene.type.previousPattern="上一个场景匹配" AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="在转场过程中检查转场源场景" AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="在转场过程中检查转场源场景" -AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}}{{scenes}}{{pattern}}" -AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}" AdvSceneSwitcher.condition.window="窗口" AdvSceneSwitcher.condition.window.entry.window="{{checkTitle}}窗口标题匹配{{windowRegex}}{{windows}}" AdvSceneSwitcher.condition.window.entry.fullscreen="{{fullscreen}}窗口为全屏" diff --git a/plugins/base/macro-condition-scene.cpp b/plugins/base/macro-condition-scene.cpp index a1e50517..c0e8de17 100644 --- a/plugins/base/macro-condition-scene.cpp +++ b/plugins/base/macro-condition-scene.cpp @@ -35,17 +35,10 @@ const static std::map sceneTypes = { }; static bool sceneNameMatchesRegex(const OBSWeakSource &scene, + const RegexConfig ®ex, const std::string &pattern) { - auto regex = QRegularExpression(QRegularExpression::anchoredPattern( - QString::fromStdString(pattern))); - if (!regex.isValid()) { - return false; - } - - auto match = - regex.match(QString::fromStdString(GetWeakSourceName(scene))); - return match.hasMatch(); + return regex.Matches(GetWeakSourceName(scene), pattern); } static OBSWeakSource getCurrentSceneHelper(bool useTransitionTargetScene) @@ -111,13 +104,13 @@ bool MacroConditionScene::CheckCondition() auto scene = getCurrentSceneHelper(_useTransitionTargetScene); SetVariableValue(GetWeakSourceName(scene)); SetTempVarValue("current", GetWeakSourceName(scene)); - return sceneNameMatchesRegex(scene, _pattern); + return sceneNameMatchesRegex(scene, _regex, _pattern); } case Type::PREVIOUS_PATTERN: { auto scene = getPreviousSceneHelper(_useTransitionTargetScene); SetVariableValue(GetWeakSourceName(scene)); SetTempVarValue("previous", GetWeakSourceName(scene)); - return sceneNameMatchesRegex(scene, _pattern); + return sceneNameMatchesRegex(scene, _regex, _pattern); } case Type::PREVIEW_PATTERN: { OBSSourceAutoRelease source = @@ -126,7 +119,7 @@ bool MacroConditionScene::CheckCondition() obs_source_get_weak_source(source); SetVariableValue(GetWeakSourceName(scene)); SetTempVarValue("preview", GetWeakSourceName(scene)); - return sceneNameMatchesRegex(scene.Get(), _pattern); + return sceneNameMatchesRegex(scene.Get(), _regex, _pattern); } } @@ -141,6 +134,7 @@ bool MacroConditionScene::Save(obs_data_t *obj) const obs_data_set_string(obj, "pattern", _pattern.c_str()); obs_data_set_bool(obj, "useTransitionTargetScene", _useTransitionTargetScene); + _regex.Save(obj); obs_data_set_int(obj, "version", 1); return true; } @@ -151,6 +145,9 @@ bool MacroConditionScene::Load(obs_data_t *obj) _scene.Load(obj); _type = static_cast(obs_data_get_int(obj, "type")); _pattern = obs_data_get_string(obj, "pattern"); + _regex.Load(obj); + _regex.SetEnabled(true); + if (obs_data_has_user_value(obj, "waitForTransition")) { _useTransitionTargetScene = !obs_data_get_bool(obj, "waitForTransition"); @@ -198,6 +195,7 @@ bool MacroConditionScene::Load(obs_data_t *obj) break; } } + return true; } @@ -260,7 +258,8 @@ MacroConditionSceneEdit::MacroConditionSceneEdit( _sceneType(new QComboBox()), _pattern(new QLineEdit()), _useTransitionTargetScene(new QCheckBox(obs_module_text( - "AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour"))) + "AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour"))), + _regex(new RegexConfigWidget(this, false)) { QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)), this, SLOT(SceneChanged(const SceneSelection &))); @@ -270,6 +269,9 @@ MacroConditionSceneEdit::MacroConditionSceneEdit( SLOT(PatternChanged())); QWidget::connect(_useTransitionTargetScene, SIGNAL(stateChanged(int)), this, SLOT(UseTransitionTargetSceneChanged(int))); + QWidget::connect(_regex, + SIGNAL(RegexConfigChanged(const RegexConfig &)), this, + SLOT(RegexChanged(const RegexConfig &))); populateTypeSelection(_sceneType); @@ -278,16 +280,17 @@ MacroConditionSceneEdit::MacroConditionSceneEdit( {"{{sceneType}}", _sceneType}, {"{{pattern}}", _pattern}, {"{{useTransitionTargetScene}}", _useTransitionTargetScene}, + {"{{regex}}", _regex}, }; - QHBoxLayout *line1Layout = new QHBoxLayout; + auto line1Layout = new QHBoxLayout; PlaceWidgets( obs_module_text("AdvSceneSwitcher.condition.scene.entry.line1"), line1Layout, widgetPlaceholders); - QHBoxLayout *line2Layout = new QHBoxLayout; + auto line2Layout = new QHBoxLayout; PlaceWidgets( obs_module_text("AdvSceneSwitcher.condition.scene.entry.line2"), line2Layout, widgetPlaceholders); - QVBoxLayout *mainLayout = new QVBoxLayout; + auto mainLayout = new QVBoxLayout; mainLayout->addLayout(line1Layout); mainLayout->addLayout(line2Layout); setLayout(mainLayout); @@ -299,11 +302,7 @@ MacroConditionSceneEdit::MacroConditionSceneEdit( void MacroConditionSceneEdit::SceneChanged(const SceneSelection &s) { - if (_loading || !_entryData) { - return; - } - - auto lock = LockContext(); + GUARD_LOADING_AND_LOCK(); _entryData->_scene = s; emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); @@ -311,11 +310,7 @@ void MacroConditionSceneEdit::SceneChanged(const SceneSelection &s) void MacroConditionSceneEdit::TypeChanged(int index) { - if (_loading || !_entryData) { - return; - } - - auto lock = LockContext(); + GUARD_LOADING_AND_LOCK(); _entryData->SetType(static_cast( _sceneType->itemData(index).toInt())); SetWidgetVisibility(); @@ -323,24 +318,22 @@ void MacroConditionSceneEdit::TypeChanged(int index) void MacroConditionSceneEdit::PatternChanged() { - if (_loading || !_entryData) { - return; - } - - auto lock = LockContext(); + GUARD_LOADING_AND_LOCK(); _entryData->_pattern = _pattern->text().toStdString(); } void MacroConditionSceneEdit::UseTransitionTargetSceneChanged(int state) { - if (_loading || !_entryData) { - return; - } - - auto lock = LockContext(); + GUARD_LOADING_AND_LOCK(); _entryData->_useTransitionTargetScene = state; } +void MacroConditionSceneEdit::RegexChanged(const RegexConfig ®ex) +{ + GUARD_LOADING_AND_LOCK(); + _entryData->_regex = regex; +} + void MacroConditionSceneEdit::SetWidgetVisibility() { _scenes->setVisible( @@ -354,13 +347,15 @@ void MacroConditionSceneEdit::SetWidgetVisibility() MacroConditionScene::Type::CURRENT_PATTERN || _entryData->GetType() == MacroConditionScene::Type::PREVIOUS_PATTERN); - _pattern->setVisible( + const bool isUsingPattern = _entryData->GetType() == MacroConditionScene::Type::CURRENT_PATTERN || _entryData->GetType() == MacroConditionScene::Type::PREVIOUS_PATTERN || _entryData->GetType() == - MacroConditionScene::Type::PREVIEW_PATTERN); + MacroConditionScene::Type::PREVIEW_PATTERN; + _pattern->setVisible(isUsingPattern); + _regex->setVisible(isUsingPattern); if (_entryData->GetType() == MacroConditionScene::Type::PREVIOUS || _entryData->GetType() == @@ -390,6 +385,7 @@ void MacroConditionSceneEdit::UpdateEntryData() _pattern->setText(QString::fromStdString(_entryData->_pattern)); _useTransitionTargetScene->setChecked( _entryData->_useTransitionTargetScene); + _regex->SetRegexConfig(_entryData->_regex); SetWidgetVisibility(); } diff --git a/plugins/base/macro-condition-scene.hpp b/plugins/base/macro-condition-scene.hpp index 8b639950..997bed87 100644 --- a/plugins/base/macro-condition-scene.hpp +++ b/plugins/base/macro-condition-scene.hpp @@ -1,6 +1,7 @@ #pragma once #include "macro-condition-edit.hpp" #include "scene-selection.hpp" +#include "regex-config.hpp" #include #include @@ -37,6 +38,7 @@ public: SceneSelection _scene; std::string _pattern = ".*Scene.*"; + RegexConfig _regex = RegexConfig(true); // During a transition "current" scene could either stand for the scene // being transitioned to or the scene still being transitioned away // from. @@ -72,6 +74,7 @@ private slots: void TypeChanged(int value); void PatternChanged(); void UseTransitionTargetSceneChanged(int state); + void RegexChanged(const RegexConfig &); signals: void HeaderInfoChanged(const QString &); @@ -80,6 +83,7 @@ protected: QComboBox *_sceneType; QLineEdit *_pattern; QCheckBox *_useTransitionTargetScene; + RegexConfigWidget *_regex; std::shared_ptr _entryData; private: