From 59603f47ad61007d01f15e85ec917fdaa5da13a8 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 23 Apr 2021 12:40:33 -0700 Subject: [PATCH] UI: Use scene backup/undo/redo funcs for reordering Fixes a bug where groups would not be backed up properly --- UI/source-tree.cpp | 66 ++++------------------------------------------ 1 file changed, 5 insertions(+), 61 deletions(-) diff --git a/UI/source-tree.cpp b/UI/source-tree.cpp index b7afec3c9..48f71c204 100644 --- a/UI/source-tree.cpp +++ b/UI/source-tree.cpp @@ -1136,17 +1136,6 @@ void SourceTree::mouseDoubleClickEvent(QMouseEvent *event) QListView::mouseDoubleClickEvent(event); } -static void hold_source(obs_source_t *, obs_source_t *source, void *p) -{ - if (obs_obj_is_private(source) && !obs_source_removed(source)) - return; - - using source_list_t = std::vector; - source_list_t &sources = *reinterpret_cast(p); - sources.push_back(source); - obs_source_addref(source); -} - void SourceTree::dropEvent(QDropEvent *event) { if (event->source() != this) { @@ -1154,6 +1143,8 @@ void SourceTree::dropEvent(QDropEvent *event) return; } + OBSBasic *main = OBSBasic::Get(); + OBSScene scene = GetCurrentScene(); obs_source_t *scenesource = obs_scene_get_source(scene); SourceTreeModel *stm = GetStm(); @@ -1256,13 +1247,7 @@ void SourceTree::dropEvent(QDropEvent *event) /* --------------------------------------- */ /* save undo data */ - OBSData undo_settings = obs_data_create(); - obs_data_release(undo_settings); - - /* 'apply' is equivalent to a full copy */ - obs_data_t *settings = obs_source_get_settings(scenesource); - obs_data_apply(undo_settings, settings); - obs_data_release(settings); + OBSData undo_data = main->BackupScene(scenesource); /* --------------------------------------- */ /* if selection includes base group items, */ @@ -1430,55 +1415,14 @@ void SourceTree::dropEvent(QDropEvent *event) /* --------------------------------------- */ /* save redo data */ - obs_source_save(scenesource); - OBSData redo_settings = obs_source_get_settings(scenesource); - obs_data_release(redo_settings); + OBSData redo_data = main->BackupScene(scenesource); /* --------------------------------------- */ /* add undo/redo action */ - auto undo_redo = [this](const std::string &json) { - obs_data_t *base = obs_data_create_from_json(json.c_str()); - const char *scene_name = obs_data_get_string(base, "name"); - obs_data_t *settings = obs_data_get_obj(base, "settings"); - obs_source_t *scenesource = obs_get_source_by_name(scene_name); - std::vector sources; - - /* save sources, add refs to them */ - obs_source_enum_full_tree(scenesource, hold_source, &sources); - - /* update scene to old order */ - obs_source_update(scenesource, settings); - obs_source_load(scenesource); - - /* release sources */ - for (obs_source_t *source : sources) - obs_source_release(source); - - QMetaObject::invokeMethod(this, "ReorderItems", - Qt::QueuedConnection); - - obs_source_release(scenesource); - obs_data_release(settings); - obs_data_release(base); - }; - - OBSData undo_data = obs_data_create(); - OBSData redo_data = obs_data_create(); - obs_data_release(undo_data); - obs_data_release(redo_data); - const char *scene_name = obs_source_get_name(scenesource); - obs_data_set_string(undo_data, "name", scene_name); - obs_data_set_string(redo_data, "name", scene_name); - obs_data_set_obj(undo_data, "settings", undo_settings); - obs_data_set_obj(redo_data, "settings", redo_settings); - QString action_name = QTStr("Undo.ReorderSources").arg(scene_name); - OBSBasic::Get()->undo_s.add_action(action_name, undo_redo, undo_redo, - obs_data_get_json(undo_data), - obs_data_get_json(redo_data), - nullptr); + main->CreateSceneUndoRedoAction(action_name, undo_data, redo_data); /* --------------------------------------- */ /* remove items if dropped in to collapsed */