Add transition option to check for transition source and target scene

This commit is contained in:
WarmUpTill
2021-11-24 20:53:26 +01:00
committed by WarmUpTill
parent f2570e1deb
commit 2d9e6bcaa2
3 changed files with 62 additions and 3 deletions

View File

@@ -19,6 +19,10 @@ static std::map<TransitionCondition, std::string> filterConditionTypes = {
"AdvSceneSwitcher.condition.transition.type.started"},
{TransitionCondition::ENDED,
"AdvSceneSwitcher.condition.transition.type.ended"},
{TransitionCondition::TRANSITION_SOURCE,
"AdvSceneSwitcher.condition.transition.type.transitionSource"},
{TransitionCondition::TRANSITION_TARGET,
"AdvSceneSwitcher.condition.transition.type.transitionTarget"},
};
bool isCurrentTransition(OBSWeakSource &t)
@@ -46,15 +50,26 @@ bool anySceneTransitionStarted()
return ret;
}
bool isTargetScene(OBSWeakSource &target)
{
auto source = obs_frontend_get_current_scene();
auto targetScene = obs_source_get_weak_source(source);
bool ret = target == targetScene;
obs_weak_source_release(targetScene);
obs_source_release(source);
return ret;
}
bool MacroConditionTransition::CheckCondition()
{
bool anyTransitionEnded = _lastTransitionEndTime !=
switcher->lastTransitionEndTime;
bool anyTransitionStarted = anySceneTransitionStarted();
bool transitionStarted = false;
bool transitionEnded = false;
if (_transition.GetType() == TransitionSelectionType::ANY) {
transitionStarted = anySceneTransitionStarted();
transitionStarted = anyTransitionStarted;
transitionEnded = anyTransitionEnded;
} else {
transitionStarted = _started;
@@ -78,6 +93,15 @@ bool MacroConditionTransition::CheckCondition()
case TransitionCondition::ENDED:
ret = transitionEnded;
break;
case TransitionCondition::TRANSITION_SOURCE:
ret = anyTransitionStarted &&
_scene.GetScene() == switcher->currentScene;
break;
case TransitionCondition::TRANSITION_TARGET: {
auto scene = _scene.GetScene();
ret = anyTransitionStarted && isTargetScene(scene);
break;
}
default:
break;
}
@@ -132,6 +156,7 @@ bool MacroConditionTransition::Save(obs_data_t *obj)
MacroCondition::Save(obj);
obs_data_set_int(obj, "condition", static_cast<int>(_condition));
_transition.Save(obj);
_scene.Save(obj);
_duration.Save(obj);
return true;
}
@@ -142,6 +167,7 @@ bool MacroConditionTransition::Load(obs_data_t *obj)
_condition = static_cast<TransitionCondition>(
obs_data_get_int(obj, "condition"));
_transition.Load(obj);
_scene.Load(obj);
_duration.Load(obj);
ConnectToTransitionSignals();
return true;
@@ -149,7 +175,13 @@ bool MacroConditionTransition::Load(obs_data_t *obj)
std::string MacroConditionTransition::GetShortDesc()
{
if (_condition == TransitionCondition::CURRENT ||
_condition == TransitionCondition::DURATION ||
_condition == TransitionCondition::STARTED ||
_condition == TransitionCondition::ENDED) {
}
return _transition.ToString();
return "";
}
static inline void populateConditionSelection(QComboBox *list)
@@ -165,6 +197,7 @@ MacroConditionTransitionEdit::MacroConditionTransitionEdit(
{
_conditions = new QComboBox();
_transitions = new TransitionSelectionWidget(this, true, true);
_scenes = new SceneSelectionWidget(this, false, true, true);
_duration = new DurationSelection(this, false);
_durationSuffix = new QLabel(obs_module_text(
"AdvSceneSwitcher.condition.transition.durationSuffix"));
@@ -177,6 +210,8 @@ MacroConditionTransitionEdit::MacroConditionTransitionEdit(
SIGNAL(TransitionChanged(const TransitionSelection &)),
this,
SLOT(TransitionChanged(const TransitionSelection &)));
QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)),
this, SLOT(SceneChanged(const SceneSelection &)));
QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this,
SLOT(DurationChanged(double)));
@@ -184,6 +219,7 @@ MacroConditionTransitionEdit::MacroConditionTransitionEdit(
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{conditions}}", _conditions},
{"{{transitions}}", _transitions},
{"{{scenes}}", _scenes},
{"{{duration}}", _duration},
{"{{durationSuffix}}", _durationSuffix},
};
@@ -228,6 +264,16 @@ void MacroConditionTransitionEdit::TransitionChanged(
QString::fromStdString(_entryData->GetShortDesc()));
}
void MacroConditionTransitionEdit::SceneChanged(const SceneSelection &s)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_scene = s;
}
void MacroConditionTransitionEdit::DurationChanged(double seconds)
{
if (_loading || !_entryData) {
@@ -248,6 +294,10 @@ void MacroConditionTransitionEdit::SetWidgetVisibility()
_entryData->_condition == TransitionCondition::CURRENT ||
_entryData->_condition == TransitionCondition::STARTED ||
_entryData->_condition == TransitionCondition::ENDED);
_scenes->setVisible(_entryData->_condition ==
TransitionCondition::TRANSITION_SOURCE ||
_entryData->_condition ==
TransitionCondition::TRANSITION_TARGET);
_duration->setVisible(_entryData->_condition ==
TransitionCondition::DURATION);
_durationSuffix->setVisible(_entryData->_condition ==
@@ -268,5 +318,6 @@ void MacroConditionTransitionEdit::UpdateEntryData()
SetWidgetVisibility();
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
_transitions->SetTransition(_entryData->_transition);
_scenes->SetScene(_entryData->_scene);
_duration->SetDuration(_entryData->_duration);
}