diff --git a/UI/window-basic-main-dropfiles.cpp b/UI/window-basic-main-dropfiles.cpp index ddb339fa5..98b7579ad 100644 --- a/UI/window-basic-main-dropfiles.cpp +++ b/UI/window-basic-main-dropfiles.cpp @@ -118,7 +118,6 @@ void OBSBasic::AddDropSource(const char *data, DropType image) { OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); OBSDataAutoRelease settings = obs_data_create(); - OBSSourceAutoRelease source = nullptr; const char *type = nullptr; std::vector types; QString name; @@ -183,11 +182,36 @@ void OBSBasic::AddDropSource(const char *data, DropType image) if (name.isEmpty()) name = obs_source_get_display_name(type); - source = obs_source_create(type, - GenerateSourceName(QT_TO_UTF8(name)).c_str(), - settings, nullptr); + std::string sourceName = GenerateSourceName(QT_TO_UTF8(name)); + OBSSourceAutoRelease source = + obs_source_create(type, sourceName.c_str(), settings, nullptr); if (source) { OBSScene scene = main->GetCurrentScene(); + const char *sceneName = + obs_source_get_name(obs_scene_get_source(scene)); + auto undo = [sceneName, sourceName](const std::string &) { + OBSSourceAutoRelease source = + obs_get_source_by_name(sourceName.c_str()); + obs_source_remove(source); + OBSSourceAutoRelease scene = + obs_get_source_by_name(sceneName); + OBSBasic::Get()->SetCurrentScene(scene.Get(), true); + }; + auto redo = [sceneName, sourceName, + type](const std::string &data) { + OBSSourceAutoRelease scene = + obs_get_source_by_name(sceneName); + OBSBasic::Get()->SetCurrentScene(scene.Get(), true); + OBSDataAutoRelease settings = + obs_data_create_from_json(data.c_str()); + OBSSourceAutoRelease source = obs_source_create( + type, sourceName.c_str(), settings, nullptr); + obs_scene_add(obs_scene_from_source(scene), + source.Get()); + }; + undo_s.add_action(QTStr("Undo.Add").arg(sourceName.c_str()), + undo, redo, "", + std::string(obs_data_get_json(settings))); obs_scene_add(scene, source); } }