Skip to content

Commit c6a4675

Browse files
committed
frontend: fix group duplication and filter paste
1 parent f8ade6b commit c6a4675

1 file changed

Lines changed: 36 additions & 4 deletions

File tree

frontend/utility/OBSClipboardService.cpp

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <QMimeData>
99

1010
#include <cstring>
11+
#include <string>
1112

1213
namespace {
1314
OBSDataAutoRelease CloneData(obs_data_t *data)
@@ -37,7 +38,23 @@ OBSSourceAutoRelease ResolveReferencedSource(obs_data_t *sourceData)
3738
bool CanLoadDuplicateSource(obs_data_t *sourceData)
3839
{
3940
const char *id = obs_data_get_string(sourceData, "id");
40-
return id && *id && strcmp(id, "group") != 0;
41+
return id && *id;
42+
}
43+
44+
std::string GetUniqueFilterName(obs_source_t *destination, const char *name)
45+
{
46+
std::string uniqueName = name;
47+
int suffix = 1;
48+
49+
for (;;) {
50+
OBSSourceAutoRelease existing = obs_source_get_filter_by_name(destination, uniqueName.c_str());
51+
if (!existing) {
52+
break;
53+
}
54+
uniqueName = std::string(name) + " " + std::to_string(++suffix);
55+
}
56+
57+
return uniqueName;
4158
}
4259

4360
void PrepareRootSceneItem(obs_data_array_t *items, obs_source_t *source = nullptr)
@@ -234,7 +251,22 @@ void OBSClipboardService::pasteFilters(OBSSource destination)
234251
if (!OBSClipboardSerializer::DeserializeFilters(payload, filters)) {
235252
return;
236253
}
237-
obs_source_restore_filters(destination, filters);
254+
255+
for (size_t i = obs_data_array_count(filters); i > 0; i--) {
256+
OBSDataAutoRelease serializedFilter = obs_data_array_item(filters, i - 1);
257+
OBSDataAutoRelease filterData = CloneData(serializedFilter);
258+
if (!filterData) {
259+
continue;
260+
}
261+
262+
const std::string name = GetUniqueFilterName(destination, obs_data_get_string(filterData, "name"));
263+
obs_data_set_string(filterData, "name", name.c_str());
264+
obs_data_erase(filterData, "uuid");
265+
OBSSourceAutoRelease filter = obs_load_private_source(filterData);
266+
if (filter) {
267+
obs_source_filter_add(destination, filter);
268+
}
269+
}
238270
}
239271

240272
void OBSClipboardService::pasteTransform(const std::vector<OBSSceneItem> &items)
@@ -244,8 +276,8 @@ void OBSClipboardService::pasteTransform(const std::vector<OBSSceneItem> &items)
244276
return;
245277
}
246278

247-
obs_transform_info transform;
248-
obs_sceneitem_crop crop;
279+
obs_transform_info transform = {};
280+
obs_sceneitem_crop crop = {};
249281

250282
if (!OBSClipboardSerializer::DeserializeTransform(payload, transform, crop))
251283
return;

0 commit comments

Comments
 (0)