mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
Merge pull request #262 from Palakis/sources-methods-without-scene-name
sources: get rid of unnecessary `scene-name` param on Source Request Types
This commit is contained in:
commit
83fb1843ee
@ -566,3 +566,124 @@ void WSRequestHandler::HandleSetSceneItemCrop(WSRequestHandler* req) {
|
|||||||
req->SendErrorResponse("specified scene item doesn't exist");
|
req->SendErrorResponse("specified scene item doesn't exist");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a scene item.
|
||||||
|
*
|
||||||
|
* @param {String (optional)} `scene` Name of the scene the source belongs to. Defaults to the current scene.
|
||||||
|
* @param {Object} `item` item to delete (required)
|
||||||
|
* @param {String} `item.name` name of the scene item (prefer `id`, including both is acceptable).
|
||||||
|
* @param {int} `item.id` id of the scene item.
|
||||||
|
*
|
||||||
|
* @api requests
|
||||||
|
* @name DeleteSceneItem
|
||||||
|
* @category scene items
|
||||||
|
* @since 4.5.0
|
||||||
|
*/
|
||||||
|
void WSRequestHandler::HandleDeleteSceneItem(WSRequestHandler* req) {
|
||||||
|
if (!req->hasField("item")) {
|
||||||
|
req->SendErrorResponse("missing request parameters");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* sceneName = obs_data_get_string(req->data, "scene");
|
||||||
|
OBSSourceAutoRelease scene = Utils::GetSceneFromNameOrCurrent(sceneName);
|
||||||
|
if (!scene) {
|
||||||
|
req->SendErrorResponse("requested scene doesn't exist");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OBSDataAutoRelease item = obs_data_get_obj(req->data, "item");
|
||||||
|
OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(scene, item);
|
||||||
|
if (!sceneItem) {
|
||||||
|
req->SendErrorResponse("item with id/name combination not found in specified scene");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
obs_sceneitem_remove(sceneItem);
|
||||||
|
|
||||||
|
req->SendOKResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DuplicateSceneItemData {
|
||||||
|
obs_sceneitem_t *referenceItem;
|
||||||
|
obs_source_t *fromSource;
|
||||||
|
obs_sceneitem_t *newItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void DuplicateSceneItem(void *_data, obs_scene_t *scene) {
|
||||||
|
DuplicateSceneItemData *data = (DuplicateSceneItemData *)_data;
|
||||||
|
data->newItem = obs_scene_add(scene, data->fromSource);
|
||||||
|
obs_sceneitem_set_visible(data->newItem, obs_sceneitem_visible(data->referenceItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Duplicates a scene item.
|
||||||
|
*
|
||||||
|
* @param {String (optional)} `fromScene` Name of the scene to copy the item from. Defaults to the current scene.
|
||||||
|
* @param {String (optional)} `toScene` Name of the scene to create the item in. Defaults to the current scene.
|
||||||
|
* @param {Object} `item` item to duplicate (required)
|
||||||
|
* @param {String} `item.name` name of the scene item (prefer `id`, including both is acceptable).
|
||||||
|
* @param {int} `item.id` id of the scene item.
|
||||||
|
*
|
||||||
|
* @return {String} `scene` Name of the scene where the new item was created
|
||||||
|
* @return {Object} `item` New item info
|
||||||
|
* @return {int} `̀item.id` New item ID
|
||||||
|
* @return {String} `item.name` New item name
|
||||||
|
*
|
||||||
|
* @api requests
|
||||||
|
* @name DuplicateSceneItem
|
||||||
|
* @category scene items
|
||||||
|
* @since 4.5.0
|
||||||
|
*/
|
||||||
|
void WSRequestHandler::HandleDuplicateSceneItem(WSRequestHandler* req) {
|
||||||
|
if (!req->hasField("item")) {
|
||||||
|
req->SendErrorResponse("missing request parameters");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* fromSceneName = obs_data_get_string(req->data, "fromScene");
|
||||||
|
OBSSourceAutoRelease fromScene = Utils::GetSceneFromNameOrCurrent(fromSceneName);
|
||||||
|
if (!fromScene) {
|
||||||
|
req->SendErrorResponse("requested fromScene doesn't exist");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* toSceneName = obs_data_get_string(req->data, "toScene");
|
||||||
|
OBSSourceAutoRelease toScene = Utils::GetSceneFromNameOrCurrent(toSceneName);
|
||||||
|
if (!toScene) {
|
||||||
|
req->SendErrorResponse("requested toScene doesn't exist");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OBSDataAutoRelease item = obs_data_get_obj(req->data, "item");
|
||||||
|
OBSSceneItemAutoRelease referenceItem = Utils::GetSceneItemFromItem(fromScene, item);
|
||||||
|
if (!referenceItem) {
|
||||||
|
req->SendErrorResponse("item with id/name combination not found in specified scene");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DuplicateSceneItemData data;
|
||||||
|
data.fromSource = obs_sceneitem_get_source(referenceItem);
|
||||||
|
data.referenceItem = referenceItem;
|
||||||
|
|
||||||
|
obs_enter_graphics();
|
||||||
|
obs_scene_atomic_update(obs_scene_from_source(toScene), DuplicateSceneItem, &data);
|
||||||
|
obs_leave_graphics();
|
||||||
|
|
||||||
|
obs_sceneitem_t *newItem = data.newItem;
|
||||||
|
if (!newItem) {
|
||||||
|
req->SendErrorResponse("Error duplicating scene item");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OBSDataAutoRelease itemData = obs_data_create();
|
||||||
|
obs_data_set_int(itemData, "id", obs_sceneitem_get_id(newItem));
|
||||||
|
obs_data_set_string(itemData, "name", obs_source_get_name(obs_sceneitem_get_source(newItem)));
|
||||||
|
|
||||||
|
OBSDataAutoRelease responseData = obs_data_create();
|
||||||
|
obs_data_set_obj(responseData, "item", itemData);
|
||||||
|
obs_data_set_string(responseData, "scene", obs_source_get_name(toScene));
|
||||||
|
|
||||||
|
req->SendOKResponse(responseData);
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user