From ea32e1f17b15e760697bd1cd6c12f014bb99738e Mon Sep 17 00:00:00 2001 From: Warchamp7 Date: Wed, 22 Apr 2026 14:51:38 -0400 Subject: [PATCH] frontend: Make Preview into dock widget --- frontend/OBSStudioAPI.cpp | 2 +- frontend/data/locale/en-US.ini | 1 - frontend/data/themes/Yami.obt | 124 +- frontend/docks/YouTubeAppDock.cpp | 2 +- frontend/forms/OBSBasic.ui | 1344 +++++++++--------- frontend/oauth/RestreamAuth.cpp | 10 +- frontend/oauth/TwitchAuth.cpp | 22 +- frontend/oauth/YoutubeAuth.cpp | 6 +- frontend/widgets/OBSBasic.cpp | 23 +- frontend/widgets/OBSBasic.hpp | 3 +- frontend/widgets/OBSBasic_Browser.cpp | 2 +- frontend/widgets/OBSBasic_ContextToolbar.cpp | 2 +- frontend/widgets/OBSBasic_Docks.cpp | 13 +- 13 files changed, 798 insertions(+), 756 deletions(-) diff --git a/frontend/OBSStudioAPI.cpp b/frontend/OBSStudioAPI.cpp index 76678992f305cf..21850841512f19 100644 --- a/frontend/OBSStudioAPI.cpp +++ b/frontend/OBSStudioAPI.cpp @@ -344,7 +344,7 @@ bool OBSStudioAPI::obs_frontend_add_dock_by_id(const char *id, const char *title dock->setWindowTitle(QT_UTF8(title)); dock->setObjectName(QT_UTF8(id)); - main->AddDockWidget(dock, Qt::RightDockWidgetArea); + main->addDockWidget(Qt::BottomDockWidgetArea, dock); dock->setVisible(false); dock->setFloating(true); diff --git a/frontend/data/locale/en-US.ini b/frontend/data/locale/en-US.ini index 3775d922459bf4..0e593f0f0ce907 100644 --- a/frontend/data/locale/en-US.ini +++ b/frontend/data/locale/en-US.ini @@ -861,7 +861,6 @@ Basic.MainMenu.View.SceneListMode="Scene List Mode" Basic.MainMenu.Docks="&Docks" Basic.MainMenu.Docks.ResetDocks="&Reset Docks" Basic.MainMenu.Docks.LockDocks="&Lock Docks" -Basic.MainMenu.Docks.SideDocks="&Full-Height Docks" Basic.MainMenu.Docks.CustomBrowserDocks="&Custom Browser Docks" # basic mode profile/scene collection menus diff --git a/frontend/data/themes/Yami.obt b/frontend/data/themes/Yami.obt index 9a33953ef6007e..7987097ac768f3 100644 --- a/frontend/data/themes/Yami.obt +++ b/frontend/data/themes/Yami.obt @@ -842,6 +842,20 @@ OBSDock QToolBar QToolButton:disabled { background: var(--grey7); } +/* Reset styling for the preview dock */ +#previewDock > QWidget { + background: var(--bg_base); + border-radius: var(--border_radius); + border: none; + border: 1px solid var(--border_color); +} + +#previewFrame { + background: var(--grey7); + margin-top: var(--spacing_large); + border: 1px solid var(--grey7); +} + #transitionsFrame { padding: var(--padding_container); } @@ -1039,6 +1053,9 @@ OBSDock QScrollBar:vertical { background-color: var(--bg_base); margin-top: 4px; border-radius: var(--border_radius); + margin-bottom: var(--spacing_base); + border-bottom-left-radius: var(--border_radius); + border-bottom-right-radius: var(--border_radius); } #contextContainer QPushButton { @@ -2330,89 +2347,106 @@ OBSBasicAdvAudio #scrollAreaWidgetContents { background: var(--bg_base); } -#previewScalePercent, +#previewXContainer { + border-top: 1px solid var(--grey6); + max-height: var(--input_height_half); + padding: 0; + color: var(--text_muted); +} + +#previewZoomOutButton, +#previewZoomInButton, #previewScalingMode { background: transparent; color: var(--text_muted); font-size: var(--font_xsmall); - height: 14px; - max-height: 14px; + height: var(--input_height_half); + max-height: var(--input_height_half); padding: 0px; margin: 0; - border: none; + border: 1px solid transparent; border-radius: 0; } -#previewXContainer { - border: 1px solid var(--grey6); +#previewScalingMode, +#previewScalePercent { + color: var(--text_muted); + font-size: var(--font_xsmall); } -#previewScalePercent { - padding: 0px var(--input_text_padding); - min-width: var(--preview_scale_width); +#previewZoomOutButton, +#previewZoomInButton { + padding: 0px var(--padding_large); } #previewScalingMode { padding: 0px var(--input_text_padding); - border: 1px solid var(--grey6); + border-left-color: var(--grey6); + border-right-color: var(--grey6); } -#previewScalingMode:hover, -#previewScalingMode:focus { - border-color: var(--input_border_hover); +#previewScalingMode QAbstractItemView { + padding: 0; } -#previewScalingMode:on { - background-color: var(--input_bg_focus); - border-color: var(--input_border_focus); +#previewScalingMode QAbstractItemView::item { + height: var(--input_height_half); + padding: var(--padding_base) var(--padding_large); + border-radius: var(--border_radius_small); } -#previewXScrollBar, -#previewYScrollBar { - background: transparent; - border: 1px solid var(--grey6); - border-radius: 0; +#previewZoomOutButton:hover, +#previewZoomInButton:hover, +#previewScalingMode:hover { + background-color: var(--grey6); + border-color: transparent; + color: var(--white3); } -#previewXScrollBar { - border-left: none; - height: 16px; +#previewZoomOutButton:pressed, +#previewZoomInButton:pressed, +#previewScalingMode:pressed { + background-color: var(--button_down); } -#previewXScrollBar::handle, -#previewYScrollBar::handle { - margin: 3px; +#previewZoomOutButton:focus, +#previewZoomInButton:focus, +#previewScalingMode:focus { + border-color: var(--input_border_hover); } -#previewYScrollBar { - width: 16px; +#previewScalingMode:on { + background-color: var(--input_bg_focus); + border-color: var(--input_border_focus); } -#previewZoomInButton { - border: none; - border-radius: 0px; - outline: none; +#previewScalePercent { + padding: 0px var(--input_text_padding); + min-width: var(--preview_scale_width); } -#previewZoomOutButton { +#previewContainer QScrollBar { + background: transparent; border: none; - border-radius: 0px; - outline: none; + border-radius: 0; + margin: 0; } -#previewZoomInButton:!hover, -#previewZoomOutButton:!hover { - background-color: transparent; +#previewContainer QScrollBar::handle { + margin: 3px; } -#previewZoomInButton:pressed, -#previewZoomOutButton:pressed { - background-color: var(--button_bg); +#previewContainer QScrollBar::handle:pressed { + background-color: var(--grey6); } -#previewZoomInButton:focus, -#previewZoomOutButton:focus { - border: 1px solid var(--input_border_hover); +#previewContainer #previewXScrollBar { + height: 16px; +} + +#previewContainer #previewYScrollBar { + width: 16px; + border-left: 1px solid var(--grey6); } /* Idian Widgets */ diff --git a/frontend/docks/YouTubeAppDock.cpp b/frontend/docks/YouTubeAppDock.cpp index a5b283484da1a7..38c82ca7e4ca9d 100644 --- a/frontend/docks/YouTubeAppDock.cpp +++ b/frontend/docks/YouTubeAppDock.cpp @@ -111,7 +111,7 @@ void YouTubeAppDock::AddYouTubeAppDock() this->setMinimumSize(400, 300); this->setAllowedAreas(Qt::AllDockWidgetAreas); - OBSBasic::Get()->AddDockWidget(this, Qt::RightDockWidgetArea); + OBSBasic::Get()->addDockWidget(Qt::RightDockWidgetArea, this); if (IsYTServiceSelected()) { const std::string url = InitYTUserUrl(); diff --git a/frontend/forms/OBSBasic.ui b/frontend/forms/OBSBasic.ui index 1224c33e144d90..09d43d6bffed3c 100644 --- a/frontend/forms/OBSBasic.ui +++ b/frontend/forms/OBSBasic.ui @@ -7,7 +7,7 @@ 0 0 - 1280 + 1474 960 @@ -33,11 +33,20 @@ + + false + QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks - + + + 16777215 + 0 + + + 0 @@ -53,659 +62,6 @@ 0 - - - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - - - - 0 - 0 - - - - - 0 - - - 1 - - - 1 - - - 1 - - - 1 - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - 0 - 0 - - - - Basic.Main.PreviewDisabled - - - Qt::AlignCenter - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Basic.Main.PreviewConextMenu.Enable - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - StudioMode.PreviewSceneName - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - label-preview-title - - - - - - - 0 - - - - - - 0 - 0 - - - - - 32 - 32 - - - - Qt::ClickFocus - - - Qt::CustomContextMenu - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 20 - 16 - - - - - 20 - 16 - - - - Basic.MainMenu.Edit.Scale.ZoomOut - - - Basic.MainMenu.Edit.Scale.ZoomOut - - - - - - - :/res/images/minus.svg:/res/images/minus.svg - - - - 8 - 8 - - - - true - - - icon-minus - - - - - - - 100% - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 20 - 16 - - - - - 20 - 16 - - - - Basic.MainMenu.Edit.Scale.ZoomIn - - - Basic.MainMenu.Edit.Scale.ZoomIn - - - - - - - :/res/images/plus.svg:/res/images/plus.svg - - - - 8 - 8 - - - - true - - - icon-plus - - - - - - - - Basic.MainMenu.Edit.Scale.Window - - - - - Basic.MainMenu.Edit.Scale.Canvas - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 4 - 0 - - - - - - - - - 0 - 0 - - - - -200 - - - 200 - - - 10 - - - 100 - - - Qt::Horizontal - - - - - - - - - - Qt::Vertical - - - - - - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 6 - - - QLayout::SetDefaultConstraint - - - 6 - - - 4 - - - 6 - - - 4 - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - - 0 - 0 - - - - - 160 - 22 - - - - - 160 - 22 - - - - TextLabel - - - - - - - - 0 - 0 - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - Qt::Vertical - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - SourceProperties - - - Properties - - - - :/settings/images/settings/general.svg:/settings/images/settings/general.svg - - - false - - - - - - - - 0 - 22 - - - - SourceFilters - - - Filters - - - - :/res/images/filter.svg:/res/images/filter.svg - - - false - - - - - - - - 0 - 22 - - - - Interact - - - Interact - - - - :/res/images/interact.svg:/res/images/interact.svg - - - false - - - icon-touch - - - - - - - Qt::Vertical - - - - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - @@ -956,7 +312,6 @@ Basic.MainMenu.Docks - @@ -974,6 +329,9 @@ QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + Qt::BottomDockWidgetArea + Basic.Main.Scenes @@ -1103,6 +461,9 @@ QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + Qt::BottomDockWidgetArea + Basic.Main.Sources @@ -1265,6 +626,9 @@ QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + Qt::BottomDockWidgetArea + Basic.SceneTransitions @@ -1493,6 +857,663 @@ + + + QDockWidget::NoDockWidgetFeatures + + + Qt::BottomDockWidgetArea + + + Canvas + + + 8 + + + + + 0 + + + 4 + + + 0 + + + 4 + + + 0 + + + + + + 2 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 2 + + + + + + 0 + 0 + + + + + 0 + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Basic.Main.PreviewDisabled + + + Qt::AlignCenter + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Basic.Main.PreviewConextMenu.Enable + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + StudioMode.PreviewSceneName + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + label-preview-title + + + + + + + 0 + + + + + + 0 + 0 + + + + + 32 + 32 + + + + Qt::ClickFocus + + + Qt::CustomContextMenu + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Basic.MainMenu.Edit.Scale.ZoomIn + + + Basic.MainMenu.Edit.Scale.ZoomIn + + + + + + + :/res/images/plus.svg:/res/images/plus.svg + + + + 8 + 8 + + + + true + + + icon-plus + + + + + + + Basic.MainMenu.Edit.Scale.Canvas + + + Qt::AlignCenter + + + + + + + Basic.MainMenu.Edit.Scale.ZoomOut + + + Basic.MainMenu.Edit.Scale.ZoomOut + + + + + + + :/res/images/minus.svg:/res/images/minus.svg + + + + 8 + 8 + + + + true + + + icon-minus + + + + + + + + Basic.MainMenu.Edit.Scale.Window + + + + + Basic.MainMenu.Edit.Scale.Canvas + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 4 + 0 + + + + + + + + + 0 + 0 + + + + -200 + + + 200 + + + 10 + + + 100 + + + Qt::Horizontal + + + + + + + + + + Qt::Vertical + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 6 + + + QLayout::SetDefaultConstraint + + + 6 + + + 4 + + + 6 + + + 4 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + + + + + 0 + 0 + + + + + 160 + 22 + + + + + 160 + 22 + + + + TextLabel + + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + + + + Qt::Vertical + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + SourceProperties + + + Properties + + + + :/settings/images/settings/general.svg:/settings/images/settings/general.svg + + + false + + + + + + + + 0 + 22 + + + + SourceFilters + + + Filters + + + + :/res/images/filter.svg:/res/images/filter.svg + + + false + + + + + + + + 0 + 22 + + + + Interact + + + Interact + + + + :/res/images/interact.svg:/res/images/interact.svg + + + false + + + icon-touch + + + + + + + Qt::Vertical + + + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + @@ -2068,17 +2089,6 @@ Basic.MainMenu.Docks.LockDocks - - - true - - - true - - - Basic.MainMenu.Docks.SideDocks - - Basic.MainMenu.Help.HelpPortal diff --git a/frontend/oauth/RestreamAuth.cpp b/frontend/oauth/RestreamAuth.cpp index 92beb9c1d36742..91688a1619bf77 100644 --- a/frontend/oauth/RestreamAuth.cpp +++ b/frontend/oauth/RestreamAuth.cpp @@ -103,7 +103,7 @@ try { void RestreamAuth::SaveInternal() { OBSBasic *main = OBSBasic::Get(); - config_set_string(main->Config(), service(), "DockState", main->saveState().toBase64().constData()); + config_set_string(main->Config(), service(), "DockState2", main->saveState().toBase64().constData()); OAuthStreamKey::SaveInternal(); } @@ -152,7 +152,7 @@ void RestreamAuth::LoadUI() browser = cef->create_widget(chat, url, panel_cookies); chat->SetWidget(browser); - main->AddDockWidget(chat, Qt::RightDockWidgetArea); + main->addDockWidget(Qt::RightDockWidgetArea, chat); /* ----------------------------------- */ @@ -168,7 +168,7 @@ void RestreamAuth::LoadUI() browser = cef->create_widget(info, url, panel_cookies); info->SetWidget(browser); - main->AddDockWidget(info, Qt::LeftDockWidgetArea); + main->addDockWidget(Qt::BottomDockWidgetArea, info); /* ----------------------------------- */ @@ -184,7 +184,7 @@ void RestreamAuth::LoadUI() browser = cef->create_widget(channels, url, panel_cookies); channels->SetWidget(browser); - main->AddDockWidget(channels, Qt::LeftDockWidgetArea); + main->addDockWidget(Qt::BottomDockWidgetArea, channels); /* ----------------------------------- */ @@ -201,7 +201,7 @@ void RestreamAuth::LoadUI() info->setVisible(true); channels->setVisible(true); } else { - const char *dockStateStr = config_get_string(main->Config(), service(), "DockState"); + const char *dockStateStr = config_get_string(main->Config(), service(), "DockState2"); QByteArray dockState = QByteArray::fromBase64(QByteArray(dockStateStr)); main->restoreState(dockState); } diff --git a/frontend/oauth/TwitchAuth.cpp b/frontend/oauth/TwitchAuth.cpp index 3b35e7291545c7..0e4198b5420f02 100644 --- a/frontend/oauth/TwitchAuth.cpp +++ b/frontend/oauth/TwitchAuth.cpp @@ -154,7 +154,7 @@ void TwitchAuth::SaveInternal() config_set_string(main->Config(), service(), "UUID", uuid.c_str()); if (uiLoaded) { - config_set_string(main->Config(), service(), "DockState", main->saveState().toBase64().constData()); + config_set_string(main->Config(), service(), "DockState2", main->saveState().toBase64().constData()); } OAuthStreamKey::SaveInternal(); } @@ -261,17 +261,17 @@ void TwitchAuth::LoadUI() browser->setStartupScript(script); - main->AddDockWidget(chat, Qt::RightDockWidgetArea); + main->addDockWidget(Qt::RightDockWidgetArea, chat); /* ----------------------------------- */ - chat->setFloating(true); + //chat->setFloating(true); chat->move(pos.x() + size.width() - chat->width() - 50, pos.y() + 50); if (firstLoad) { chat->setVisible(true); } else { - const char *dockStateStr = config_get_string(main->Config(), service(), "DockState"); + const char *dockStateStr = config_get_string(main->Config(), service(), "DockState2"); QByteArray dockState = QByteArray::fromBase64(QByteArray(dockStateStr)); main->restoreState(dockState); } @@ -328,7 +328,7 @@ void TwitchAuth::LoadSecondaryUIPanes() info->SetWidget(browser); browser->setStartupScript(script); - main->AddDockWidget(info, Qt::RightDockWidgetArea); + main->addDockWidget(Qt::RightDockWidgetArea, info); /* ----------------------------------- */ @@ -347,7 +347,7 @@ void TwitchAuth::LoadSecondaryUIPanes() stats->SetWidget(browser); browser->setStartupScript(script); - main->AddDockWidget(stats, Qt::RightDockWidgetArea); + main->addDockWidget(Qt::RightDockWidgetArea, stats); /* ----------------------------------- */ @@ -367,13 +367,13 @@ void TwitchAuth::LoadSecondaryUIPanes() feed->SetWidget(browser); browser->setStartupScript(script); - main->AddDockWidget(feed, Qt::RightDockWidgetArea); + main->addDockWidget(Qt::RightDockWidgetArea, feed); /* ----------------------------------- */ - info->setFloating(true); - stats->setFloating(true); - feed->setFloating(true); + //info->setFloating(true); + //stats->setFloating(true); + //feed->setFloating(true); QSize statSize = stats->frameSize(); @@ -393,7 +393,7 @@ void TwitchAuth::LoadSecondaryUIPanes() feed->setVisible(false); } - const char *dockStateStr = config_get_string(main->Config(), service(), "DockState"); + const char *dockStateStr = config_get_string(main->Config(), service(), "DockState2"); QByteArray dockState = QByteArray::fromBase64(QByteArray(dockStateStr)); if (main->isVisible() || !main->isMaximized()) diff --git a/frontend/oauth/YoutubeAuth.cpp b/frontend/oauth/YoutubeAuth.cpp index 399cab11c8af43..87bddb9b0ab9cf 100644 --- a/frontend/oauth/YoutubeAuth.cpp +++ b/frontend/oauth/YoutubeAuth.cpp @@ -77,7 +77,7 @@ bool YoutubeAuth::RetryLogin() void YoutubeAuth::SaveInternal() { OBSBasic *main = OBSBasic::Get(); - config_set_string(main->Config(), service(), "DockState", main->saveState().toBase64().constData()); + config_set_string(main->Config(), service(), "DockState2", main->saveState().toBase64().constData()); const char *section_name = section.c_str(); config_set_string(main->Config(), section_name, "RefreshToken", refresh_token.c_str()); @@ -131,7 +131,7 @@ void YoutubeAuth::LoadUI() browser = cef->create_widget(chat, YOUTUBE_CHAT_PLACEHOLDER_URL, panel_cookies); chat->SetWidget(browser); - main->AddDockWidget(chat, Qt::RightDockWidgetArea); + main->addDockWidget(Qt::RightDockWidgetArea, chat); chat->setFloating(true); chat->move(pos.x() + size.width() - chat->width() - 50, pos.y() + 50); @@ -146,7 +146,7 @@ void YoutubeAuth::LoadUI() } if (!firstLoad) { - const char *dockStateStr = config_get_string(main->Config(), service(), "DockState"); + const char *dockStateStr = config_get_string(main->Config(), service(), "DockState2"); QByteArray dockState = QByteArray::fromBase64(QByteArray(dockStateStr)); main->restoreState(dockState); } diff --git a/frontend/widgets/OBSBasic.cpp b/frontend/widgets/OBSBasic.cpp index e3277eb5f445dc..8ae69cff8a3b58 100644 --- a/frontend/widgets/OBSBasic.cpp +++ b/frontend/widgets/OBSBasic.cpp @@ -286,6 +286,7 @@ OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), undo_s(ui), ui(new controlsDock->setWindowTitle(QTStr("Basic.Main.Controls")); /* Parenting is done there so controls will be deleted alongside controlsDock */ controlsDock->setWidget(controls); + controlsDock->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); connect(controls, &OBSBasicControls::StreamButtonClicked, this, &OBSBasic::StreamActionTriggered); @@ -347,11 +348,17 @@ OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), undo_s(ui), ui(new /* Scenes and Sources dock on left * This specific arrangement can't be set up in Qt Designer */ - addDockWidget(Qt::LeftDockWidgetArea, ui->scenesDock); + + splitDockWidget(ui->scenesDock, ui->previewDock, Qt::Horizontal); splitDockWidget(ui->scenesDock, ui->sourcesDock, Qt::Vertical); + + splitDockWidget(ui->previewDock, ui->mixerDock, Qt::Vertical); + + splitDockWidget(ui->mixerDock, ui->transitionsDock, Qt::Horizontal); + splitDockWidget(ui->transitionsDock, controlsDock, Qt::Horizontal); + int sideDockWidth = std::min(width() * 30 / 100, 320); resizeDocks({ui->scenesDock, ui->sourcesDock}, {sideDockWidth, sideDockWidth}, Qt::Horizontal); - addDockWidget(Qt::BottomDockWidgetArea, controlsDock); startingDockLayout = saveState(); @@ -582,6 +589,9 @@ OBSBasic::OBSBasic(QWidget *parent) : OBSMainWindow(parent), undo_s(ui), ui(new UpdatePreviewSafeAreas(); UpdatePreviewSpacingHelpers(); UpdatePreviewOverflowSettings(); + + QWidget *emptyTitle = new QWidget(); + ui->previewDock->setTitleBarWidget(emptyTitle); } static const double scaled_vals[] = {1.0, 1.25, (1.0 / 0.75), 1.5, (1.0 / 0.6), 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 0.0}; @@ -1219,7 +1229,7 @@ void OBSBasic::OBSInit() NewYouTubeAppDock(); #endif - const char *dockStateStr = config_get_string(App()->GetUserConfig(), "BasicWindow", "DockState"); + const char *dockStateStr = config_get_string(App()->GetUserConfig(), "BasicWindow", "DockState2"); if (!dockStateStr) { on_resetDocks_triggered(true); @@ -1245,9 +1255,7 @@ void OBSBasic::OBSInit() ui->lockDocks->setChecked(docksLocked); ui->lockDocks->blockSignals(false); - bool sideDocks = config_get_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks"); - ui->sideDocks->setChecked(sideDocks); - setDockCornersVertical(sideDocks); + setDockCornersVertical(true); SystemTray(true); @@ -1852,7 +1860,7 @@ void OBSBasic::saveAll() Auth::Save(); SaveProjectNow(); - config_set_string(App()->GetUserConfig(), "BasicWindow", "DockState", saveState().toBase64().constData()); + config_set_string(App()->GetUserConfig(), "BasicWindow", "DockState2", saveState().toBase64().constData()); #ifdef BROWSER_AVAILABLE if (cef) { @@ -1870,7 +1878,6 @@ void OBSBasic::saveAll() config_set_bool(App()->GetUserConfig(), "BasicWindow", "EditPropertiesMode", editPropertiesMode); config_set_bool(App()->GetUserConfig(), "BasicWindow", "PreviewProgramMode", IsPreviewProgramMode()); config_set_bool(App()->GetUserConfig(), "BasicWindow", "DocksLocked", ui->lockDocks->isChecked()); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks", ui->sideDocks->isChecked()); config_save_safe(App()->GetUserConfig(), "tmp", nullptr); } diff --git a/frontend/widgets/OBSBasic.hpp b/frontend/widgets/OBSBasic.hpp index 2561a7c107fc47..21569c265f5171 100644 --- a/frontend/widgets/OBSBasic.hpp +++ b/frontend/widgets/OBSBasic.hpp @@ -445,7 +445,7 @@ public slots: QPointer mixerDock; public: - void AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool extraBrowser = false); + void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dock, bool extraBrowser = false); void RemoveDockWidget(const QString &name); bool IsDockObjectNameUsed(const QString &name); void AddCustomDockWidget(QDockWidget *dock); @@ -454,7 +454,6 @@ public slots: private slots: void on_resetDocks_triggered(bool force = false); void on_lockDocks_toggled(bool lock); - void on_sideDocks_toggled(bool side); void RepairCustomExtraDockName(); diff --git a/frontend/widgets/OBSBasic_Browser.cpp b/frontend/widgets/OBSBasic_Browser.cpp index ecac249570c2e0..4bb1885f71bb22 100644 --- a/frontend/widgets/OBSBasic_Browser.cpp +++ b/frontend/widgets/OBSBasic_Browser.cpp @@ -139,7 +139,7 @@ void OBSBasic::AddExtraBrowserDock(const QString &title, const QString &url, con } } - AddDockWidget(dock, Qt::RightDockWidgetArea, true); + addDockWidget(Qt::BottomDockWidgetArea, dock, true); extraBrowserDocks.push_back(std::shared_ptr(dock)); extraBrowserDockNames.push_back(title); extraBrowserDockTargets.push_back(url); diff --git a/frontend/widgets/OBSBasic_ContextToolbar.cpp b/frontend/widgets/OBSBasic_ContextToolbar.cpp index ff16156c2a2fe9..7e5f00537e3175 100644 --- a/frontend/widgets/OBSBasic_ContextToolbar.cpp +++ b/frontend/widgets/OBSBasic_ContextToolbar.cpp @@ -70,7 +70,7 @@ void OBSBasic::ClearContextBar() void OBSBasic::UpdateContextBarVisibility() { - int width = ui->centralwidget->size().width(); + int width = ui->previewFrame->width(); ContextBarSize contextBarSizeNew; if (width >= 740) { diff --git a/frontend/widgets/OBSBasic_Docks.cpp b/frontend/widgets/OBSBasic_Docks.cpp index b35839ef0079b5..acd97d966499c0 100644 --- a/frontend/widgets/OBSBasic_Docks.cpp +++ b/frontend/widgets/OBSBasic_Docks.cpp @@ -74,7 +74,6 @@ void OBSBasic::on_resetDocks_triggered(bool force) #undef RESET_DOCKLIST restoreState(startingDockLayout); - ui->sideDocks->setChecked(true); int cx = width(); int bottomDocksHeight = height(); @@ -91,6 +90,7 @@ void OBSBasic::on_resetDocks_triggered(bool force) QList bottomDocks{ui->mixerDock, ui->transitionsDock, controlsDock}; + resizeDocks({ui->previewDock}, {height() * 750 / 100}, Qt::Vertical); resizeDocks(bottomDocks, {bottomDocksHeight, bottomDocksHeight, bottomDocksHeight}, Qt::Vertical); resizeDocks(bottomDocks, {cx * 45 / 100, cx * 14 / 100, cx * 16 / 100}, Qt::Horizontal); @@ -129,14 +129,7 @@ void OBSBasic::on_lockDocks_toggled(bool lock) #endif } -void OBSBasic::on_sideDocks_toggled(bool side) -{ - config_set_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks", side); - - setDockCornersVertical(side); -} - -void OBSBasic::AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool extraBrowser) +void OBSBasic::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dock, bool extraBrowser) { if (dock->objectName().isEmpty()) return; @@ -149,7 +142,7 @@ void OBSBasic::AddDockWidget(QDockWidget *dock, Qt::DockWidgetArea area, bool ex setupDockAction(dock); dock->setFeatures(features); - addDockWidget(area, dock); + QMainWindow::addDockWidget(area, dock); #ifdef BROWSER_AVAILABLE if (extraBrowser && extraBrowserMenuDocksSeparator.isNull())