diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 54580c0e..011d2b57 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -414,6 +414,7 @@ AdvSceneSwitcher.action.run.entry="Run {{filePath}}" AdvSceneSwitcher.action.sceneVisibility="Scene item visibility" AdvSceneSwitcher.action.sceneVisibility.type.show="Show" AdvSceneSwitcher.action.sceneVisibility.type.hide="Hide" +AdvSceneSwitcher.action.sceneVisibility.type.toggle="Toggle" AdvSceneSwitcher.action.sceneVisibility.type.source="Source" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Any" AdvSceneSwitcher.action.sceneVisibility.entry="On{{scenes}}{{actions}}{{sourceTypes}}{{sources}}{{sourceGroups}}" diff --git a/src/macro-core/macro-action-scene-visibility.cpp b/src/macro-core/macro-action-scene-visibility.cpp index e26f4840..2e0d9ea9 100644 --- a/src/macro-core/macro-action-scene-visibility.cpp +++ b/src/macro-core/macro-action-scene-visibility.cpp @@ -15,6 +15,8 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.sceneVisibility.type.show"}, {SceneVisibilityAction::HIDE, "AdvSceneSwitcher.action.sceneVisibility.type.hide"}, + {SceneVisibilityAction::TOGGLE, + "AdvSceneSwitcher.action.sceneVisibility.type.toggle"}, }; const static std::map sourceItemSourceTypes = { @@ -26,9 +28,25 @@ const static std::map sourceItemSourceTypes = struct VisibilityData { std::string name; - bool visible; + SceneVisibilityAction action; }; +static void setSceneItemVisiblity(obs_sceneitem_t *item, + SceneVisibilityAction action) +{ + switch (action) { + case SceneVisibilityAction::SHOW: + obs_sceneitem_set_visible(item, true); + break; + case SceneVisibilityAction::HIDE: + obs_sceneitem_set_visible(item, false); + break; + case SceneVisibilityAction::TOGGLE: + obs_sceneitem_set_visible(item, !obs_sceneitem_visible(item)); + break; + } +} + static bool visibilitySourceTypeEnum(obs_scene_t *, obs_sceneitem_t *item, void *ptr) { @@ -37,7 +55,7 @@ static bool visibilitySourceTypeEnum(obs_scene_t *, obs_sceneitem_t *item, auto sourceTypeName = obs_source_get_display_name( obs_source_get_id(obs_sceneitem_get_source(item))); if (sourceTypeName && vInfo->name == sourceTypeName) { - obs_sceneitem_set_visible(item, vInfo->visible); + setSceneItemVisiblity(item, vInfo->action); } if (obs_sceneitem_is_group(item)) { @@ -54,8 +72,7 @@ bool MacroActionSceneVisibility::PerformAction() case SceneItemSourceType::SOURCE: { auto items = _source.GetSceneItems(_scene); for (auto item : items) { - obs_sceneitem_set_visible( - item, _action == SceneVisibilityAction::SHOW); + setSceneItemVisiblity(item, _action); obs_sceneitem_release(item); } break; @@ -63,8 +80,7 @@ bool MacroActionSceneVisibility::PerformAction() case SceneItemSourceType::SOURCE_GROUP: { auto s = obs_weak_source_get_source(_scene.GetScene()); auto scene = obs_scene_from_source(s); - VisibilityData vInfo = {_sourceGroup, - _action == SceneVisibilityAction::SHOW}; + VisibilityData vInfo = {_sourceGroup, _action}; obs_scene_enum_items(scene, visibilitySourceTypeEnum, &vInfo); obs_source_release(s); break; diff --git a/src/macro-core/macro-action-scene-visibility.hpp b/src/macro-core/macro-action-scene-visibility.hpp index edfc582a..857ccb35 100644 --- a/src/macro-core/macro-action-scene-visibility.hpp +++ b/src/macro-core/macro-action-scene-visibility.hpp @@ -8,6 +8,7 @@ enum class SceneVisibilityAction { SHOW, HIDE, + TOGGLE, }; enum class SceneItemSourceType {