Procházet zdrojové kódy

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.
jp9000 před 9 roky
rodič
revize
3d63096076

+ 2 - 2
obs/forms/OBSBasicSourceSelect.ui

@@ -20,7 +20,7 @@
    <item>
     <layout class="QVBoxLayout" name="verticalLayout_2">
      <item>
-      <widget class="QRadioButton" name="radioButton">
+      <widget class="QRadioButton" name="createNew">
        <property name="text">
         <string>Basic.SourceSelect.CreateNew</string>
        </property>
@@ -73,7 +73,7 @@
  <resources/>
  <connections>
   <connection>
-   <sender>radioButton</sender>
+   <sender>createNew</sender>
    <signal>toggled(bool)</signal>
    <receiver>sourceName</receiver>
    <slot>setEnabled(bool)</slot>

+ 8 - 5
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;

+ 1 - 0
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,

+ 41 - 2
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 <typename T>
+static inline T GetOBSRef(QListWidgetItem *item)
+{
+	return item->data(static_cast<int>(QtDataRole::OBSRef)).value<T>();
+}
+
 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<OBSBasic*>(
+				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<OBSScene>(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);
+	}
 }