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

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

View File

@ -2,6 +2,7 @@
#include "macro.hpp"
#include "duration-control.hpp"
#include "transition-selection.hpp"
#include "scene-selection.hpp"
#include <QWidget>
#include <QComboBox>
@ -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<MacroConditionTransition> _entryData;

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);
}