From 8a649b89c8c4f93c700d8571aac52ad18afa9e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20L?= Date: Mon, 24 Dec 2018 02:43:58 +0100 Subject: [PATCH] scene items: import reorder method from master --- src/WSRequestHandler.cpp | 1 + src/WSRequestHandler.h | 1 + src/WSRequestHandler_SceneItems.cpp | 62 +++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index fbdccc97..2cadf9c0 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -38,6 +38,7 @@ QHash WSRequestHandler::messageMap { { "GetCurrentScene", WSRequestHandler::HandleGetCurrentScene }, { "GetSceneList", WSRequestHandler::HandleGetSceneList }, + { "SetSceneItemOrder", WSRequestHandler::HandleSetSceneItemOrder }, { "SetSourceRender", WSRequestHandler::HandleSetSceneItemRender }, // Retrocompat { "SetSceneItemRender", WSRequestHandler::HandleSetSceneItemRender }, { "SetSceneItemPosition", WSRequestHandler::HandleSetSceneItemPosition }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index ad3b779e..a3d13847 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -66,6 +66,7 @@ class WSRequestHandler : public QObject { static void HandleGetCurrentScene(WSRequestHandler* req); static void HandleGetSceneList(WSRequestHandler* req); + static void HandleSetSceneItemOrder(WSRequestHandler* req); static void HandleSetSceneItemRender(WSRequestHandler* req); static void HandleSetSceneItemPosition(WSRequestHandler* req); static void HandleSetSceneItemTransform(WSRequestHandler* req); diff --git a/src/WSRequestHandler_SceneItems.cpp b/src/WSRequestHandler_SceneItems.cpp index f41fe50a..ad937b53 100644 --- a/src/WSRequestHandler_SceneItems.cpp +++ b/src/WSRequestHandler_SceneItems.cpp @@ -686,4 +686,66 @@ void WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req) { obs_data_set_string(responseData, "scene", obs_source_get_name(toScene)); req->SendOKResponse(responseData); +} + +/** +* Changes the order of scene items in the requested scene. +* +* @param {String (optional)} `scene` Name of the scene to reorder (defaults to current). +* @param {Scene|Array} `items` Ordered list of objects with name and/or id specified. Id preferred due to uniqueness per scene +* @param {int (optional)} `items[].id` Id of a specific scene item. Unique on a scene by scene basis. +* @param {String (optional)} `items[].name` Name of a scene item. Sufficiently unique if no scene items share sources within the scene. +* +* @api requests +* @name SetSceneItemOrder +* @category scenes +* @since 4.5.0 +*/ +void WSRequestHandler::HandleSetSceneItemOrder(WSRequestHandler* req) { + QString sceneName = obs_data_get_string(req->data, "scene"); + OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); + if (!scene) { + req->SendErrorResponse("requested scene doesn't exist"); + return; + } + + OBSDataArrayAutoRelease items = obs_data_get_array(req->data, "items"); + if (!items) { + req->SendErrorResponse("sceneItem order not specified"); + return; + } + + size_t count = obs_data_array_count(items); + + std::vector newOrder; + newOrder.reserve(count); + + for (size_t i = 0; i < count; i++) { + OBSDataAutoRelease item = obs_data_array_item(items, i); + + OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(scene, item); + obs_sceneitem_release(sceneItem); // ref dec + + if (!sceneItem) { + req->SendErrorResponse("Invalid sceneItem id or name specified"); + return; + } + + for (size_t j = 0; j <= i; j++) { + if (sceneItem == newOrder[j]) { + req->SendErrorResponse("Duplicate sceneItem in specified order"); + return; + } + } + + newOrder.push_back(sceneItem); + } + + bool success = obs_scene_reorder_items(obs_scene_from_source(scene), newOrder.data(), count); + if (!success) { + req->SendErrorResponse("Invalid sceneItem order"); + return; + } + + req->SendOKResponse(); } \ No newline at end of file