mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-11-15 03:36:53 -06:00
Support nested macro groups in undo / redo and import / export
This commit is contained in:
@@ -1290,17 +1290,13 @@ void Macro::SetHotkeysDesc() const
|
||||
|
||||
void SaveMacros(obs_data_t *obj)
|
||||
{
|
||||
obs_data_array_t *macroArray = obs_data_array_create();
|
||||
OBSDataArrayAutoRelease macroArray = obs_data_array_create();
|
||||
for (const auto &m : GetTopLevelMacros()) {
|
||||
obs_data_t *array_obj = obs_data_create();
|
||||
|
||||
OBSDataAutoRelease array_obj = obs_data_create();
|
||||
m->Save(array_obj);
|
||||
obs_data_array_push_back(macroArray, array_obj);
|
||||
|
||||
obs_data_release(array_obj);
|
||||
}
|
||||
obs_data_set_array(obj, "macros", macroArray);
|
||||
obs_data_array_release(macroArray);
|
||||
}
|
||||
|
||||
void LoadMacros(obs_data_t *obj)
|
||||
@@ -1308,16 +1304,15 @@ void LoadMacros(obs_data_t *obj)
|
||||
auto ¯os = GetTopLevelMacros();
|
||||
macros.clear();
|
||||
|
||||
obs_data_array_t *macroArray = obs_data_get_array(obj, "macros");
|
||||
OBSDataArrayAutoRelease macroArray = obs_data_get_array(obj, "macros");
|
||||
size_t count = obs_data_array_count(macroArray);
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
obs_data_t *array_obj = obs_data_array_item(macroArray, i);
|
||||
OBSDataAutoRelease array_obj =
|
||||
obs_data_array_item(macroArray, i);
|
||||
macros.emplace_back(std::make_shared<Macro>());
|
||||
macros.back()->Load(array_obj);
|
||||
obs_data_release(array_obj);
|
||||
}
|
||||
obs_data_array_release(macroArray);
|
||||
|
||||
Macro::RestoreGroupHierarchy(macros);
|
||||
for (const auto &m : macros) {
|
||||
@@ -1325,6 +1320,48 @@ void LoadMacros(obs_data_t *obj)
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::shared_ptr<Macro>> LoadImportedMacros(
|
||||
obs_data_array_t *array,
|
||||
const std::function<bool(const std::shared_ptr<Macro> &)> &shouldImport)
|
||||
{
|
||||
std::deque<std::shared_ptr<Macro>> loaded;
|
||||
auto &tempMacros = GetTemporaryMacros();
|
||||
const size_t count = obs_data_array_count(array);
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
tempMacros.clear();
|
||||
OBSDataAutoRelease obj = obs_data_array_item(array, i);
|
||||
auto macro = std::make_shared<Macro>();
|
||||
tempMacros.emplace_back(macro);
|
||||
macro->Load(obj);
|
||||
RunAndClearPostLoadSteps();
|
||||
loaded.emplace_back(macro);
|
||||
}
|
||||
tempMacros.clear();
|
||||
Macro::RestoreGroupHierarchy(loaded);
|
||||
|
||||
std::vector<std::shared_ptr<Macro>> imported;
|
||||
for (const auto ¯o : loaded) {
|
||||
if (!shouldImport(macro)) {
|
||||
for (const auto &child : loaded) {
|
||||
if (child->Parent() == macro) {
|
||||
Macro::PrepareMoveToGroup(
|
||||
macro->Parent(), child);
|
||||
}
|
||||
}
|
||||
Macro::PrepareMoveToGroup(nullptr, macro);
|
||||
continue;
|
||||
}
|
||||
GetTopLevelMacros().emplace_back(macro);
|
||||
imported.emplace_back(macro);
|
||||
}
|
||||
|
||||
for (const auto ¯o : imported) {
|
||||
macro->PostLoad();
|
||||
}
|
||||
RunAndClearPostLoadSteps();
|
||||
return imported;
|
||||
}
|
||||
|
||||
bool CheckMacros()
|
||||
{
|
||||
bool matchFound = false;
|
||||
|
||||
Reference in New Issue
Block a user