diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 3b338f03..6b98fb53 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -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" diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index f2acd7db..f491f90b 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -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(); diff --git a/src/headers/macro-condition-scene.hpp b/src/headers/macro-condition-scene.hpp index be1f7174..56a23813 100644 --- a/src/headers/macro-condition-scene.hpp +++ b/src/headers/macro-condition-scene.hpp @@ -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 _entryData; private: + void SetWidgetVisibility(); bool _loading = true; }; diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp index 791b94c5..5493147a 100644 --- a/src/headers/switcher-data-structs.hpp +++ b/src/headers/switcher-data-structs.hpp @@ -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; diff --git a/src/macro-condition-scene.cpp b/src/macro-condition-scene.cpp index e9120829..494fe3c2 100644 --- a/src/macro-condition-scene.cpp +++ b/src/macro-condition-scene.cpp @@ -13,18 +13,29 @@ bool MacroConditionScene::_registered = MacroConditionFactory::Register( static std::map 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 lock(switcher->m); _entryData->_type = static_cast(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(_entryData->_type)); + SetWidgetVisibility(); }