From 3d6309607602061da7ef77be4a322339b7e8dd97 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 1 Jul 2016 15:23:06 -0700 Subject: [PATCH] UI: Allow adding scenes as scene items Allows adding scenes as scene items. Note that you will not be able to add scenes if it detects infinite recursion (i.e. adding scene A to scene B, then adding scene B to scene A), in that case it will just fail to create the scene item. --- obs/forms/OBSBasicSourceSelect.ui | 4 +-- obs/window-basic-main.cpp | 13 +++++---- obs/window-basic-main.hpp | 1 + obs/window-basic-source-select.cpp | 43 ++++++++++++++++++++++++++++-- 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/obs/forms/OBSBasicSourceSelect.ui b/obs/forms/OBSBasicSourceSelect.ui index 455cfd88f..07f64ab47 100644 --- a/obs/forms/OBSBasicSourceSelect.ui +++ b/obs/forms/OBSBasicSourceSelect.ui @@ -20,7 +20,7 @@ - + Basic.SourceSelect.CreateNew @@ -73,7 +73,7 @@ - radioButton + createNew toggled(bool) sourceName setEnabled(bool) diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index 30878deba..cfc3983b0 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -3050,21 +3050,24 @@ QMenu *OBSBasic::CreateAddSourcePopupMenu() size_t idx = 0; QMenu *popup = new QMenu(QTStr("Add"), this); - while (obs_enum_input_types(idx++, &type)) { - const char *name = obs_source_get_display_name(type); - - if (strcmp(type, "scene") == 0) - continue; + auto addSource = [this, popup] (const char *type, const char *name) { QAction *popupItem = new QAction(QT_UTF8(name), this); popupItem->setData(QT_UTF8(type)); connect(popupItem, SIGNAL(triggered(bool)), this, SLOT(AddSourceFromAction())); popup->addAction(popupItem); + }; + while (obs_enum_input_types(idx++, &type)) { + const char *name = obs_source_get_display_name(type); + + addSource(type, name); foundValues = true; } + addSource("scene", Str("Basic.Scene")); + if (!foundValues) { delete popup; popup = nullptr; diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp index 581164212..b84d16432 100644 --- a/obs/window-basic-main.hpp +++ b/obs/window-basic-main.hpp @@ -81,6 +81,7 @@ class OBSBasic : public OBSMainWindow { friend class OBSBasicPreview; friend class OBSBasicStatusBar; + friend class OBSBasicSourceSelect; enum class MoveDir { Up, diff --git a/obs/window-basic-source-select.cpp b/obs/window-basic-source-select.cpp index c27727ae3..826fb8bbb 100644 --- a/obs/window-basic-source-select.cpp +++ b/obs/window-basic-source-select.cpp @@ -177,6 +177,21 @@ void OBSBasicSourceSelect::on_buttonBox_rejected() done(DialogCode::Rejected); } +static inline const char *GetSourceDisplayName(const char *id) +{ + if (strcmp(id, "scene") == 0) + return Str("Basic.Scene"); + return obs_source_get_display_name(id); +} + +Q_DECLARE_METATYPE(OBSScene); + +template +static inline T GetOBSRef(QListWidgetItem *item) +{ + return item->data(static_cast(QtDataRole::OBSRef)).value(); +} + OBSBasicSourceSelect::OBSBasicSourceSelect(OBSBasic *parent, const char *id_) : QDialog (parent), ui (new Ui::OBSBasicSourceSelect), @@ -186,7 +201,7 @@ OBSBasicSourceSelect::OBSBasicSourceSelect(OBSBasic *parent, const char *id_) ui->sourceList->setAttribute(Qt::WA_MacShowFocusRect, false); - QString placeHolderText{QT_UTF8(obs_source_get_display_name(id))}; + QString placeHolderText{QT_UTF8(GetSourceDisplayName(id))}; QString text{placeHolderText}; int i = 1; @@ -202,5 +217,29 @@ OBSBasicSourceSelect::OBSBasicSourceSelect(OBSBasic *parent, const char *id_) installEventFilter(CreateShortcutFilter()); - obs_enum_sources(EnumSources, this); + if (strcmp(id_, "scene") == 0) { + OBSBasic *main = reinterpret_cast( + App()->GetMainWindow()); + OBSSource curSceneSource = main->GetCurrentSceneSource(); + + ui->selectExisting->setChecked(true); + ui->createNew->setChecked(false); + ui->createNew->setEnabled(false); + ui->sourceName->setEnabled(false); + + int count = main->ui->scenes->count(); + for (int i = 0; i < count; i++) { + QListWidgetItem *item = main->ui->scenes->item(i); + OBSScene scene = GetOBSRef(item); + OBSSource sceneSource = obs_scene_get_source(scene); + + if (curSceneSource == sceneSource) + continue; + + const char *name = obs_source_get_name(sceneSource); + ui->sourceList->addItem(QT_UTF8(name)); + } + } else { + obs_enum_sources(EnumSources, this); + } }