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",