This commit is contained in:
Stéphane Lepin 2020-03-29 23:55:45 +02:00
parent 83f702fbab
commit 8b731f3ba4
2 changed files with 39 additions and 18 deletions

View File

@ -299,13 +299,13 @@ obs_sceneitem_t* Utils::GetSceneItemFromItem(obs_scene_t* scene, obs_data_t* ite
obs_sceneitem_t* Utils::GetSceneItemFromRequestField(obs_scene_t* scene, obs_data_item_t* dataItem) obs_sceneitem_t* Utils::GetSceneItemFromRequestField(obs_scene_t* scene, obs_data_item_t* dataItem)
{ {
obs_data_type dataType = obs_data_item_gettype(dataItem); enum obs_data_type dataType = obs_data_item_gettype(dataItem);
if (dataType == OBS_DATA_OBJECT) { if (dataType == OBS_DATA_OBJECT) {
OBSDataAutoRelease itemData = obs_data_item_get_obj(dataItem); OBSDataAutoRelease itemData = obs_data_item_get_obj(dataItem);
return GetSceneItemFromItem(scene, itemData); return GetSceneItemFromItem(scene, itemData);
} else if (dataType == OBS_DATA_STRING) { } else if (dataType == OBS_DATA_STRING) {
const char* name = obs_data_item_get_string(dataItem); QString name = obs_data_item_get_string(dataItem);
return GetSceneItemFromName(scene, name); return GetSceneItemFromName(scene, name);
} }

View File

@ -48,13 +48,15 @@ RpcResponse WSRequestHandler::GetSceneItemProperties(const RpcRequest& request)
return request.failed("missing request parameters"); return request.failed("missing request parameters");
} }
QString sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSData params = request.parameters();
QString sceneName = obs_data_get_string(params, "scene-name");
OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName);
if (!scene) { if (!scene) {
return request.failed("requested scene doesn't exist"); return request.failed("requested scene doesn't exist");
} }
OBSDataItemAutoRelease itemField = obs_data_item_byname(request.parameters(), "item"); OBSDataItemAutoRelease itemField = obs_data_item_byname(params, "item");
OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromRequestField(scene, itemField); OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromRequestField(scene, itemField);
if (!sceneItem) { if (!sceneItem) {
return request.failed("specified scene item doesn't exist"); return request.failed("specified scene item doesn't exist");
@ -62,7 +64,7 @@ RpcResponse WSRequestHandler::GetSceneItemProperties(const RpcRequest& request)
OBSDataAutoRelease data = Utils::GetSceneItemPropertiesData(sceneItem); OBSDataAutoRelease data = Utils::GetSceneItemPropertiesData(sceneItem);
OBSSourceAutoRelease sceneItemSource = obs_sceneitem_get_source(sceneItem); OBSSource sceneItemSource = obs_sceneitem_get_source(sceneItem);
obs_data_set_string(data, "name", obs_source_get_name(sceneItemSource)); obs_data_set_string(data, "name", obs_source_get_name(sceneItemSource));
obs_data_set_int(data, "itemId", obs_sceneitem_get_id(sceneItem)); obs_data_set_int(data, "itemId", obs_sceneitem_get_id(sceneItem));
@ -104,13 +106,15 @@ RpcResponse WSRequestHandler::SetSceneItemProperties(const RpcRequest& request)
return request.failed("missing request parameters"); return request.failed("missing request parameters");
} }
QString sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSData params = request.parameters();
QString sceneName = obs_data_get_string(params, "scene-name");
OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName);
if (!scene) { if (!scene) {
return request.failed("requested scene doesn't exist"); return request.failed("requested scene doesn't exist");
} }
OBSDataItemAutoRelease itemField = obs_data_item_byname(request.parameters(), "item"); OBSDataItemAutoRelease itemField = obs_data_item_byname(params, "item");
OBSSceneItemAutoRelease sceneItem =Utils::GetSceneItemFromRequestField(scene, itemField); OBSSceneItemAutoRelease sceneItem =Utils::GetSceneItemFromRequestField(scene, itemField);
if (!sceneItem) { if (!sceneItem) {
return request.failed("specified scene item doesn't exist"); return request.failed("specified scene item doesn't exist");
@ -125,51 +129,59 @@ RpcResponse WSRequestHandler::SetSceneItemProperties(const RpcRequest& request)
vec2 oldPosition; vec2 oldPosition;
OBSDataAutoRelease positionError = obs_data_create(); OBSDataAutoRelease positionError = obs_data_create();
obs_sceneitem_get_pos(sceneItem, &oldPosition); obs_sceneitem_get_pos(sceneItem, &oldPosition);
OBSDataAutoRelease reqPosition = obs_data_get_obj(request.parameters(), "position");
OBSDataAutoRelease reqPosition = obs_data_get_obj(params, "position");
vec2 newPosition = oldPosition; vec2 newPosition = oldPosition;
if (obs_data_has_user_value(reqPosition, "x")) { if (obs_data_has_user_value(reqPosition, "x")) {
newPosition.x = obs_data_get_int(reqPosition, "x"); newPosition.x = obs_data_get_int(reqPosition, "x");
} }
if (obs_data_has_user_value(reqPosition, "y")) { if (obs_data_has_user_value(reqPosition, "y")) {
newPosition.y = obs_data_get_int(reqPosition, "y"); newPosition.y = obs_data_get_int(reqPosition, "y");
} }
if (obs_data_has_user_value(reqPosition, "alignment")) { if (obs_data_has_user_value(reqPosition, "alignment")) {
const uint32_t alignment = obs_data_get_int(reqPosition, "alignment"); const uint32_t alignment = obs_data_get_int(reqPosition, "alignment");
if (Utils::IsValidAlignment(alignment)) { if (Utils::IsValidAlignment(alignment)) {
obs_sceneitem_set_alignment(sceneItem, alignment); obs_sceneitem_set_alignment(sceneItem, alignment);
} } else {
else {
badRequest = true; badRequest = true;
obs_data_set_string(positionError, "alignment", "invalid"); obs_data_set_string(positionError, "alignment", "invalid");
obs_data_set_obj(errorData, "position", positionError); obs_data_set_obj(errorData, "position", positionError);
} }
} }
obs_sceneitem_set_pos(sceneItem, &newPosition); obs_sceneitem_set_pos(sceneItem, &newPosition);
} }
if (request.hasField("rotation")) { if (request.hasField("rotation")) {
obs_sceneitem_set_rot(sceneItem, (float)obs_data_get_double(request.parameters(), "rotation")); obs_sceneitem_set_rot(sceneItem, (float)obs_data_get_double(params, "rotation"));
} }
if (request.hasField("scale")) { if (request.hasField("scale")) {
vec2 oldScale; vec2 oldScale;
obs_sceneitem_get_scale(sceneItem, &oldScale); obs_sceneitem_get_scale(sceneItem, &oldScale);
OBSDataAutoRelease reqScale = obs_data_get_obj(request.parameters(), "scale");
vec2 newScale = oldScale; vec2 newScale = oldScale;
OBSDataAutoRelease reqScale = obs_data_get_obj(params, "scale");
if (obs_data_has_user_value(reqScale, "x")) { if (obs_data_has_user_value(reqScale, "x")) {
newScale.x = obs_data_get_double(reqScale, "x"); newScale.x = obs_data_get_double(reqScale, "x");
} }
if (obs_data_has_user_value(reqScale, "y")) { if (obs_data_has_user_value(reqScale, "y")) {
newScale.y = obs_data_get_double(reqScale, "y"); newScale.y = obs_data_get_double(reqScale, "y");
} }
obs_sceneitem_set_scale(sceneItem, &newScale); obs_sceneitem_set_scale(sceneItem, &newScale);
} }
if (request.hasField("crop")) { if (request.hasField("crop")) {
obs_sceneitem_crop oldCrop; obs_sceneitem_crop oldCrop;
obs_sceneitem_get_crop(sceneItem, &oldCrop); obs_sceneitem_get_crop(sceneItem, &oldCrop);
OBSDataAutoRelease reqCrop = obs_data_get_obj(request.parameters(), "crop");
OBSDataAutoRelease reqCrop = obs_data_get_obj(params, "crop");
obs_sceneitem_crop newCrop = oldCrop; obs_sceneitem_crop newCrop = oldCrop;
if (obs_data_has_user_value(reqCrop, "top")) { if (obs_data_has_user_value(reqCrop, "top")) {
newCrop.top = obs_data_get_int(reqCrop, "top"); newCrop.top = obs_data_get_int(reqCrop, "top");
} }
@ -182,21 +194,23 @@ RpcResponse WSRequestHandler::SetSceneItemProperties(const RpcRequest& request)
if (obs_data_has_user_value(reqCrop, "left")) { if (obs_data_has_user_value(reqCrop, "left")) {
newCrop.left = obs_data_get_int(reqCrop, "left"); newCrop.left = obs_data_get_int(reqCrop, "left");
} }
obs_sceneitem_set_crop(sceneItem, &newCrop); obs_sceneitem_set_crop(sceneItem, &newCrop);
} }
if (request.hasField("visible")) { if (request.hasField("visible")) {
obs_sceneitem_set_visible(sceneItem, obs_data_get_bool(request.parameters(), "visible")); obs_sceneitem_set_visible(sceneItem, obs_data_get_bool(params, "visible"));
} }
if (request.hasField("locked")) { if (request.hasField("locked")) {
obs_sceneitem_set_locked(sceneItem, obs_data_get_bool(request.parameters(), "locked")); obs_sceneitem_set_locked(sceneItem, obs_data_get_bool(params, "locked"));
} }
if (request.hasField("bounds")) { if (request.hasField("bounds")) {
bool badBounds = false; bool badBounds = false;
OBSDataAutoRelease boundsError = obs_data_create(); OBSDataAutoRelease boundsError = obs_data_create();
OBSDataAutoRelease reqBounds = obs_data_get_obj(request.parameters(), "bounds"); OBSDataAutoRelease reqBounds = obs_data_get_obj(params, "bounds");
if (obs_data_has_user_value(reqBounds, "type")) { if (obs_data_has_user_value(reqBounds, "type")) {
QString newBoundsType = obs_data_get_string(reqBounds, "type"); QString newBoundsType = obs_data_get_string(reqBounds, "type");
if (newBoundsType == "OBS_BOUNDS_NONE") { if (newBoundsType == "OBS_BOUNDS_NONE") {
@ -225,16 +239,20 @@ RpcResponse WSRequestHandler::SetSceneItemProperties(const RpcRequest& request)
obs_data_set_string(boundsError, "type", "invalid"); obs_data_set_string(boundsError, "type", "invalid");
} }
} }
vec2 oldBounds; vec2 oldBounds;
obs_sceneitem_get_bounds(sceneItem, &oldBounds); obs_sceneitem_get_bounds(sceneItem, &oldBounds);
vec2 newBounds = oldBounds; vec2 newBounds = oldBounds;
if (obs_data_has_user_value(reqBounds, "x")) { if (obs_data_has_user_value(reqBounds, "x")) {
newBounds.x = obs_data_get_double(reqBounds, "x"); newBounds.x = obs_data_get_double(reqBounds, "x");
} }
if (obs_data_has_user_value(reqBounds, "y")) { if (obs_data_has_user_value(reqBounds, "y")) {
newBounds.y = obs_data_get_double(reqBounds, "y"); newBounds.y = obs_data_get_double(reqBounds, "y");
} }
obs_sceneitem_set_bounds(sceneItem, &newBounds); obs_sceneitem_set_bounds(sceneItem, &newBounds);
if (obs_data_has_user_value(reqBounds, "alignment")) { if (obs_data_has_user_value(reqBounds, "alignment")) {
const uint32_t bounds_alignment = obs_data_get_int(reqBounds, "alignment"); const uint32_t bounds_alignment = obs_data_get_int(reqBounds, "alignment");
if (Utils::IsValidAlignment(bounds_alignment)) { if (Utils::IsValidAlignment(bounds_alignment)) {
@ -245,6 +263,7 @@ RpcResponse WSRequestHandler::SetSceneItemProperties(const RpcRequest& request)
obs_data_set_string(boundsError, "alignment", "invalid"); obs_data_set_string(boundsError, "alignment", "invalid");
} }
} }
if (badBounds) { if (badBounds) {
obs_data_set_obj(errorData, "bounds", boundsError); obs_data_set_obj(errorData, "bounds", boundsError);
} }
@ -277,13 +296,15 @@ RpcResponse WSRequestHandler::ResetSceneItem(const RpcRequest& request) {
return request.failed("missing request parameters"); return request.failed("missing request parameters");
} }
const char* sceneName = obs_data_get_string(request.parameters(), "scene-name"); OBSData params = request.parameters();
const char* sceneName = obs_data_get_string(params, "scene-name");
OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName); OBSScene scene = Utils::GetSceneFromNameOrCurrent(sceneName);
if (!scene) { if (!scene) {
return request.failed("requested scene doesn't exist"); return request.failed("requested scene doesn't exist");
} }
OBSDataItemAutoRelease itemField = obs_data_item_byname(request.parameters(), "item"); OBSDataItemAutoRelease itemField = obs_data_item_byname(params, "item");
OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromRequestField(scene, itemField); OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromRequestField(scene, itemField);
if (!sceneItem) { if (!sceneItem) {
return request.failed("specified scene item doesn't exist"); return request.failed("specified scene item doesn't exist");