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 1/3] 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 From e310c7d744ee7bbc8d961ac5284337fca8a7868e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20L?= Date: Mon, 24 Dec 2018 18:34:18 +0100 Subject: [PATCH 2/3] move SetSceneItemOrder to Scenes --- src/WSRequestHandler_SceneItems.cpp | 62 ----------------------------- src/WSRequestHandler_Scenes.cpp | 62 +++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/WSRequestHandler_SceneItems.cpp b/src/WSRequestHandler_SceneItems.cpp index ad937b53..e1e279b6 100644 --- a/src/WSRequestHandler_SceneItems.cpp +++ b/src/WSRequestHandler_SceneItems.cpp @@ -687,65 +687,3 @@ void WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req) { 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 diff --git a/src/WSRequestHandler_Scenes.cpp b/src/WSRequestHandler_Scenes.cpp index 822a822e..928f8e16 100644 --- a/src/WSRequestHandler_Scenes.cpp +++ b/src/WSRequestHandler_Scenes.cpp @@ -80,3 +80,65 @@ void WSRequestHandler::HandleGetSceneList(WSRequestHandler* req) { req->SendOKResponse(data); } + +/** +* 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(); +} From 3c7570d814b2868c2fb06ca4598e56ac09e4722e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20L?= Date: Sun, 30 Dec 2018 14:47:59 +0100 Subject: [PATCH 3/3] scenes: rename SetSceneItemOrder to ReorderSceneItems + fix item freeing --- src/WSRequestHandler.cpp | 2 +- src/WSRequestHandler.h | 2 +- src/WSRequestHandler_Scenes.cpp | 12 ++++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 2cadf9c0..321fa5a6 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -38,7 +38,6 @@ QHash WSRequestHandler::messageMap { { "GetCurrentScene", WSRequestHandler::HandleGetCurrentScene }, { "GetSceneList", WSRequestHandler::HandleGetSceneList }, - { "SetSceneItemOrder", WSRequestHandler::HandleSetSceneItemOrder }, { "SetSourceRender", WSRequestHandler::HandleSetSceneItemRender }, // Retrocompat { "SetSceneItemRender", WSRequestHandler::HandleSetSceneItemRender }, { "SetSceneItemPosition", WSRequestHandler::HandleSetSceneItemPosition }, @@ -49,6 +48,7 @@ QHash WSRequestHandler::messageMap { { "ResetSceneItem", WSRequestHandler::HandleResetSceneItem }, { "DeleteSceneItem", WSRequestHandler::HandleDeleteSceneItem }, { "DuplicateSceneItem", WSRequestHandler::HandleDuplicateSceneItem }, + { "ReorderSceneItems", WSRequestHandler::HandleReorderSceneItems }, { "GetStreamingStatus", WSRequestHandler::HandleGetStreamingStatus }, { "StartStopStreaming", WSRequestHandler::HandleStartStopStreaming }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index a3d13847..cb259827 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -66,7 +66,6 @@ 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); @@ -76,6 +75,7 @@ class WSRequestHandler : public QObject { static void HandleResetSceneItem(WSRequestHandler* req); static void HandleDuplicateSceneItem(WSRequestHandler* req); static void HandleDeleteSceneItem(WSRequestHandler* req); + static void HandleReorderSceneItems(WSRequestHandler* req); static void HandleGetStreamingStatus(WSRequestHandler* req); static void HandleStartStopStreaming(WSRequestHandler* req); diff --git a/src/WSRequestHandler_Scenes.cpp b/src/WSRequestHandler_Scenes.cpp index 928f8e16..bebdb9c2 100644 --- a/src/WSRequestHandler_Scenes.cpp +++ b/src/WSRequestHandler_Scenes.cpp @@ -90,11 +90,11 @@ void WSRequestHandler::HandleGetSceneList(WSRequestHandler* req) { * @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 +* @name ReorderSceneItems * @category scenes * @since 4.5.0 */ -void WSRequestHandler::HandleSetSceneItemOrder(WSRequestHandler* req) { +void WSRequestHandler::HandleReorderSceneItems(WSRequestHandler* req) { QString sceneName = obs_data_get_string(req->data, "scene"); OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName); if (!scene) { @@ -113,7 +113,7 @@ void WSRequestHandler::HandleSetSceneItemOrder(WSRequestHandler* req) { std::vector newOrder; newOrder.reserve(count); - for (size_t i = 0; i < count; i++) { + for (size_t i = 0; i < count; ++i) { OBSDataAutoRelease item = obs_data_array_item(items, i); OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(scene, item); @@ -124,7 +124,7 @@ void WSRequestHandler::HandleSetSceneItemOrder(WSRequestHandler* req) { return; } - for (size_t j = 0; j <= i; j++) { + for (size_t j = 0; j <= i; ++j) { if (sceneItem == newOrder[j]) { req->SendErrorResponse("Duplicate sceneItem in specified order"); return; @@ -140,5 +140,9 @@ void WSRequestHandler::HandleSetSceneItemOrder(WSRequestHandler* req) { return; } + for (auto const& item: newOrder) { + obs_sceneitem_release(item); + } + req->SendOKResponse(); }