mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
scene items: import reorder method from master
This commit is contained in:
parent
83fb1843ee
commit
8a649b89c8
@ -38,6 +38,7 @@ QHash<QString, void(*)(WSRequestHandler*)> WSRequestHandler::messageMap {
|
||||
{ "GetCurrentScene", WSRequestHandler::HandleGetCurrentScene },
|
||||
{ "GetSceneList", WSRequestHandler::HandleGetSceneList },
|
||||
|
||||
{ "SetSceneItemOrder", WSRequestHandler::HandleSetSceneItemOrder },
|
||||
{ "SetSourceRender", WSRequestHandler::HandleSetSceneItemRender }, // Retrocompat
|
||||
{ "SetSceneItemRender", WSRequestHandler::HandleSetSceneItemRender },
|
||||
{ "SetSceneItemPosition", WSRequestHandler::HandleSetSceneItemPosition },
|
||||
|
@ -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);
|
||||
|
@ -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<obs_sceneitem_t*> 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();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user