From 2d9e6bcaa2ac63a9c11f5bd9f10c763e436987a2 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 24 Nov 2021 20:53:26 +0100 Subject: [PATCH] Add transition option to check for transition source and target scene --- data/locale/en-US.ini | 6 ++- src/headers/macro-condition-transition.hpp | 6 +++ src/macro-condition-transition.cpp | 53 +++++++++++++++++++++- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index d2ddb7d2..2943de39 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -229,10 +229,12 @@ AdvSceneSwitcher.condition.sceneTransform.entry.line3="{{regex}} {{getSettings}} AdvSceneSwitcher.condition.transition="Transition" AdvSceneSwitcher.condition.transition.type.current="Current transition type is" AdvSceneSwitcher.condition.transition.type.duration="Current transition duration is" -AdvSceneSwitcher.condition.transition.type.started="Transition active" +AdvSceneSwitcher.condition.transition.type.started="Transition started" AdvSceneSwitcher.condition.transition.type.ended="Transition ended" +AdvSceneSwitcher.condition.transition.type.transitionSource="Transitioning from" +AdvSceneSwitcher.condition.transition.type.transitionTarget="Transitioning to" AdvSceneSwitcher.condition.transition.durationSuffix="seconds" -AdvSceneSwitcher.condition.transition.entry="{{conditions}}{{transitions}}{{duration}}{{durationSuffix}}" +AdvSceneSwitcher.condition.transition.entry="{{conditions}}{{transitions}}{{scenes}}{{duration}}{{durationSuffix}}" AdvSceneSwitcher.condition.sceneVisibility="Scene item visibility" AdvSceneSwitcher.condition.sceneVisibility.type.shown="Shown" AdvSceneSwitcher.condition.sceneVisibility.type.hidden="Hidden" diff --git a/src/headers/macro-condition-transition.hpp b/src/headers/macro-condition-transition.hpp index 23ab0da9..20c21f69 100644 --- a/src/headers/macro-condition-transition.hpp +++ b/src/headers/macro-condition-transition.hpp @@ -2,6 +2,7 @@ #include "macro.hpp" #include "duration-control.hpp" #include "transition-selection.hpp" +#include "scene-selection.hpp" #include #include @@ -11,6 +12,8 @@ enum class TransitionCondition { DURATION, STARTED, ENDED, + TRANSITION_SOURCE, + TRANSITION_TARGET, }; class MacroConditionTransition : public MacroCondition { @@ -29,6 +32,7 @@ public: TransitionCondition _condition = TransitionCondition::CURRENT; TransitionSelection _transition; + SceneSelection _scene; Duration _duration; private: @@ -62,6 +66,7 @@ public: private slots: void ConditionChanged(int cond); void TransitionChanged(const TransitionSelection &); + void SceneChanged(const SceneSelection &); void DurationChanged(double seconds); signals: void HeaderInfoChanged(const QString &); @@ -69,6 +74,7 @@ signals: protected: QComboBox *_conditions; TransitionSelectionWidget *_transitions; + SceneSelectionWidget *_scenes; DurationSelection *_duration; QLabel *_durationSuffix; std::shared_ptr _entryData; diff --git a/src/macro-condition-transition.cpp b/src/macro-condition-transition.cpp index 4f8a42c7..8b189609 100644 --- a/src/macro-condition-transition.cpp +++ b/src/macro-condition-transition.cpp @@ -19,6 +19,10 @@ static std::map 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(_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( 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 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 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(_entryData->_condition)); _transitions->SetTransition(_entryData->_transition); + _scenes->SetScene(_entryData->_scene); _duration->SetDuration(_entryData->_duration); }