Add option to for macro condition scene to trigger on any scene change

This commit is contained in:
WarmUpTill 2021-09-02 19:52:42 +02:00 committed by WarmUpTill
parent 96b472776a
commit bee75336d0
5 changed files with 35 additions and 9 deletions

View File

@ -93,9 +93,10 @@ AdvSceneSwitcher.condition.cursor.hideFrame="Hide frame"
AdvSceneSwitcher.condition.cursor.entry.line1="Cursor is {{conditions}} {{minX}} {{minY}} {{maxX}} {{maxY}} - {{toggleFrameButton}}"
AdvSceneSwitcher.condition.cursor.entry.line2="Cursor is currently at {{xPos}} x {{yPos}}"
AdvSceneSwitcher.condition.scene="Scene"
AdvSceneSwitcher.condition.scene.type.current="Current"
AdvSceneSwitcher.condition.scene.type.previous="Previous"
AdvSceneSwitcher.condition.scene.entry="{{sceneType}} scene is {{scenes}}"
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.entry="{{sceneType}} {{scenes}}"
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

@ -476,6 +476,9 @@ extern "C" void FreeSceneSwitcher()
void handleSceneChange()
{
switcher->lastSceneChangeTime =
std::chrono::high_resolution_clock::now();
// Stop waiting if scene was changed
if (switcher->sceneChangedDuringWait()) {
switcher->cv.notify_one();

View File

@ -8,6 +8,7 @@
enum class SceneType {
CURRENT,
PREVIOUS,
CHANGED,
};
class MacroConditionScene : public MacroCondition {
@ -26,6 +27,7 @@ public:
SceneType _type;
private:
std::chrono::high_resolution_clock::time_point _lastSceneChangeTime{};
static bool _registered;
static const std::string id;
};
@ -58,5 +60,6 @@ protected:
std::shared_ptr<MacroConditionScene> _entryData;
private:
void SetWidgetVisibility();
bool _loading = true;
};

View File

@ -79,6 +79,7 @@ struct SwitcherData {
obs_source_t *waitScene = nullptr;
OBSWeakSource currentScene = nullptr;
OBSWeakSource previousScene = nullptr;
std::chrono::high_resolution_clock::time_point lastSceneChangeTime{};
OBSWeakSource lastRandomScene;
SceneGroup *lastRandomSceneGroup;
OBSWeakSource nonMatchingScene;

View File

@ -13,18 +13,29 @@ bool MacroConditionScene::_registered = MacroConditionFactory::Register(
static std::map<SceneType, std::string> sceneTypes = {
{SceneType::CURRENT, "AdvSceneSwitcher.condition.scene.type.current"},
{SceneType::PREVIOUS, "AdvSceneSwitcher.condition.scene.type.previous"},
{SceneType::CHANGED, "AdvSceneSwitcher.condition.scene.type.changed"},
};
bool MacroConditionScene::CheckCondition()
{
bool sceneMatch = false;
if (_type == SceneType::CURRENT) {
sceneMatch = switcher->currentScene == _scene.GetScene(false);
} else {
sceneMatch = switcher->previousScene == _scene.GetScene(false);
bool sceneChanged = _lastSceneChangeTime !=
switcher->lastSceneChangeTime;
if (sceneChanged) {
_lastSceneChangeTime = switcher->lastSceneChangeTime;
}
return sceneMatch;
switch (_type) {
case SceneType::CURRENT:
return switcher->currentScene == _scene.GetScene(false);
case SceneType::PREVIOUS:
return switcher->previousScene == _scene.GetScene(false);
case SceneType::CHANGED:
return sceneChanged;
default:
break;
}
return false;
}
bool MacroConditionScene::Save(obs_data_t *obj)
@ -103,6 +114,12 @@ void MacroConditionSceneEdit::TypeChanged(int value)
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_type = static_cast<SceneType>(value);
SetWidgetVisibility();
}
void MacroConditionSceneEdit::SetWidgetVisibility()
{
_scenes->setVisible(_entryData->_type != SceneType::CHANGED);
}
void MacroConditionSceneEdit::UpdateEntryData()
@ -113,4 +130,5 @@ void MacroConditionSceneEdit::UpdateEntryData()
_scenes->SetScene(_entryData->_scene);
_sceneType->setCurrentIndex(static_cast<int>(_entryData->_type));
SetWidgetVisibility();
}