From 2ee4cc53beabe89729c66abe28c814341554ac4c Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 28 Aug 2015 15:01:39 -0700 Subject: [PATCH] UI: Implement scene duplication (context menu) --- obs/window-basic-main.cpp | 76 +++++++++++++++++++++++++++++++++++++++ obs/window-basic-main.hpp | 1 + 2 files changed, 77 insertions(+) diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index f1adc2978..0a08454e9 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -1324,6 +1324,23 @@ void OBSBasic::AddScene(OBSSource source) item->setData(static_cast(QtDataRole::OBSSignals), QVariant::fromValue(handlers)); + /* if the scene already has items (a duplicated scene) add them */ + auto addSceneItem = [this] (obs_sceneitem_t *item) + { + AddSceneItem(item); + }; + + using addSceneItem_t = decltype(addSceneItem); + + obs_scene_enum_items(scene, + [] (obs_scene_t*, obs_sceneitem_t *item, void *param) + { + addSceneItem_t *func; + func = reinterpret_cast(param); + (*func)(item); + return true; + }, &addSceneItem); + SaveProject(); } @@ -1668,6 +1685,63 @@ void OBSBasic::updateFileFinished(const QString &text, const QString &error) obs_data_release(returnData); } +void OBSBasic::DuplicateSelectedScene() +{ + OBSScene curScene = GetCurrentScene(); + + if (!curScene) + return; + + OBSSource curSceneSource = obs_scene_get_source(curScene); + QString format{obs_source_get_name(curSceneSource)}; + format += " %1"; + + int i = 2; + QString placeHolderText = format.arg(i); + obs_source_t *source = nullptr; + while ((source = obs_get_source_by_name(QT_TO_UTF8(placeHolderText)))) { + obs_source_release(source); + placeHolderText = format.arg(++i); + } + + for (;;) { + string name; + bool accepted = NameDialog::AskForName(this, + QTStr("Basic.Main.AddSceneDlg.Title"), + QTStr("Basic.Main.AddSceneDlg.Text"), + name, + placeHolderText); + if (!accepted) + return; + + if (name.empty()) { + QMessageBox::information(this, + QTStr("NoNameEntered.Title"), + QTStr("NoNameEntered.Text")); + continue; + } + + obs_source_t *source = obs_get_source_by_name(name.c_str()); + if (source) { + QMessageBox::information(this, + QTStr("NameExists.Title"), + QTStr("NameExists.Text")); + + obs_source_release(source); + continue; + } + + obs_scene_t *scene = obs_scene_duplicate(curScene, + name.c_str()); + source = obs_scene_get_source(scene); + obs_add_source(source); + obs_scene_release(scene); + + obs_set_output_source(0, source); + return; + } +} + void OBSBasic::RemoveSelectedScene() { OBSScene scene = GetCurrentScene(); @@ -2348,6 +2422,8 @@ void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos) if (item) { popup.addSeparator(); + popup.addAction(QTStr("Duplicate"), + this, SLOT(DuplicateSelectedScene())); popup.addAction(QTStr("Rename"), this, SLOT(EditSceneName())); popup.addAction(QTStr("Remove"), diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp index 739a18d02..94bd45bf5 100644 --- a/obs/window-basic-main.hpp +++ b/obs/window-basic-main.hpp @@ -217,6 +217,7 @@ private slots: void ActivateAudioSource(OBSSource source); void DeactivateAudioSource(OBSSource source); + void DuplicateSelectedScene(); void RemoveSelectedScene(); void RemoveSelectedSceneItem();