diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index d1b3fdecf..44f101aac 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -604,6 +604,7 @@ Basic.Settings.General.OverflowAlwaysVisible="Overflow always visible"
Basic.Settings.General.OverflowSelectionHidden="Show overflow even when source is invisible"
Basic.Settings.General.SwitchOnDoubleClick="Transition to scene when double-clicked"
Basic.Settings.General.StudioPortraitLayout="Enable portrait/vertical layout"
+Basic.Settings.General.TogglePreviewProgramLabels="Show preview/program labels"
Basic.Settings.General.Multiview="Multiview"
Basic.Settings.General.Multiview.MouseSwitch="Click to switch between scenes"
Basic.Settings.General.Multiview.DrawSourceNames="Show scene names"
diff --git a/UI/data/themes/Acri.qss b/UI/data/themes/Acri.qss
index f562e9388..d29cb97dc 100644
--- a/UI/data/themes/Acri.qss
+++ b/UI/data/themes/Acri.qss
@@ -907,3 +907,11 @@ FocusList::item {
* [themeID="displayBackgroundColor"] {
qproperty-displayBackgroundColor: #28282A;
}
+
+/* Preview/Program labels */
+
+* [themeID="previewProgramLabels"] {
+ font-size: 18px;
+ font-weight: bold;
+ color: rgb(122,121,122);
+}
diff --git a/UI/data/themes/Dark.qss b/UI/data/themes/Dark.qss
index 5441a195d..b260aa054 100644
--- a/UI/data/themes/Dark.qss
+++ b/UI/data/themes/Dark.qss
@@ -698,3 +698,11 @@ QLabel#errorLabel {
* [themeID="displayBackgroundColor"] {
qproperty-displayBackgroundColor: rgb(76, 76, 76);
}
+
+/* Preview/Program labels */
+
+* [themeID="previewProgramLabels"] {
+ font-size: 18px;
+ font-weight: bold;
+ color: rgb(122,121,122);
+}
diff --git a/UI/data/themes/Default.qss b/UI/data/themes/Default.qss
index c5a010ab5..13cafc224 100644
--- a/UI/data/themes/Default.qss
+++ b/UI/data/themes/Default.qss
@@ -141,3 +141,11 @@ QLabel#errorLabel {
* [themeID="displayBackgroundColor"] {
qproperty-displayBackgroundColor: rgb(76, 76, 76);
}
+
+/* Preview/Program labels */
+
+* [themeID="previewProgramLabels"] {
+ font-size: 18px;
+ font-weight: bold;
+ color: rgb(122,121,122);
+}
diff --git a/UI/data/themes/Rachni.qss b/UI/data/themes/Rachni.qss
index 61113f812..51550eb55 100644
--- a/UI/data/themes/Rachni.qss
+++ b/UI/data/themes/Rachni.qss
@@ -1263,3 +1263,11 @@ QToolTip {
* [themeID="displayBackgroundColor"] {
qproperty-displayBackgroundColor: rgb(35, 38, 41);
}
+
+/* Preview/Program labels */
+
+* [themeID="previewProgramLabels"] {
+ font-size: 18px;
+ font-weight: bold;
+ color: rgb(122,121,122);
+}
diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui
index bc1923469..530b05669 100644
--- a/UI/forms/OBSBasic.ui
+++ b/UI/forms/OBSBasic.ui
@@ -69,6 +69,13 @@
4
+ -
+
+
+ StudioMode.Preview
+
+
+
-
@@ -106,7 +113,7 @@
0
0
1079
- 21
+ 25
+ -
+
+
+ Basic.Settings.General.TogglePreviewProgramLabels
+
+
+ true
+
+
+
@@ -1144,8 +1154,8 @@
0
0
- 601
- 640
+ 890
+ 791
@@ -3845,8 +3855,8 @@
0
0
- 63
- 16
+ 98
+ 28
@@ -4259,8 +4269,8 @@
0
0
- 594
- 833
+ 867
+ 1061
diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp
index 009a93f52..9a12015cc 100644
--- a/UI/obs-app.cpp
+++ b/UI/obs-app.cpp
@@ -418,6 +418,8 @@ bool OBSApp::InitGlobalConfigDefaults()
"ShowListboxToolbars", true);
config_set_default_bool(globalConfig, "BasicWindow",
"ShowStatusBar", true);
+ config_set_default_bool(globalConfig, "BasicWindow",
+ "StudioModeLabels", true);
if (!config_get_bool(globalConfig, "General", "Pre21Defaults")) {
config_set_default_string(globalConfig, "General",
diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp
index baed893a9..7295bc8e5 100644
--- a/UI/window-basic-main-transitions.cpp
+++ b/UI/window-basic-main-transitions.cpp
@@ -696,6 +696,7 @@ void OBSBasic::SetCurrentScene(OBSSource scene, bool force, bool direct)
void OBSBasic::CreateProgramDisplay()
{
program = new OBSQTDisplay();
+
program->setContextMenuPolicy(Qt::CustomContextMenu);
connect(program.data(), &QWidget::customContextMenuRequested,
this, &OBSBasic::on_program_customContextMenuRequested);
@@ -1192,6 +1193,8 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
if (IsPreviewProgramMode() == enabled)
return;
+ ui->previewLabel->setHidden(!enabled);
+
ui->modeSwitch->setChecked(enabled);
os_atomic_set_bool(&previewProgramMode, enabled);
@@ -1230,10 +1233,28 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
RefreshQuickTransitions();
+ programLabel = new QLabel(QTStr("StudioMode.Program"));
+ programLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+ programLabel->setProperty("themeID", "previewProgramLabels");
+
+ programWidget = new QWidget();
+ programLayout = new QVBoxLayout();
+
+ programLayout->setContentsMargins(0, 0, 0, 0);
+
+ programLayout->addWidget(programLabel);
+ programLayout->addWidget(program);
+
+ bool labels = config_get_bool(GetGlobalConfig(),
+ "BasicWindow", "StudioModeLabels");
+
+ programLabel->setHidden(!labels);
+
+ programWidget->setLayout(programLayout);
+
ui->previewLayout->addWidget(programOptions);
- ui->previewLayout->addWidget(program);
+ ui->previewLayout->addWidget(programWidget);
ui->previewLayout->setAlignment(programOptions, Qt::AlignCenter);
- program->show();
if (api)
api->on_event(OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED);
@@ -1251,6 +1272,8 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
delete programOptions;
delete program;
+ delete programLabel;
+ delete programWidget;
if (lastScene) {
OBSSource actualLastScene = OBSGetStrongRef(lastScene);
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index 82d875b85..2d577a948 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -371,6 +371,17 @@ OBSBasic::OBSBasic(QWidget *parent)
QPoint statsDockPos = curSize / 2 - statsDockSize / 2;
QPoint newPos = curPos + statsDockPos;
statsDock->move(newPos);
+
+ ui->previewLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+ ui->previewLabel->setProperty("themeID", "previewProgramLabels");
+
+ bool labels = config_get_bool(GetGlobalConfig(),
+ "BasicWindow", "StudioModeLabels");
+
+ if (!previewProgramMode)
+ ui->previewLabel->setHidden(true);
+ else
+ ui->previewLabel->setHidden(!labels);
}
static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent,
@@ -3437,10 +3448,19 @@ void OBSBasic::ResetUI()
bool studioPortraitLayout = config_get_bool(GetGlobalConfig(),
"BasicWindow", "StudioPortraitLayout");
+ bool labels = config_get_bool(GetGlobalConfig(),
+ "BasicWindow", "StudioModeLabels");
+
if (studioPortraitLayout)
ui->previewLayout->setDirection(QBoxLayout::TopToBottom);
else
ui->previewLayout->setDirection(QBoxLayout::LeftToRight);
+
+ if (previewProgramMode)
+ ui->previewLabel->setHidden(!labels);
+
+ if (programLabel)
+ programLabel->setHidden(!labels);
}
int OBSBasic::ResetVideo()
diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp
index 2ee43915f..0d8037a54 100644
--- a/UI/window-basic-main.hpp
+++ b/UI/window-basic-main.hpp
@@ -229,6 +229,10 @@ private:
QPointer perSceneTransitionMenu;
QPointer shortcutFilter;
+ QPointer programWidget;
+ QPointer programLayout;
+ QPointer programLabel;
+
void UpdateMultiviewProjectorMenu();
void DrawBackdrop(float cx, float cy);
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index 7293ef441..37f13c09e 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -325,6 +325,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->overflowSelectionHide,CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->doubleClickSwitch, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->studioPortraitLayout, CHECK_CHANGED, GENERAL_CHANGED);
+ HookWidget(ui->prevProgLabelToggle, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->multiviewMouseSwitch, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->multiviewDrawNames, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->multiviewDrawAreas, CHECK_CHANGED, GENERAL_CHANGED);
@@ -1120,6 +1121,10 @@ void OBSBasicSettings::LoadGeneralSettings()
"BasicWindow", "StudioPortraitLayout");
ui->studioPortraitLayout->setChecked(studioPortraitLayout);
+ bool prevProgLabels = config_get_bool(GetGlobalConfig(),
+ "BasicWindow", "StudioModeLabels");
+ ui->prevProgLabelToggle->setChecked(prevProgLabels);
+
bool multiviewMouseSwitch = config_get_bool(GetGlobalConfig(),
"BasicWindow", "MultiviewMouseSwitch");
ui->multiviewMouseSwitch->setChecked(multiviewMouseSwitch);
@@ -2767,6 +2772,14 @@ void OBSBasicSettings::SaveGeneralSettings()
main->ResetUI();
}
+ if (WidgetChanged(ui->prevProgLabelToggle)) {
+ config_set_bool(GetGlobalConfig(), "BasicWindow",
+ "StudioModeLabels",
+ ui->prevProgLabelToggle->isChecked());
+
+ main->ResetUI();
+ }
+
bool multiviewChanged = false;
if (WidgetChanged(ui->multiviewMouseSwitch)) {
config_set_bool(GetGlobalConfig(), "BasicWindow",