From 1e178f42233a10e2ef9c7835501f875ca91df9f3 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 4 Nov 2023 23:01:23 +0100 Subject: [PATCH] Add temp variable support to scene condition --- data/locale/en-US.ini | 4 ++ src/macro-core/macro-condition-scene.cpp | 81 +++++++++++++++++++----- src/macro-core/macro-condition-scene.hpp | 6 +- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index b4e71330..da26be48 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -1411,6 +1411,10 @@ AdvSceneSwitcher.tempVar.audio.sync_offset="Source audio sync offset" AdvSceneSwitcher.tempVar.audio.monitor="Source audio monitor type" AdvSceneSwitcher.tempVar.audio.balance="Source audio balance" +AdvSceneSwitcher.tempVar.scene.current="Current scene" +AdvSceneSwitcher.tempVar.scene.previous="Previous scene" +AdvSceneSwitcher.tempVar.scene.preview="Preview scene" + AdvSceneSwitcher.tempVar.window.window="Window title" AdvSceneSwitcher.tempVar.window.window.description="The window title of the current foreground window." diff --git a/src/macro-core/macro-condition-scene.cpp b/src/macro-core/macro-condition-scene.cpp index da96962c..9613aaa3 100644 --- a/src/macro-core/macro-condition-scene.cpp +++ b/src/macro-core/macro-condition-scene.cpp @@ -76,11 +76,13 @@ bool MacroConditionScene::CheckCondition() case Type::CURRENT: { auto scene = getCurrentSceneHelper(_useTransitionTargetScene); SetVariableValue(GetWeakSourceName(scene)); + SetTempVarValue("current", GetWeakSourceName(scene)); return scene == _scene.GetScene(false); } case Type::PREVIOUS: { auto scene = getPreviousSceneHelper(_useTransitionTargetScene); SetVariableValue(GetWeakSourceName(scene)); + SetTempVarValue("previous", GetWeakSourceName(scene)); return scene == _scene.GetScene(false); } case Type::PREVIEW: { @@ -89,22 +91,29 @@ bool MacroConditionScene::CheckCondition() OBSWeakSourceAutoRelease scene = obs_source_get_weak_source(source); SetVariableValue(GetWeakSourceName(scene)); + SetTempVarValue("preview", GetWeakSourceName(scene)); return scene == _scene.GetScene(false); } case Type::CHANGED: SetVariableValue(GetWeakSourceName(switcher->currentScene)); + SetTempVarValue("current", + GetWeakSourceName(switcher->currentScene)); return sceneChanged; case Type::NOT_CHANGED: SetVariableValue(GetWeakSourceName(switcher->currentScene)); + SetTempVarValue("current", + GetWeakSourceName(switcher->currentScene)); return !sceneChanged; case Type::CURRENT_PATTERN: { auto scene = getCurrentSceneHelper(_useTransitionTargetScene); SetVariableValue(GetWeakSourceName(scene)); + SetTempVarValue("current", GetWeakSourceName(scene)); return sceneNameMatchesRegex(scene, _pattern); } case Type::PREVIOUS_PATTERN: { auto scene = getPreviousSceneHelper(_useTransitionTargetScene); SetVariableValue(GetWeakSourceName(scene)); + SetTempVarValue("previous", GetWeakSourceName(scene)); return sceneNameMatchesRegex(scene, _pattern); } case Type::PREVIEW_PATTERN: { @@ -113,6 +122,7 @@ bool MacroConditionScene::CheckCondition() OBSWeakSourceAutoRelease scene = obs_source_get_weak_source(source); SetVariableValue(GetWeakSourceName(scene)); + SetTempVarValue("preview", GetWeakSourceName(scene)); return sceneNameMatchesRegex(scene.Get(), _pattern); } } @@ -196,6 +206,41 @@ std::string MacroConditionScene::GetShortDesc() const return ""; } +void MacroConditionScene::SetupTempVars() +{ + MacroCondition::SetupTempVars(); + switch (_type) { + case Type::CURRENT: + case Type::CHANGED: + case Type::NOT_CHANGED: + case Type::CURRENT_PATTERN: + AddTempvar("current", + obs_module_text( + "AdvSceneSwitcher.tempVar.scene.current")); + break; + case Type::PREVIOUS: + case Type::PREVIOUS_PATTERN: + AddTempvar("previous", + obs_module_text( + "AdvSceneSwitcher.tempVar.scene.previous")); + break; + case Type::PREVIEW: + case Type::PREVIEW_PATTERN: + AddTempvar("preview", + obs_module_text( + "AdvSceneSwitcher.tempVar.scene.preview")); + break; + default: + break; + } +} + +void MacroConditionScene::SetType(const Type &type) +{ + _type = type; + SetupTempVars(); +} + static inline void populateTypeSelection(QComboBox *list) { for (const auto &[id, name] : sceneTypes) { @@ -268,8 +313,8 @@ void MacroConditionSceneEdit::TypeChanged(int index) } auto lock = LockContext(); - _entryData->_type = static_cast( - _sceneType->itemData(index).toInt()); + _entryData->SetType(static_cast( + _sceneType->itemData(index).toInt())); SetWidgetVisibility(); } @@ -296,31 +341,33 @@ void MacroConditionSceneEdit::UseTransitionTargetSceneChanged(int state) void MacroConditionSceneEdit::SetWidgetVisibility() { _scenes->setVisible( - _entryData->_type == MacroConditionScene::Type::CURRENT || - _entryData->_type == MacroConditionScene::Type::PREVIOUS || - _entryData->_type == MacroConditionScene::Type::PREVIEW); + _entryData->GetType() == MacroConditionScene::Type::CURRENT || + _entryData->GetType() == MacroConditionScene::Type::PREVIOUS || + _entryData->GetType() == MacroConditionScene::Type::PREVIEW); _useTransitionTargetScene->setVisible( - _entryData->_type == MacroConditionScene::Type::CURRENT || - _entryData->_type == MacroConditionScene::Type::PREVIOUS || - _entryData->_type == + _entryData->GetType() == MacroConditionScene::Type::CURRENT || + _entryData->GetType() == MacroConditionScene::Type::PREVIOUS || + _entryData->GetType() == MacroConditionScene::Type::CURRENT_PATTERN || - _entryData->_type == + _entryData->GetType() == MacroConditionScene::Type::PREVIOUS_PATTERN); _pattern->setVisible( - _entryData->_type == + _entryData->GetType() == MacroConditionScene::Type::CURRENT_PATTERN || - _entryData->_type == + _entryData->GetType() == MacroConditionScene::Type::PREVIOUS_PATTERN || - _entryData->_type == + _entryData->GetType() == MacroConditionScene::Type::PREVIEW_PATTERN); - if (_entryData->_type == MacroConditionScene::Type::PREVIOUS || - _entryData->_type == MacroConditionScene::Type::PREVIOUS_PATTERN) { + if (_entryData->GetType() == MacroConditionScene::Type::PREVIOUS || + _entryData->GetType() == + MacroConditionScene::Type::PREVIOUS_PATTERN) { _useTransitionTargetScene->setText(obs_module_text( "AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour")); } - if (_entryData->_type == MacroConditionScene::Type::CURRENT || - _entryData->_type == MacroConditionScene::Type::CURRENT_PATTERN) { + if (_entryData->GetType() == MacroConditionScene::Type::CURRENT || + _entryData->GetType() == + MacroConditionScene::Type::CURRENT_PATTERN) { _useTransitionTargetScene->setText(obs_module_text( "AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour")); } @@ -336,7 +383,7 @@ void MacroConditionSceneEdit::UpdateEntryData() _scenes->SetScene(_entryData->_scene); _sceneType->setCurrentIndex( - _sceneType->findData(static_cast(_entryData->_type))); + _sceneType->findData(static_cast(_entryData->GetType()))); _pattern->setText(QString::fromStdString(_entryData->_pattern)); _useTransitionTargetScene->setChecked( _entryData->_useTransitionTargetScene); diff --git a/src/macro-core/macro-condition-scene.hpp b/src/macro-core/macro-condition-scene.hpp index 2651d7d6..8b639950 100644 --- a/src/macro-core/macro-condition-scene.hpp +++ b/src/macro-core/macro-condition-scene.hpp @@ -32,9 +32,10 @@ public: PREVIOUS_PATTERN = 70, PREVIEW_PATTERN = 80, }; + void SetType(const Type &); + Type GetType() const { return _type; } SceneSelection _scene; - Type _type = Type::CURRENT; std::string _pattern = ".*Scene.*"; // During a transition "current" scene could either stand for the scene // being transitioned to or the scene still being transitioned away @@ -42,6 +43,9 @@ public: bool _useTransitionTargetScene = false; private: + void SetupTempVars(); + + Type _type = Type::CURRENT; std::chrono::high_resolution_clock::time_point _lastSceneChangeTime{}; static bool _registered; static const std::string id;