Add wait for transition to complete option for currrent scene check

Previous behaviour was to always wait for the transition to complete, as
switcher->currentScene is only updated on
OBS_FRONTEND_EVENT_SCENE_CHANGED.
This commit is contained in:
WarmUpTill 2021-10-19 21:57:04 +02:00 committed by WarmUpTill
parent 8ff50056f0
commit d743260ca8
3 changed files with 42 additions and 2 deletions

View File

@ -97,7 +97,8 @@ AdvSceneSwitcher.condition.scene.type.current="Current scene is"
AdvSceneSwitcher.condition.scene.type.previous="Previous scene is"
AdvSceneSwitcher.condition.scene.type.changed="Scene chagned"
AdvSceneSwitcher.condition.scene.type.notChanged="Scene has not changed"
AdvSceneSwitcher.condition.scene.entry="{{sceneType}} {{scenes}}"
AdvSceneSwitcher.condition.scene.waitForTransition="Wait for transition to complete"
AdvSceneSwitcher.condition.scene.entry="{{sceneType}} {{scenes}} {{waitForTransition}}"
AdvSceneSwitcher.condition.window="Window"
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} exist and ..."
AdvSceneSwitcher.condition.window.entry.line2="... is {{fullscreen}} fullscreen {{maximized}} maximized {{focused}} focused {{windowFocusChanged}} foreground window changed"

View File

@ -4,6 +4,7 @@
#include <QWidget>
#include <QComboBox>
#include <QCheckBox>
enum class SceneType {
CURRENT,
@ -24,6 +25,7 @@ public:
return std::make_shared<MacroConditionScene>();
}
bool _waitForTransition = false;
SceneSelection _scene;
SceneType _type;
@ -52,12 +54,14 @@ public:
private slots:
void SceneChanged(const SceneSelection &);
void TypeChanged(int value);
void WaitForTransitionChanged(int state);
signals:
void HeaderInfoChanged(const QString &);
protected:
SceneSelectionWidget *_scenes;
QComboBox *_sceneType;
QCheckBox *_waitForTransition;
std::shared_ptr<MacroConditionScene> _entryData;
private:

View File

@ -28,7 +28,18 @@ bool MacroConditionScene::CheckCondition()
switch (_type) {
case SceneType::CURRENT:
return switcher->currentScene == _scene.GetScene(false);
if (_waitForTransition) {
return switcher->currentScene == _scene.GetScene(false);
} else {
bool match = false;
auto current = obs_frontend_get_current_scene();
auto weak = obs_source_get_weak_source(current);
match = weak == _scene.GetScene(false);
obs_weak_source_release(weak);
obs_source_release(current);
return match;
}
case SceneType::PREVIOUS:
return switcher->previousScene == _scene.GetScene(false);
case SceneType::CHANGED:
@ -47,6 +58,7 @@ bool MacroConditionScene::Save(obs_data_t *obj)
MacroCondition::Save(obj);
_scene.Save(obj);
obs_data_set_int(obj, "type", static_cast<int>(_type));
obs_data_set_bool(obj, "waitForTransition", _waitForTransition);
return true;
}
@ -55,6 +67,12 @@ bool MacroConditionScene::Load(obs_data_t *obj)
MacroCondition::Load(obj);
_scene.Load(obj);
_type = static_cast<SceneType>(obs_data_get_int(obj, "type"));
if (!obs_data_has_user_value(obj, "waitForTransition")) {
_waitForTransition = true;
} else {
_waitForTransition =
obs_data_get_bool(obj, "waitForTransition");
}
return true;
}
@ -76,11 +94,15 @@ MacroConditionSceneEdit::MacroConditionSceneEdit(
{
_scenes = new SceneSelectionWidget(window(), false, false, false);
_sceneType = new QComboBox();
_waitForTransition = new QCheckBox(obs_module_text(
"AdvSceneSwitcher.condition.scene.waitForTransition"));
QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)),
this, SLOT(SceneChanged(const SceneSelection &)));
QWidget::connect(_sceneType, SIGNAL(currentIndexChanged(int)), this,
SLOT(TypeChanged(int)));
QWidget::connect(_waitForTransition, SIGNAL(stateChanged(int)), this,
SLOT(WaitForTransitionChanged(int)));
populateTypeSelection(_sceneType);
@ -88,6 +110,7 @@ MacroConditionSceneEdit::MacroConditionSceneEdit(
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{scenes}}", _scenes},
{"{{sceneType}}", _sceneType},
{"{{waitForTransition}}", _waitForTransition},
};
placeWidgets(obs_module_text("AdvSceneSwitcher.condition.scene.entry"),
mainLayout, widgetPlaceholders);
@ -121,10 +144,21 @@ void MacroConditionSceneEdit::TypeChanged(int value)
SetWidgetVisibility();
}
void MacroConditionSceneEdit::WaitForTransitionChanged(int state)
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_waitForTransition = state;
}
void MacroConditionSceneEdit::SetWidgetVisibility()
{
_scenes->setVisible(_entryData->_type == SceneType::CURRENT ||
_entryData->_type == SceneType::PREVIOUS);
_waitForTransition->setVisible(_entryData->_type == SceneType::CURRENT);
}
void MacroConditionSceneEdit::UpdateEntryData()
@ -135,5 +169,6 @@ void MacroConditionSceneEdit::UpdateEntryData()
_scenes->SetScene(_entryData->_scene);
_sceneType->setCurrentIndex(static_cast<int>(_entryData->_type));
_waitForTransition->setChecked(_entryData->_waitForTransition);
SetWidgetVisibility();
}