diff --git a/src/headers/utility.hpp b/src/headers/utility.hpp index 99ef9678..f8da16c7 100644 --- a/src/headers/utility.hpp +++ b/src/headers/utility.hpp @@ -25,6 +25,8 @@ std::string getSourceSettings(OBSWeakSource ws); void setSourceSettings(obs_source_t *s, const std::string &settings); bool compareSourceSettings(const OBSWeakSource &source, const std::string &settings, bool regex); +std::vector getSceneItemsWithName(OBSScene scene, + std::string &name); std::string getDataFilePath(const std::string &file); /** diff --git a/src/macro-action-scene-order.cpp b/src/macro-action-scene-order.cpp index eaa273b9..9d394d1e 100644 --- a/src/macro-action-scene-order.cpp +++ b/src/macro-action-scene-order.cpp @@ -22,37 +22,14 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.sceneOrder.type.movePosition"}, }; -struct MoveInfo { - std::string name; - std::vector items = {}; -}; - -static bool getSceneItems(obs_scene_t *, obs_sceneitem_t *item, void *ptr) -{ - MoveInfo *moveInfo = reinterpret_cast(ptr); - auto sourceName = obs_source_get_name(obs_sceneitem_get_source(item)); - if (moveInfo->name == sourceName) { - obs_sceneitem_addref(item); - moveInfo->items.push_back(item); - } - - if (obs_sceneitem_is_group(item)) { - obs_scene_t *scene = obs_sceneitem_group_get_scene(item); - obs_scene_enum_items(scene, getSceneItems, ptr); - } - - return true; -} - bool MacroActionSceneOrder::PerformAction() { auto s = obs_weak_source_get_source(_scene); auto scene = obs_scene_from_source(s); - auto sourceName = GetWeakSourceName(_source); - MoveInfo moveInfo = {sourceName}; - obs_scene_enum_items(scene, getSceneItems, &moveInfo); + auto name = GetWeakSourceName(_source); + auto items = getSceneItemsWithName(scene, name); - for (auto &i : moveInfo.items) { + for (auto &i : items) { switch (_action) { case SceneOrderAction::MOVE_UP: obs_sceneitem_set_order(i, OBS_ORDER_MOVE_UP); diff --git a/src/utility.cpp b/src/utility.cpp index 6484e36c..7f655eea 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -235,6 +235,36 @@ void setSourceSettings(obs_source_t *s, const std::string &settings) obs_data_release(data); } +struct ItemInfo { + std::string name; + std::vector items = {}; +}; + +static bool getSceneItems(obs_scene_t *, obs_sceneitem_t *item, void *ptr) +{ + ItemInfo *moveInfo = reinterpret_cast(ptr); + auto sourceName = obs_source_get_name(obs_sceneitem_get_source(item)); + if (moveInfo->name == sourceName) { + obs_sceneitem_addref(item); + moveInfo->items.push_back(item); + } + + if (obs_sceneitem_is_group(item)) { + obs_scene_t *scene = obs_sceneitem_group_get_scene(item); + obs_scene_enum_items(scene, getSceneItems, ptr); + } + + return true; +} + +std::vector getSceneItemsWithName(OBSScene scene, + std::string &name) +{ + ItemInfo itemInfo = {name}; + obs_scene_enum_items(scene, getSceneItems, &itemInfo); + return itemInfo.items; +} + bool compareSourceSettings(const OBSWeakSource &source, const std::string &settings, bool useRegex) {