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

UI: Fix audio filters being deleted not getting added to undo

Ford Smith 4 жил өмнө
parent
commit
92745a1009

+ 62 - 68
UI/window-basic-filters.cpp

@@ -773,7 +773,7 @@ void OBSBasicFilters::on_removeAsyncFilter_clicked()
 	OBSSource filter = GetFilter(ui->asyncFilters->currentRow(), true);
 	if (filter) {
 		if (QueryRemove(this, filter))
-			obs_source_filter_remove(source, filter);
+			delete_filter(filter);
 	}
 }
 
@@ -815,73 +815,7 @@ void OBSBasicFilters::on_removeEffectFilter_clicked()
 	OBSSource filter = GetFilter(ui->effectFilters->currentRow(), false);
 	if (filter) {
 		if (QueryRemove(this, filter)) {
-			obs_data_t *wrapper = obs_save_source(filter);
-			std::string parent_name(obs_source_get_name(source));
-			obs_data_set_string(wrapper, "undo_name",
-					    parent_name.c_str());
-
-			std::string scene_name = obs_source_get_name(
-				reinterpret_cast<OBSBasic *>(
-					App()->GetMainWindow())
-					->GetCurrentSceneSource());
-			auto undo = [scene_name](const std::string &data) {
-				obs_source_t *ssource = obs_get_source_by_name(
-					scene_name.c_str());
-				reinterpret_cast<OBSBasic *>(
-					App()->GetMainWindow())
-					->SetCurrentScene(ssource, true);
-				obs_source_release(ssource);
-
-				obs_data_t *dat =
-					obs_data_create_from_json(data.c_str());
-				obs_source_t *source = obs_get_source_by_name(
-					obs_data_get_string(dat, "undo_name"));
-				obs_source_t *filter = obs_load_source(dat);
-				obs_source_filter_add(source, filter);
-
-				obs_data_release(dat);
-				obs_source_release(source);
-				obs_source_release(filter);
-			};
-
-			obs_data_t *rwrapper = obs_data_create();
-			obs_data_set_string(rwrapper, "fname",
-					    obs_source_get_name(filter));
-			obs_data_set_string(rwrapper, "sname",
-					    parent_name.c_str());
-			auto redo = [scene_name](const std::string &data) {
-				obs_source_t *ssource = obs_get_source_by_name(
-					scene_name.c_str());
-				reinterpret_cast<OBSBasic *>(
-					App()->GetMainWindow())
-					->SetCurrentScene(ssource, true);
-				obs_source_release(ssource);
-
-				obs_data_t *dat =
-					obs_data_create_from_json(data.c_str());
-				obs_source_t *source = obs_get_source_by_name(
-					obs_data_get_string(dat, "sname"));
-				obs_source_t *filter =
-					obs_source_get_filter_by_name(
-						source, obs_data_get_string(
-								dat, "fname"));
-				obs_source_filter_remove(source, filter);
-
-				obs_data_release(dat);
-				obs_source_release(filter);
-				obs_source_release(source);
-			};
-
-			std::string undo_data(obs_data_get_json(wrapper));
-			std::string redo_data(obs_data_get_json(rwrapper));
-			main->undo_s.add_action(
-				QTStr("Undo.Delete")
-					.arg(obs_source_get_name(filter)),
-				undo, redo, undo_data, redo_data);
-			obs_source_filter_remove(source, filter);
-
-			obs_data_release(wrapper);
-			obs_data_release(rwrapper);
+			delete_filter(filter);
 		}
 	}
 }
@@ -1228,3 +1162,63 @@ void OBSBasicFilters::PasteFilter()
 
 	obs_source_copy_single_filter(source, filter);
 }
+
+void OBSBasicFilters::delete_filter(OBSSource filter)
+{
+	obs_data_t *wrapper = obs_save_source(filter);
+	std::string parent_name(obs_source_get_name(source));
+	obs_data_set_string(wrapper, "undo_name", parent_name.c_str());
+
+	std::string scene_name = obs_source_get_name(
+		reinterpret_cast<OBSBasic *>(App()->GetMainWindow())
+			->GetCurrentSceneSource());
+	auto undo = [scene_name](const std::string &data) {
+		obs_source_t *ssource =
+			obs_get_source_by_name(scene_name.c_str());
+		reinterpret_cast<OBSBasic *>(App()->GetMainWindow())
+			->SetCurrentScene(ssource, true);
+		obs_source_release(ssource);
+
+		obs_data_t *dat = obs_data_create_from_json(data.c_str());
+		obs_source_t *source = obs_get_source_by_name(
+			obs_data_get_string(dat, "undo_name"));
+		obs_source_t *filter = obs_load_source(dat);
+		obs_source_filter_add(source, filter);
+
+		obs_data_release(dat);
+		obs_source_release(source);
+		obs_source_release(filter);
+	};
+
+	obs_data_t *rwrapper = obs_data_create();
+	obs_data_set_string(rwrapper, "fname", obs_source_get_name(filter));
+	obs_data_set_string(rwrapper, "sname", parent_name.c_str());
+	auto redo = [scene_name](const std::string &data) {
+		obs_source_t *ssource =
+			obs_get_source_by_name(scene_name.c_str());
+		reinterpret_cast<OBSBasic *>(App()->GetMainWindow())
+			->SetCurrentScene(ssource, true);
+		obs_source_release(ssource);
+
+		obs_data_t *dat = obs_data_create_from_json(data.c_str());
+		obs_source_t *source = obs_get_source_by_name(
+			obs_data_get_string(dat, "sname"));
+		obs_source_t *filter = obs_source_get_filter_by_name(
+			source, obs_data_get_string(dat, "fname"));
+		obs_source_filter_remove(source, filter);
+
+		obs_data_release(dat);
+		obs_source_release(filter);
+		obs_source_release(source);
+	};
+
+	std::string undo_data(obs_data_get_json(wrapper));
+	std::string redo_data(obs_data_get_json(rwrapper));
+	main->undo_s.add_action(
+		QTStr("Undo.Delete").arg(obs_source_get_name(filter)), undo,
+		redo, undo_data, redo_data, NULL);
+	obs_source_filter_remove(source, filter);
+
+	obs_data_release(wrapper);
+	obs_data_release(rwrapper);
+}

+ 2 - 0
UI/window-basic-filters.hpp

@@ -71,6 +71,8 @@ private:
 
 	void FilterNameEdited(QWidget *editor, QListWidget *list);
 
+	void delete_filter(OBSSource filter);
+
 	bool isAsync;
 
 	int noPreviewMargin;