From 033a6929c3287baf5f167e0ff55581860e014ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 16 May 2019 11:03:32 +0200 Subject: [PATCH] Utils(GetSceneItemFromId): recurse into groups wip --- src/Utils.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Utils.cpp b/src/Utils.cpp index a1648e75..b1b656e0 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -215,27 +215,37 @@ obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, QString name) return search.result; } +// TODO refactor this to unify it with GetSceneItemFromName obs_sceneitem_t* Utils::GetSceneItemFromId(obs_source_t* source, size_t id) { struct current_search { size_t query; obs_sceneitem_t* result; + bool (*enumCallback)(obs_scene_t*, obs_sceneitem_t*, void*); }; current_search search; search.query = id; search.result = nullptr; + search.enumCallback = nullptr; OBSScene scene = obs_scene_from_source(source); if (!scene) return nullptr; - obs_scene_enum_items(scene, []( + search.enumCallback = []( obs_scene_t* scene, obs_sceneitem_t* currentItem, void* param) { current_search* search = reinterpret_cast(param); + if (obs_sceneitem_is_group(currentItem)) { + obs_sceneitem_group_enum_items(currentItem, search->enumCallback, param); + if (search->result) { + return false; + } + } + if (obs_sceneitem_get_id(currentItem) == search->query) { search->result = currentItem; obs_sceneitem_addref(search->result); @@ -243,7 +253,9 @@ obs_sceneitem_t* Utils::GetSceneItemFromId(obs_source_t* source, size_t id) { } return true; - }, &search); + }; + + obs_scene_enum_items(scene, search.enumCallback, &search); return search.result; }