From 5586670d3804647fb64c8fb865658a87841fa43b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Tue, 30 Oct 2018 14:53:48 +0100 Subject: [PATCH] Utils: add missing scene item methods --- src/Utils.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/Utils.h | 2 ++ 2 files changed, 51 insertions(+) diff --git a/src/Utils.cpp b/src/Utils.cpp index 86930b39..b73ed51c 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -103,6 +103,22 @@ obs_data_t* Utils::GetSceneItemData(obs_sceneitem_t* item) { return data; } +obs_sceneitem_t* Utils::GetSceneItemFromItem(obs_source_t* source, obs_data_t* item) { + OBSSceneItem sceneItem; + if (obs_data_has_user_value(item, "id")) { + sceneItem = GetSceneItemFromId(source, obs_data_get_int(item, "id")); + if (obs_data_has_user_value(item, "name") && + (QString)obs_source_get_name(obs_sceneitem_get_source(sceneItem)) != + (QString)obs_data_get_string(item, "name")) { + return nullptr; + } + } + else if (obs_data_has_user_value(item, "name")) { + sceneItem = GetSceneItemFromName(source, obs_data_get_string(item, "name")); + } + return sceneItem; +} + obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, QString name) { struct current_search { QString query; @@ -139,6 +155,39 @@ obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, QString name) return search.result; } +obs_sceneitem_t* Utils::GetSceneItemFromId(obs_source_t* source, size_t id) { + struct current_search { + size_t query; + obs_sceneitem_t* result; + }; + + current_search search; + search.query = id; + search.result = nullptr; + + OBSScene scene = obs_scene_from_source(source); + if (!scene) + return nullptr; + + obs_scene_enum_items(scene, []( + obs_scene_t* scene, + obs_sceneitem_t* currentItem, + void* param) + { + current_search* search = static_cast(param); + + if (obs_sceneitem_get_id(currentItem) == search->query) { + search->result = currentItem; + obs_sceneitem_addref(search->result); + return false; + } + + return true; + }, &search); + + return search.result; +} + bool Utils::IsValidAlignment(const uint32_t alignment) { switch (alignment) { case OBS_ALIGN_CENTER: diff --git a/src/Utils.h b/src/Utils.h index 24139f71..ba97d5cf 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -39,6 +39,8 @@ class Utils { static obs_data_t* GetSceneItemData(obs_sceneitem_t* item); static obs_sceneitem_t* GetSceneItemFromName( obs_source_t* source, QString name); + static obs_sceneitem_t* GetSceneItemFromId(obs_source_t* source, size_t id); + static obs_sceneitem_t* GetSceneItemFromItem(obs_source_t* source, obs_data_t* item); static obs_source_t* GetTransitionFromName(QString transitionName); static obs_source_t* GetSceneFromNameOrCurrent(QString sceneName);