Add temp variable support to scene condition

This commit is contained in:
WarmUpTill 2023-11-04 23:01:23 +01:00 committed by WarmUpTill
parent c16a7b93ea
commit 1e178f4223
3 changed files with 73 additions and 18 deletions

View File

@ -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."

View File

@ -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<MacroConditionScene::Type>(
_sceneType->itemData(index).toInt());
_entryData->SetType(static_cast<MacroConditionScene::Type>(
_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<int>(_entryData->_type)));
_sceneType->findData(static_cast<int>(_entryData->GetType())));
_pattern->setText(QString::fromStdString(_entryData->_pattern));
_useTransitionTargetScene->setChecked(
_entryData->_useTransitionTargetScene);

View File

@ -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;