diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index 05b6c7830..2520ab6e2 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -555,6 +555,7 @@ Basic.Settings.General.SysTray="System Tray"
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 mode 'stream' settings
Basic.Settings.Stream="Stream"
diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index 8bb6bf4f5..251bdcf56 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -145,8 +145,8 @@
0
0
- 818
- 697
+ 801
+ 698
@@ -540,6 +540,41 @@
+ -
+
+
+ Basic.TogglePreviewProgramMode
+
+
+
+ QFormLayout::AllNonFixedFieldsGrow
+
+
+ 2
+
+
-
+
+
+ Basic.Settings.General.SwitchOnDoubleClick
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 170
+ 5
+
+
+
+
+
+
+
@@ -675,8 +710,8 @@
0
0
- 818
- 697
+ 601
+ 640
@@ -3314,8 +3349,8 @@
0
0
- 800
- 69
+ 80
+ 16
@@ -3651,8 +3686,8 @@
0
0
- 818
- 697
+ 98
+ 28
@@ -3697,8 +3732,8 @@
0
- -62
- 803
+ 0
+ 593
761
diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp
index 0fd2bb8f9..aac2a9bf2 100644
--- a/UI/window-basic-main-transitions.cpp
+++ b/UI/window-basic-main-transitions.cpp
@@ -220,10 +220,10 @@ obs_source_t *OBSBasic::FindTransition(const char *name)
return nullptr;
}
-void OBSBasic::TransitionToScene(OBSScene scene, bool force)
+void OBSBasic::TransitionToScene(OBSScene scene, bool force, bool direct)
{
obs_source_t *source = obs_scene_get_source(scene);
- TransitionToScene(source, force);
+ TransitionToScene(source, force, direct);
}
void OBSBasic::TransitionStopped()
@@ -242,7 +242,7 @@ void OBSBasic::TransitionStopped()
swapScene = nullptr;
}
-void OBSBasic::TransitionToScene(OBSSource source, bool force)
+void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct)
{
obs_scene_t *scene = obs_scene_from_source(source);
bool usingPreviewProgram = IsPreviewProgramMode();
@@ -251,7 +251,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force)
OBSWeakSource lastProgramScene;
- if (usingPreviewProgram) {
+ if (usingPreviewProgram && !direct) {
lastProgramScene = programScene;
programScene = OBSGetWeakRef(source);
@@ -266,7 +266,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force)
}
}
- if (usingPreviewProgram && sceneDuplicationMode) {
+ if (usingPreviewProgram && sceneDuplicationMode && !direct) {
scene = obs_scene_duplicate(scene, NULL,
editPropertiesMode ?
OBS_SCENE_DUP_PRIVATE_COPY :
@@ -285,7 +285,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force)
ui->transitionDuration->value(), source);
}
- if (usingPreviewProgram && sceneDuplicationMode)
+ if (usingPreviewProgram && sceneDuplicationMode && !direct)
obs_scene_release(scene);
obs_source_release(transition);
@@ -544,10 +544,10 @@ int OBSBasic::GetQuickTransitionIdx(int id)
return -1;
}
-void OBSBasic::SetCurrentScene(obs_scene_t *scene, bool force)
+void OBSBasic::SetCurrentScene(obs_scene_t *scene, bool force, bool direct)
{
obs_source_t *source = obs_scene_get_source(scene);
- SetCurrentScene(source, force);
+ SetCurrentScene(source, force, direct);
}
template
@@ -556,10 +556,13 @@ static T GetOBSRef(QListWidgetItem *item)
return item->data(static_cast(QtDataRole::OBSRef)).value();
}
-void OBSBasic::SetCurrentScene(OBSSource scene, bool force)
+void OBSBasic::SetCurrentScene(OBSSource scene, bool force, bool direct)
{
- if (!IsPreviewProgramMode()) {
- TransitionToScene(scene, force);
+ if (!IsPreviewProgramMode() && !direct) {
+ TransitionToScene(scene, force, false);
+
+ } else if (IsPreviewProgramMode() && direct) {
+ TransitionToScene(scene, force, true);
} else {
OBSSource actualLastScene = OBSGetStrongRef(lastScene);
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index fd8d4807c..f61000054 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -3794,6 +3794,24 @@ void OBSBasic::on_sources_itemDoubleClicked(QListWidgetItem *witem)
CreatePropertiesWindow(source);
}
+void OBSBasic::on_scenes_itemDoubleClicked(QListWidgetItem *witem)
+{
+ if (!witem)
+ return;
+
+ if (IsPreviewProgramMode()) {
+ bool doubleClickSwitch = config_get_bool(App()->GlobalConfig(),
+ "BasicWindow", "TransitionOnDoubleClick");
+
+ if (doubleClickSwitch) {
+ OBSScene scene = GetCurrentScene();
+
+ if (scene)
+ SetCurrentScene(scene, false, true);
+ }
+ }
+}
+
void OBSBasic::AddSource(const char *id)
{
if (id && *id) {
diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp
index d16462328..3320258be 100644
--- a/UI/window-basic-main.hpp
+++ b/UI/window-basic-main.hpp
@@ -299,7 +299,8 @@ private:
void SetPreviewProgramMode(bool enabled);
void ResizeProgram(uint32_t cx, uint32_t cy);
- void SetCurrentScene(obs_scene_t *scene, bool force = false);
+ void SetCurrentScene(obs_scene_t *scene, bool force = false,
+ bool direct = false);
static void RenderProgram(void *data, uint32_t cx, uint32_t cy);
std::vector quickTransitions;
@@ -388,9 +389,12 @@ public slots:
void SaveProject();
void SetTransition(OBSSource transition);
- void TransitionToScene(OBSScene scene, bool force = false);
- void TransitionToScene(OBSSource scene, bool force = false);
- void SetCurrentScene(OBSSource scene, bool force = false);
+ void TransitionToScene(OBSScene scene, bool force = false,
+ bool direct = false);
+ void TransitionToScene(OBSSource scene, bool force = false,
+ bool direct = false);
+ void SetCurrentScene(OBSSource scene, bool force = false,
+ bool direct = false);
private slots:
void AddSceneItem(OBSSceneItem item);
@@ -578,6 +582,7 @@ private slots:
void on_sources_itemSelectionChanged();
void on_sources_customContextMenuRequested(const QPoint &pos);
void on_sources_itemDoubleClicked(QListWidgetItem *item);
+ void on_scenes_itemDoubleClicked(QListWidgetItem *item);
void on_actionAddSource_triggered();
void on_actionRemoveSource_triggered();
void on_actionInteract_triggered();
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index 8c4801204..24d1fc4ff 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -315,6 +315,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->centerSnapping, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->sourceSnapping, CHECK_CHANGED, GENERAL_CHANGED);
HookWidget(ui->snapDistance, DSCROLL_CHANGED,GENERAL_CHANGED);
+ HookWidget(ui->doubleClickSwitch, 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);
@@ -1077,6 +1078,10 @@ void OBSBasicSettings::LoadGeneralSettings()
"BasicWindow", "ProjectorAlwaysOnTop");
ui->projectorAlwaysOnTop->setChecked(projectorAlwaysOnTop);
+ bool doubleClickSwitch = config_get_bool(GetGlobalConfig(),
+ "BasicWindow", "TransitionOnDoubleClick");
+ ui->doubleClickSwitch->setChecked(doubleClickSwitch);
+
loading = false;
}
@@ -2582,6 +2587,10 @@ void OBSBasicSettings::SaveGeneralSettings()
config_set_double(GetGlobalConfig(), "BasicWindow",
"SnapDistance",
ui->snapDistance->value());
+ if (WidgetChanged(ui->doubleClickSwitch))
+ config_set_bool(GetGlobalConfig(), "BasicWindow",
+ "TransitionOnDoubleClick",
+ ui->doubleClickSwitch->isChecked());
config_set_bool(GetGlobalConfig(), "BasicWindow",
"WarnBeforeStartingStream",