mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
requests(ReorderSceneItems): atomic reorder + bring back GetSceneItemFromId
This commit is contained in:
parent
cee0cbebc2
commit
73b5261c49
@ -185,7 +185,7 @@ obs_sceneitem_t* Utils::GetSceneItemFromItem(obs_scene_t* scene, obs_data_t* ite
|
|||||||
const char* name = obs_data_item_get_string(nameInfoItem);
|
const char* name = obs_data_item_get_string(nameInfoItem);
|
||||||
|
|
||||||
if (idInfoItem) {
|
if (idInfoItem) {
|
||||||
obs_sceneitem_t* sceneItem = obs_scene_find_sceneitem_by_id(scene, id);
|
obs_sceneitem_t* sceneItem = GetSceneItemFromId(scene, id);
|
||||||
obs_source_t* sceneItemSource = obs_sceneitem_get_source(sceneItem);
|
obs_source_t* sceneItemSource = obs_sceneitem_get_source(sceneItem);
|
||||||
|
|
||||||
QString sceneItemName = obs_source_get_name(sceneItemSource);
|
QString sceneItemName = obs_source_get_name(sceneItemSource);
|
||||||
@ -215,7 +215,6 @@ obs_sceneitem_t* Utils::GetSceneItemFromName(obs_scene_t* scene, QString name) {
|
|||||||
current_search search;
|
current_search search;
|
||||||
search.query = name;
|
search.query = name;
|
||||||
search.result = nullptr;
|
search.result = nullptr;
|
||||||
search.enumCallback = nullptr;
|
|
||||||
|
|
||||||
search.enumCallback = [](
|
search.enumCallback = [](
|
||||||
obs_scene_t* scene,
|
obs_scene_t* scene,
|
||||||
@ -248,6 +247,49 @@ obs_sceneitem_t* Utils::GetSceneItemFromName(obs_scene_t* scene, QString name) {
|
|||||||
return search.result;
|
return search.result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
obs_sceneitem_t* Utils::GetSceneItemFromId(obs_scene_t* scene, int64_t id) {
|
||||||
|
if (!scene) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct current_search {
|
||||||
|
int query;
|
||||||
|
obs_sceneitem_t* result;
|
||||||
|
bool (*enumCallback)(obs_scene_t*, obs_sceneitem_t*, void*);
|
||||||
|
};
|
||||||
|
|
||||||
|
current_search search;
|
||||||
|
search.query = id;
|
||||||
|
search.result = nullptr;
|
||||||
|
|
||||||
|
search.enumCallback = [](
|
||||||
|
obs_scene_t* scene,
|
||||||
|
obs_sceneitem_t* currentItem,
|
||||||
|
void* param)
|
||||||
|
{
|
||||||
|
current_search* search = reinterpret_cast<current_search*>(param);
|
||||||
|
|
||||||
|
if (obs_sceneitem_is_group(currentItem)) {
|
||||||
|
obs_sceneitem_group_enum_items(currentItem, search->enumCallback, search);
|
||||||
|
if (search->result) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obs_sceneitem_get_id(currentItem) == search->query) {
|
||||||
|
search->result = currentItem;
|
||||||
|
obs_sceneitem_addref(search->result);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
obs_scene_enum_items(scene, search.enumCallback, &search);
|
||||||
|
|
||||||
|
return search.result;
|
||||||
|
}
|
||||||
|
|
||||||
bool Utils::IsValidAlignment(const uint32_t alignment) {
|
bool Utils::IsValidAlignment(const uint32_t alignment) {
|
||||||
switch (alignment) {
|
switch (alignment) {
|
||||||
case OBS_ALIGN_CENTER:
|
case OBS_ALIGN_CENTER:
|
||||||
|
@ -37,7 +37,10 @@ class Utils {
|
|||||||
static obs_data_array_t* GetSceneItems(obs_source_t* source);
|
static obs_data_array_t* GetSceneItems(obs_source_t* source);
|
||||||
static obs_data_t* GetSceneItemData(obs_sceneitem_t* item);
|
static obs_data_t* GetSceneItemData(obs_sceneitem_t* item);
|
||||||
|
|
||||||
|
// These two functions support nested lookup into groups
|
||||||
static obs_sceneitem_t* GetSceneItemFromName(obs_scene_t* scene, QString name);
|
static obs_sceneitem_t* GetSceneItemFromName(obs_scene_t* scene, QString name);
|
||||||
|
static obs_sceneitem_t* GetSceneItemFromId(obs_scene_t* scene, int64_t id);
|
||||||
|
|
||||||
static obs_sceneitem_t* GetSceneItemFromItem(obs_scene_t* scene, obs_data_t* item);
|
static obs_sceneitem_t* GetSceneItemFromItem(obs_scene_t* scene, obs_data_t* item);
|
||||||
static obs_scene_t* GetSceneFromNameOrCurrent(QString sceneName);
|
static obs_scene_t* GetSceneFromNameOrCurrent(QString sceneName);
|
||||||
static obs_data_t* GetSceneItemPropertiesData(obs_sceneitem_t* item);
|
static obs_data_t* GetSceneItemPropertiesData(obs_sceneitem_t* item);
|
||||||
|
@ -104,26 +104,46 @@ HandlerResponse WSRequestHandler::HandleReorderSceneItems(WSRequestHandler* req)
|
|||||||
return req->SendErrorResponse("sceneItem order not specified");
|
return req->SendErrorResponse("sceneItem order not specified");
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<struct obs_sceneitem_order_info> orderList;
|
struct reorder_context {
|
||||||
struct obs_sceneitem_order_info info;
|
obs_data_array_t* items;
|
||||||
|
bool success;
|
||||||
|
QString errorMessage;
|
||||||
|
};
|
||||||
|
|
||||||
size_t itemCount = obs_data_array_count(items);
|
struct reorder_context ctx;
|
||||||
for (int i = 0; i < itemCount; i++) {
|
ctx.success = false;
|
||||||
OBSDataAutoRelease item = obs_data_array_item(items, i);
|
ctx.items = items;
|
||||||
|
|
||||||
OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(scene, item);
|
obs_scene_atomic_update(scene, [](void* param, obs_scene_t* scene) {
|
||||||
if (!sceneItem) {
|
auto ctx = reinterpret_cast<struct reorder_context*>(param);
|
||||||
return req->SendErrorResponse("Invalid sceneItem id or name specified");
|
|
||||||
|
QVector<struct obs_sceneitem_order_info> orderList;
|
||||||
|
struct obs_sceneitem_order_info info;
|
||||||
|
|
||||||
|
size_t itemCount = obs_data_array_count(ctx->items);
|
||||||
|
for (int i = 0; i < itemCount; i++) {
|
||||||
|
OBSDataAutoRelease item = obs_data_array_item(ctx->items, i);
|
||||||
|
|
||||||
|
OBSSceneItemAutoRelease sceneItem = Utils::GetSceneItemFromItem(scene, item);
|
||||||
|
if (!sceneItem) {
|
||||||
|
ctx->success = false;
|
||||||
|
ctx->errorMessage = "Invalid sceneItem id or name specified";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.group = nullptr;
|
||||||
|
info.item = sceneItem;
|
||||||
|
orderList.insert(0, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
info.group = nullptr;
|
ctx->success = obs_scene_reorder_items2(scene, orderList.data(), orderList.size());
|
||||||
info.item = sceneItem;
|
if (!ctx->success) {
|
||||||
orderList.insert(0, info);
|
ctx->errorMessage = "Invalid sceneItem order";
|
||||||
}
|
}
|
||||||
|
}, &ctx);
|
||||||
|
|
||||||
bool success = obs_scene_reorder_items2(scene, orderList.data(), orderList.size());
|
if (!ctx.success) {
|
||||||
if (!success) {
|
return req->SendErrorResponse(ctx.errorMessage);
|
||||||
return req->SendErrorResponse("Invalid sceneItem order");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return req->SendOKResponse();
|
return req->SendOKResponse();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user