mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-06-16 13:50:20 -05:00
Add transition option to check for transition source and target scene
This commit is contained in:
parent
f2570e1deb
commit
2d9e6bcaa2
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user