From 6c32e9a8c7b9ab4449f53d9cbfdc561412796e73 Mon Sep 17 00:00:00 2001 From: Anthony Torres Date: Fri, 4 Oct 2019 22:33:06 -0700 Subject: [PATCH] UI: Add copy/paste of multiple selected sources --- UI/window-basic-main.cpp | 60 +++++++++++++++++++++++++--------------- UI/window-basic-main.hpp | 4 ++- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 3143bd751..8389ce133 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -1047,7 +1047,7 @@ retryScene: opt_start_replaybuffer = false; } - copyString = nullptr; + copyStrings.clear(); copyFiltersString = nullptr; LogScenes(); @@ -5828,6 +5828,11 @@ int OBSBasic::GetTopSelectedSourceItem() return selectedItems.count() ? selectedItems[0].row() : -1; } +QModelIndexList OBSBasic::GetAllSelectedSourceItems() +{ + return ui->sources->selectionModel()->selectedIndexes(); +} + void OBSBasic::on_preview_customContextMenuRequested(const QPoint &pos) { CreateSourcePopupMenu(GetTopSelectedSourceItem(), true); @@ -7011,41 +7016,52 @@ bool OBSBasic::sysTrayMinimizeToTray() void OBSBasic::on_actionCopySource_triggered() { - OBSSceneItem item = GetCurrentSceneItem(); - if (!item) - return; + copyStrings.clear(); + bool allowPastingDuplicate = true; - on_actionCopyTransform_triggered(); + for (auto &selectedSource : GetAllSelectedSourceItems()) { + OBSSceneItem item = ui->sources->Get(selectedSource.row()); + if (!item) + continue; - OBSSource source = obs_sceneitem_get_source(item); + on_actionCopyTransform_triggered(); - copyString = obs_source_get_name(source); - copyVisible = obs_sceneitem_visible(item); + OBSSource source = obs_sceneitem_get_source(item); + + copyStrings.push_front(obs_source_get_name(source)); + + copyVisible = obs_sceneitem_visible(item); + + uint32_t output_flags = obs_source_get_output_flags(source); + if (!(output_flags & OBS_SOURCE_DO_NOT_DUPLICATE) == 0) + allowPastingDuplicate = false; + } ui->actionPasteRef->setEnabled(true); - - uint32_t output_flags = obs_source_get_output_flags(source); - if ((output_flags & OBS_SOURCE_DO_NOT_DUPLICATE) == 0) - ui->actionPasteDup->setEnabled(true); - else - ui->actionPasteDup->setEnabled(false); + ui->actionPasteDup->setEnabled(allowPastingDuplicate); } void OBSBasic::on_actionPasteRef_triggered() { - /* do not allow duplicate refs of the same group in the same scene */ - OBSScene scene = GetCurrentScene(); - if (!!obs_scene_get_group(scene, copyString)) - return; + for (auto ©String : copyStrings) { + /* do not allow duplicate refs of the same group in the same scene */ + OBSScene scene = GetCurrentScene(); + if (!!obs_scene_get_group(scene, copyString)) + continue; - OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, false); - on_actionPasteTransform_triggered(); + OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, + false); + on_actionPasteTransform_triggered(); + } } void OBSBasic::on_actionPasteDup_triggered() { - OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, true); - on_actionPasteTransform_triggered(); + for (auto ©String : copyStrings) { + OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, + true); + on_actionPasteTransform_triggered(); + } } void OBSBasic::AudioMixerCopyFilters() diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index d3eeab40a..1105f4a56 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -155,7 +155,7 @@ private: bool previewEnabled = true; bool fullscreenInterface = false; - const char *copyString; + std::list copyStrings; const char *copyFiltersString = nullptr; bool copyVisible = true; @@ -330,6 +330,8 @@ private: int GetTopSelectedSourceItem(); + QModelIndexList GetAllSelectedSourceItems(); + obs_hotkey_pair_id streamingHotkeys, recordingHotkeys, pauseHotkeys, replayBufHotkeys, togglePreviewHotkeys; obs_hotkey_id forceStreamingStopHotkey;