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
-
-
-
-
-
-
-
@@ -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())