Utils(GetSceneItemFromId): recurse into groups wip

This commit is contained in:
Stéphane Lepin
2019-05-16 11:03:32 +02:00
parent 7c8292a88d
commit 033a6929c3

View File

@ -215,27 +215,37 @@ obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, QString name)
return search.result; return search.result;
} }
// TODO refactor this to unify it with GetSceneItemFromName
obs_sceneitem_t* Utils::GetSceneItemFromId(obs_source_t* source, size_t id) { obs_sceneitem_t* Utils::GetSceneItemFromId(obs_source_t* source, size_t id) {
struct current_search { struct current_search {
size_t query; size_t query;
obs_sceneitem_t* result; obs_sceneitem_t* result;
bool (*enumCallback)(obs_scene_t*, obs_sceneitem_t*, void*);
}; };
current_search search; current_search search;
search.query = id; search.query = id;
search.result = nullptr; search.result = nullptr;
search.enumCallback = nullptr;
OBSScene scene = obs_scene_from_source(source); OBSScene scene = obs_scene_from_source(source);
if (!scene) if (!scene)
return nullptr; return nullptr;
obs_scene_enum_items(scene, []( search.enumCallback = [](
obs_scene_t* scene, obs_scene_t* scene,
obs_sceneitem_t* currentItem, obs_sceneitem_t* currentItem,
void* param) void* param)
{ {
current_search* search = reinterpret_cast<current_search*>(param); current_search* search = reinterpret_cast<current_search*>(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) { if (obs_sceneitem_get_id(currentItem) == search->query) {
search->result = currentItem; search->result = currentItem;
obs_sceneitem_addref(search->result); obs_sceneitem_addref(search->result);
@ -243,7 +253,9 @@ obs_sceneitem_t* Utils::GetSceneItemFromId(obs_source_t* source, size_t id) {
} }
return true; return true;
}, &search); };
obs_scene_enum_items(scene, search.enumCallback, &search);
return search.result; return search.result;
} }