Add preview scene support to scene condition

Existing functionality of the "Studio mode" condition will be hidden and
eventually be removed.
This commit is contained in:
WarmUpTill 2023-08-24 21:24:01 +02:00 committed by WarmUpTill
parent a5050d4810
commit 4d7e2992e5
3 changed files with 85 additions and 13 deletions

View File

@ -170,10 +170,12 @@ AdvSceneSwitcher.condition.cursor.entry.line2="Cursor is currently at{{xPos}}x{{
AdvSceneSwitcher.condition.scene="Scene"
AdvSceneSwitcher.condition.scene.type.current="Current scene is"
AdvSceneSwitcher.condition.scene.type.previous="Previous scene is"
AdvSceneSwitcher.condition.scene.type.preview="Preview scene is"
AdvSceneSwitcher.condition.scene.type.changed="Scene changed"
AdvSceneSwitcher.condition.scene.type.notChanged="Scene has not changed"
AdvSceneSwitcher.condition.scene.type.currentPattern="Current scene matches"
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}}"

View File

@ -16,6 +16,8 @@ const static std::map<MacroConditionScene::Type, std::string> sceneTypes = {
"AdvSceneSwitcher.condition.scene.type.current"},
{MacroConditionScene::Type::PREVIOUS,
"AdvSceneSwitcher.condition.scene.type.previous"},
{MacroConditionScene::Type::PREVIEW,
"AdvSceneSwitcher.condition.scene.type.preview"},
{MacroConditionScene::Type::CHANGED,
"AdvSceneSwitcher.condition.scene.type.changed"},
{MacroConditionScene::Type::NOT_CHANGED,
@ -24,6 +26,8 @@ const static std::map<MacroConditionScene::Type, std::string> sceneTypes = {
"AdvSceneSwitcher.condition.scene.type.currentPattern"},
{MacroConditionScene::Type::PREVIOUS_PATTERN,
"AdvSceneSwitcher.condition.scene.type.previousPattern"},
{MacroConditionScene::Type::PREVIEW_PATTERN,
"AdvSceneSwitcher.condition.scene.type.previewPattern"},
};
static bool sceneNameMatchesRegex(const OBSWeakSource &scene,
@ -79,6 +83,14 @@ bool MacroConditionScene::CheckCondition()
SetVariableValue(GetWeakSourceName(scene));
return scene == _scene.GetScene(false);
}
case Type::PREVIEW: {
OBSSourceAutoRelease source =
obs_frontend_get_current_preview_scene();
OBSWeakSourceAutoRelease scene =
obs_source_get_weak_source(source);
SetVariableValue(GetWeakSourceName(scene));
return scene == _scene.GetScene(false);
}
case Type::CHANGED:
SetVariableValue(GetWeakSourceName(switcher->currentScene));
return sceneChanged;
@ -95,6 +107,14 @@ bool MacroConditionScene::CheckCondition()
SetVariableValue(GetWeakSourceName(scene));
return sceneNameMatchesRegex(scene, _pattern);
}
case Type::PREVIEW_PATTERN: {
OBSSourceAutoRelease source =
obs_frontend_get_current_preview_scene();
OBSWeakSourceAutoRelease scene =
obs_source_get_weak_source(source);
SetVariableValue(GetWeakSourceName(scene));
return sceneNameMatchesRegex(scene.Get(), _pattern);
}
}
return false;
@ -108,6 +128,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);
obs_data_set_int(obj, "version", 1);
return true;
}
@ -124,6 +145,46 @@ bool MacroConditionScene::Load(obs_data_t *obj)
_useTransitionTargetScene =
obs_data_get_bool(obj, "useTransitionTargetScene");
}
// TODO: Remove fallback in future version
if (!obs_data_has_user_value(obj, "version")) {
enum {
CURRENT,
PREVIOUS,
CHANGED,
NOT_CHANGED,
CURRENT_PATTERN,
PREVIOUS_PATTERN,
};
int oldType = obs_data_get_int(obj, "type");
switch (oldType) {
case CURRENT:
_type = Type::CURRENT;
break;
case PREVIOUS:
_type = Type::PREVIOUS;
break;
case CHANGED:
_type = Type::CHANGED;
break;
case NOT_CHANGED:
_type = Type::NOT_CHANGED;
break;
case CURRENT_PATTERN:
_type = Type::CURRENT_PATTERN;
break;
case PREVIOUS_PATTERN:
_type = Type::PREVIOUS_PATTERN;
break;
default:
blog(LOG_WARNING,
"failed to convert scene condition type (%d) for macro %s",
oldType, GetMacro()->Name().c_str());
_type = Type::CURRENT;
break;
}
}
return true;
}
@ -137,8 +198,9 @@ std::string MacroConditionScene::GetShortDesc() const
static inline void populateTypeSelection(QComboBox *list)
{
for (auto entry : sceneTypes) {
list->addItem(obs_module_text(entry.second.c_str()));
for (const auto &[id, name] : sceneTypes) {
list->addItem(obs_module_text(name.c_str()),
static_cast<int>(id));
}
}
@ -199,14 +261,15 @@ void MacroConditionSceneEdit::SceneChanged(const SceneSelection &s)
QString::fromStdString(_entryData->GetShortDesc()));
}
void MacroConditionSceneEdit::TypeChanged(int value)
void MacroConditionSceneEdit::TypeChanged(int index)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_type = static_cast<MacroConditionScene::Type>(value);
_entryData->_type = static_cast<MacroConditionScene::Type>(
_sceneType->itemData(index).toInt());
SetWidgetVisibility();
}
@ -234,7 +297,8 @@ void MacroConditionSceneEdit::SetWidgetVisibility()
{
_scenes->setVisible(
_entryData->_type == MacroConditionScene::Type::CURRENT ||
_entryData->_type == MacroConditionScene::Type::PREVIOUS);
_entryData->_type == MacroConditionScene::Type::PREVIOUS ||
_entryData->_type == MacroConditionScene::Type::PREVIEW);
_useTransitionTargetScene->setVisible(
_entryData->_type == MacroConditionScene::Type::CURRENT ||
_entryData->_type == MacroConditionScene::Type::PREVIOUS ||
@ -246,7 +310,9 @@ void MacroConditionSceneEdit::SetWidgetVisibility()
_entryData->_type ==
MacroConditionScene::Type::CURRENT_PATTERN ||
_entryData->_type ==
MacroConditionScene::Type::PREVIOUS_PATTERN);
MacroConditionScene::Type::PREVIOUS_PATTERN ||
_entryData->_type ==
MacroConditionScene::Type::PREVIEW_PATTERN);
if (_entryData->_type == MacroConditionScene::Type::PREVIOUS ||
_entryData->_type == MacroConditionScene::Type::PREVIOUS_PATTERN) {
@ -259,6 +325,7 @@ void MacroConditionSceneEdit::SetWidgetVisibility()
"AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour"));
}
adjustSize();
updateGeometry();
}
void MacroConditionSceneEdit::UpdateEntryData()
@ -268,7 +335,8 @@ void MacroConditionSceneEdit::UpdateEntryData()
}
_scenes->SetScene(_entryData->_scene);
_sceneType->setCurrentIndex(static_cast<int>(_entryData->_type));
_sceneType->setCurrentIndex(
_sceneType->findData(static_cast<int>(_entryData->_type)));
_pattern->setText(QString::fromStdString(_entryData->_pattern));
_useTransitionTargetScene->setChecked(
_entryData->_useTransitionTargetScene);

View File

@ -23,12 +23,14 @@ public:
}
enum class Type {
CURRENT,
PREVIOUS,
CHANGED,
NOT_CHANGED,
CURRENT_PATTERN,
PREVIOUS_PATTERN,
CURRENT = 10,
PREVIOUS = 20,
PREVIEW = 30,
CHANGED = 40,
NOT_CHANGED = 50,
CURRENT_PATTERN = 60,
PREVIOUS_PATTERN = 70,
PREVIEW_PATTERN = 80,
};
SceneSelection _scene;