1
0
Эх сурвалжийг харах

UI: Add undo/redo to dropfiles

gxalpha 3 жил өмнө
parent
commit
45f737fb30

+ 28 - 4
UI/window-basic-main-dropfiles.cpp

@@ -118,7 +118,6 @@ void OBSBasic::AddDropSource(const char *data, DropType image)
 {
 	OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
 	OBSDataAutoRelease settings = obs_data_create();
-	OBSSourceAutoRelease source = nullptr;
 	const char *type = nullptr;
 	std::vector<const char *> 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);
 	}
 }