diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index ef12a94a2..84442e874 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -558,6 +558,7 @@ Basic.Settings.General.SysTrayWhenStarted="Minimize to system tray when started"
Basic.Settings.General.SystemTrayHideMinimize="Always minimize to system tray instead of task bar"
Basic.Settings.General.SaveProjectors="Save projectors on exit"
Basic.Settings.General.SwitchOnDoubleClick="Transition to scene when double-clicked"
+Basic.Settings.General.StudioPortraitLayout="Enable portrait/vertical layout"
# basic mode 'stream' settings
Basic.Settings.Stream="Stream"
diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index 251bdcf56..05c48fb34 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -146,7 +146,7 @@
0
0
801
- 698
+ 715
@@ -572,6 +572,13 @@
+ -
+
+
+ Basic.Settings.General.StudioPortraitLayout
+
+
+
@@ -3349,7 +3356,7 @@
0
0
- 80
+ 63
16
@@ -3733,7 +3740,7 @@
0
0
- 593
+ 803
761
diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp
index b65c14485..06ec0ace1 100644
--- a/UI/window-basic-main-transitions.cpp
+++ b/UI/window-basic-main-transitions.cpp
@@ -1016,6 +1016,7 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
ui->previewLayout->addWidget(programOptions);
ui->previewLayout->addWidget(program);
+ ui->previewLayout->setAlignment(programOptions, Qt::AlignCenter);
program->show();
if (api)
@@ -1059,6 +1060,7 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
"-------------------");
}
+ ResetUI();
UpdateTitleBar();
}
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index d6a03fc33..da77c7d68 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -2986,6 +2986,17 @@ static inline enum video_format GetVideoFormatFromName(const char *name)
return VIDEO_FORMAT_RGBA;
}
+void OBSBasic::ResetUI()
+{
+ bool studioPortraitLayout = config_get_bool(GetGlobalConfig(),
+ "BasicWindow", "StudioPortraitLayout");
+
+ if (studioPortraitLayout)
+ ui->previewLayout->setDirection(QBoxLayout::TopToBottom);
+ else
+ ui->previewLayout->setDirection(QBoxLayout::LeftToRight);
+}
+
int OBSBasic::ResetVideo()
{
if (outputHandler && outputHandler->Active())
diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp
index d52059bae..9a72d470f 100644
--- a/UI/window-basic-main.hpp
+++ b/UI/window-basic-main.hpp
@@ -494,6 +494,7 @@ public:
bool StreamingActive() const;
bool Active() const;
+ void ResetUI();
int ResetVideo();
bool ResetAudio();
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index 24d1fc4ff..87e885a51 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -316,6 +316,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->sourceSnapping, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->snapDistance, DSCROLL_CHANGED,GENERAL_CHANGED);
HookWidget(ui->doubleClickSwitch, CHECK_CHANGED, GENERAL_CHANGED);
+ HookWidget(ui->studioPortraitLayout, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->outputMode, COMBO_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->streamType, COMBO_CHANGED, STREAM1_CHANGED);
HookWidget(ui->simpleOutputPath, EDIT_CHANGED, OUTPUTS_CHANGED);
@@ -1082,6 +1083,10 @@ void OBSBasicSettings::LoadGeneralSettings()
"BasicWindow", "TransitionOnDoubleClick");
ui->doubleClickSwitch->setChecked(doubleClickSwitch);
+ bool studioPortraitLayout = config_get_bool(GetGlobalConfig(),
+ "BasicWindow", "StudioPortraitLayout");
+ ui->studioPortraitLayout->setChecked(studioPortraitLayout);
+
loading = false;
}
@@ -2643,6 +2648,14 @@ void OBSBasicSettings::SaveGeneralSettings()
config_set_bool(GetGlobalConfig(), "BasicWindow",
"SaveProjectors",
ui->saveProjectors->isChecked());
+
+ if (WidgetChanged(ui->studioPortraitLayout)) {
+ config_set_bool(GetGlobalConfig(), "BasicWindow",
+ "StudioPortraitLayout",
+ ui->studioPortraitLayout->isChecked());
+
+ main->ResetUI();
+ }
}
void OBSBasicSettings::SaveStream1Settings()