Browse Source

UI: Add ability to copy & paste filters from the mixer

Clayton Groeneveld 6 years ago
parent
commit
ad55f413bb
2 changed files with 51 additions and 1 deletions
  1. 47 0
      UI/window-basic-main.cpp
  2. 4 1
      UI/window-basic-main.hpp

+ 47 - 0
UI/window-basic-main.cpp

@@ -2775,6 +2775,9 @@ void OBSBasic::VolControlContextMenu()
 	QAction unhideAllAction(QTStr("UnhideAll"), this);
 	QAction mixerRenameAction(QTStr("Rename"), this);
 
+	QAction copyFiltersAction(QTStr("Copy.Filters"), this);
+	QAction pasteFiltersAction(QTStr("Paste.Filters"), this);
+
 	QAction filtersAction(QTStr("Filters"), this);
 	QAction propertiesAction(QTStr("Properties"), this);
 	QAction advPropAction(QTStr("Basic.MainMenu.Edit.AdvAudio"), this);
@@ -2796,6 +2799,13 @@ void OBSBasic::VolControlContextMenu()
 			this, &OBSBasic::MixerRenameSource,
 			Qt::DirectConnection);
 
+	connect(&copyFiltersAction, &QAction::triggered,
+			this, &OBSBasic::AudioMixerCopyFilters,
+			Qt::DirectConnection);
+	connect(&pasteFiltersAction, &QAction::triggered,
+			this, &OBSBasic::AudioMixerPasteFilters,
+			Qt::DirectConnection);
+
 	connect(&filtersAction, &QAction::triggered,
 			this, &OBSBasic::GetAudioSourceFilters,
 			Qt::DirectConnection);
@@ -2819,6 +2829,11 @@ void OBSBasic::VolControlContextMenu()
 	mixerRenameAction.setProperty("volControl",
 			QVariant::fromValue<VolControl*>(vol));
 
+	copyFiltersAction.setProperty("volControl",
+			QVariant::fromValue<VolControl*>(vol));
+	pasteFiltersAction.setProperty("volControl",
+			QVariant::fromValue<VolControl*>(vol));
+
 	filtersAction.setProperty("volControl",
 			QVariant::fromValue<VolControl*>(vol));
 	propertiesAction.setProperty("volControl",
@@ -2826,11 +2841,19 @@ void OBSBasic::VolControlContextMenu()
 
 	/* ------------------- */
 
+	if (copyFiltersString == nullptr)
+		pasteFiltersAction.setEnabled(false);
+	else
+		pasteFiltersAction.setEnabled(true);
+
 	QMenu popup;
 	popup.addAction(&unhideAllAction);
 	popup.addAction(&hideAction);
 	popup.addAction(&mixerRenameAction);
 	popup.addSeparator();
+	popup.addAction(&copyFiltersAction);
+	popup.addAction(&pasteFiltersAction);
+	popup.addSeparator();
 	popup.addAction(&toggleControlLayoutAction);
 	popup.addSeparator();
 	popup.addAction(&filtersAction);
@@ -6727,6 +6750,30 @@ void OBSBasic::on_actionPasteDup_triggered()
 	on_actionPasteTransform_triggered();
 }
 
+void OBSBasic::AudioMixerCopyFilters()
+{
+	QAction *action = reinterpret_cast<QAction*>(sender());
+	VolControl *vol = action->property("volControl").value<VolControl*>();
+	obs_source_t *source = vol->GetSource();
+
+	copyFiltersString = obs_source_get_name(source);
+}
+
+void OBSBasic::AudioMixerPasteFilters()
+{
+	QAction *action = reinterpret_cast<QAction*>(sender());
+	VolControl *vol = action->property("volControl").value<VolControl*>();
+	obs_source_t *dstSource = vol->GetSource();
+
+	OBSSource source = obs_get_source_by_name(copyFiltersString);
+	obs_source_release(source);
+
+	if (source == dstSource)
+		return;
+
+	obs_source_copy_filters(dstSource, source);
+}
+
 void OBSBasic::on_actionCopyFilters_triggered()
 {
 	OBSSceneItem item = GetCurrentSceneItem();

+ 4 - 1
UI/window-basic-main.hpp

@@ -155,7 +155,7 @@ private:
 	bool fullscreenInterface = false;
 
 	const char *copyString;
-	const char *copyFiltersString;
+	const char *copyFiltersString = nullptr;
 	bool copyVisible = true;
 
 	QScopedPointer<QThread> updateCheckThread;
@@ -518,6 +518,9 @@ private slots:
 
 	void on_actionShowAbout_triggered();
 
+	void AudioMixerCopyFilters();
+	void AudioMixerPasteFilters();
+
 private:
 	/* OBS Callbacks */
 	static void SceneReordered(void *data, calldata_t *params);