mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-19 17:49:14 +00:00
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.
This commit is contained in:
parent
4d61fa9a4c
commit
3d63096076
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -81,6 +81,7 @@ class OBSBasic : public OBSMainWindow {
|
|||
|
||||
friend class OBSBasicPreview;
|
||||
friend class OBSBasicStatusBar;
|
||||
friend class OBSBasicSourceSelect;
|
||||
|
||||
enum class MoveDir {
|
||||
Up,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue