From f55b251fa8da4bc1304e48293b947f02998ad038 Mon Sep 17 00:00:00 2001 From: derrod Date: Sat, 4 Mar 2023 18:22:21 +0100 Subject: [PATCH] UI: Sort and pretty-print exported collections --- UI/window-basic-main-scene-collections.cpp | 42 ++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/UI/window-basic-main-scene-collections.cpp b/UI/window-basic-main-scene-collections.cpp index a41ec8aea..b00682c5f 100644 --- a/UI/window-basic-main-scene-collections.cpp +++ b/UI/window-basic-main-scene-collections.cpp @@ -397,10 +397,46 @@ void OBSBasic::on_actionExportSceneCollection_triggered() string file = QT_TO_UTF8(exportFile); if (!exportFile.isEmpty() && !exportFile.isNull()) { - if (QFile::exists(exportFile)) - QFile::remove(exportFile); + QString inputFile = path + currentFile + ".json"; - QFile::copy(path + currentFile + ".json", exportFile); + OBSDataAutoRelease collection = + obs_data_create_from_json_file(QT_TO_UTF8(inputFile)); + + OBSDataArrayAutoRelease sources = + obs_data_get_array(collection, "sources"); + if (!sources) { + blog(LOG_WARNING, + "No sources in exported scene collection"); + return; + } + obs_data_erase(collection, "sources"); + + // We're just using std::sort on a vector to make life easier. + vector sourceItems; + obs_data_array_enum( + sources, + [](obs_data_t *data, void *pVec) -> void { + auto &sourceItems = + *static_cast *>(pVec); + sourceItems.push_back(data); + }, + &sourceItems); + + std::sort(sourceItems.begin(), sourceItems.end(), + [](const OBSData &a, const OBSData &b) { + return astrcmpi(obs_data_get_string(a, + "name"), + obs_data_get_string( + b, "name")) < 0; + }); + + OBSDataArrayAutoRelease newSources = obs_data_array_create(); + for (auto &item : sourceItems) + obs_data_array_push_back(newSources, item); + + obs_data_set_array(collection, "sources", newSources); + obs_data_save_json_pretty_safe( + collection, QT_TO_UTF8(exportFile), "tmp", "bak"); } }