From 3342fd6596e17d05d0f7692e9ddc20816ae2e797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vautour=2C=20Andr=C3=A9?= Date: Tue, 23 Sep 2025 16:38:44 -0300 Subject: [PATCH 01/10] Support tabs at the bottom of dock widgets. --- src/DockAreaTitleBar.cpp | 21 +++++++++++++-------- src/DockAreaWidget.cpp | 24 +++++++++++++++++++----- src/DockManager.h | 1 + src/stylesheets/default.css | 6 +++++- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index 6cdd51c..7dd261f 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -260,10 +260,10 @@ void DockAreaTitleBarPrivate::createAutoHideTitleLabel() { AutoHideTitleLabel = new CElidingLabel(""); AutoHideTitleLabel->setObjectName("autoHideTitleLabel"); - // At position 0 is the tab bar - insert behind tab bar - Layout->insertWidget(1, AutoHideTitleLabel); - AutoHideTitleLabel->setVisible(false); // Default hidden - Layout->insertWidget(2 ,new CSpacerWidget(_this)); + // When the tabs are at the top, they will be at position 0, insert the label behind them, and hide it. + Layout->addWidget(AutoHideTitleLabel); + AutoHideTitleLabel->setVisible(CDockManager::testConfigFlag(CDockManager::TabsAtBottom)); + Layout->addWidget(new CSpacerWidget(_this)); } @@ -272,7 +272,9 @@ void DockAreaTitleBarPrivate::createTabBar() { TabBar = componentsFactory()->createDockAreaTabBar(DockArea); TabBar->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - Layout->addWidget(TabBar); + if (!CDockManager::testConfigFlag(CDockManager::TabsAtBottom)) + Layout->addWidget(TabBar); + _this->connect(TabBar, SIGNAL(tabClosed(int)), SLOT(markTabsMenuOutdated())); _this->connect(TabBar, SIGNAL(tabOpened(int)), SLOT(markTabsMenuOutdated())); _this->connect(TabBar, SIGNAL(tabInserted(int)), SLOT(markTabsMenuOutdated())); @@ -351,8 +353,8 @@ CDockAreaTitleBar::CDockAreaTitleBar(CDockAreaWidget* parent) : setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); d->createTabBar(); - d->createButtons(); d->createAutoHideTitleLabel(); + d->createButtons(); setFocusPolicy(Qt::NoFocus); } @@ -900,9 +902,12 @@ QString CDockAreaTitleBar::titleBarButtonToolTip(TitleBarButton Button) const //============================================================================ void CDockAreaTitleBar::showAutoHideControls(bool Show) { - d->TabBar->setVisible(!Show); // Auto hide toolbar never has tabs + if (Show) + d->TabBar->setVisible(false); // Auto hide toolbar never has tabs + d->MinimizeButton->setVisible(Show); - d->AutoHideTitleLabel->setVisible(Show); + if (!CDockManager::testConfigFlag(CDockManager::TabsAtBottom)) + d->AutoHideTitleLabel->setVisible(Show); } diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index 9176387..9fbf223 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -179,14 +179,17 @@ public: parent->setUpdatesEnabled(false); } - auto LayoutItem = m_ParentLayout->takeAt(1); - if (LayoutItem) + if (m_CurrentWidget) { - LayoutItem->widget()->setParent(nullptr); + auto LayoutItem = m_ParentLayout->takeAt(1); + if (LayoutItem) + { + LayoutItem->widget()->setParent(nullptr); + } + delete LayoutItem; } - delete LayoutItem; - m_ParentLayout->addWidget(next); + m_ParentLayout->insertWidget(1, next); if (prev) { prev->hide(); @@ -362,6 +365,14 @@ void DockAreaWidgetPrivate::createTitleBar() { TitleBar = componentsFactory()->createDockAreaTitleBar(_this); Layout->addWidget(TitleBar); + if (CDockManager::testConfigFlag(CDockManager::TabsAtBottom)) + { + // Title bar will be index 0, container widgets will be index 1, + // so tabs will always be at the end of the layout. + Layout->addWidget(tabBar()); + tabBar()->setVisible(CDockManager::testConfigFlag(CDockManager::AlwaysShowTabs)); + } + QObject::connect(tabBar(), &CDockAreaTabBar::tabCloseRequested, _this, &CDockAreaWidget::onTabCloseRequested); QObject::connect(TitleBar, &CDockAreaTitleBar::tabBarClicked, _this, &CDockAreaWidget::setCurrentIndex); QObject::connect(tabBar(), &CDockAreaTabBar::tabMoved, _this, &CDockAreaWidget::reorderDockWidget); @@ -726,6 +737,7 @@ void CDockAreaWidget::setCurrentIndex(int index) TabBar->setCurrentIndex(index); d->ContentsLayout->setCurrentIndex(index); d->ContentsLayout->currentWidget()->show(); + d->TitleBar->autoHideTitleLabel()->setText(d->ContentsLayout->currentWidget()->windowTitle()); Q_EMIT currentChanged(index); } @@ -889,6 +901,8 @@ void CDockAreaWidget::updateTitleBarVisibility() } } d->TitleBar->setVisible(!Hidden); + if (CDockManager::testConfigFlag(CDockManager::TabsAtBottom)) + d->TitleBar->tabBar()->setVisible(openDockWidgetsCount() > 1); } if (isAutoHideFeatureEnabled()) diff --git a/src/DockManager.h b/src/DockManager.h index 92744f7..fcc5ce3 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -216,6 +216,7 @@ public: DisableTabTextEliding = 0x4000000, //! Set this flag to disable eliding of tab texts in dock area tabs ShowTabTextOnlyForActiveTab =0x8000000, //! Set this flag to show label texts in dock area tabs only for active tabs DoubleClickUndocksWidget = 0x10000000, //!< If the flag is set, a double click on a tab undocks the widget + TabsAtBottom = 0x20000000, //!< If the flag is set, tabs will be shown at the bottom instead of in the title bar. DefaultDockAreaButtons = DockAreaHasCloseButton diff --git a/src/stylesheets/default.css b/src/stylesheets/default.css index 19c5ab1..5a73701 100644 --- a/src/stylesheets/default.css +++ b/src/stylesheets/default.css @@ -82,6 +82,10 @@ ads--CDockWidgetTab[activeTab="true"] QLabel { color: palette(foreground); } +#autoHideTitleLabel { + padding-left: 4px; + color: palette(foreground); +} #tabCloseButton { margin-top: 2px; @@ -278,7 +282,7 @@ ads--CAutoHideDockContainer ads--CDockAreaWidget[focused="true"] ads--CDockAreaT } -#autoHideTitleLabel { +ads--CAutoHideDockContainer #autoHideTitleLabel { padding-left: 4px; color: palette(light); } From 66e10e022b9758a80b35d861fdf92f9fc480b5e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vautour=2C=20Andr=C3=A9?= Date: Wed, 24 Sep 2025 09:36:38 -0300 Subject: [PATCH 02/10] Don't show title bar for floating widgets with tabs at bottom. --- src/DockAreaWidget.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index 9fbf223..dfcb4ee 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -891,7 +891,22 @@ void CDockAreaWidget::updateTitleBarVisibility() { // Always show title bar if it contains title bar actions if (CDockWidget* TopLevelWidget = Container->topLevelDockWidget()) + { Hidden |= TopLevelWidget->titleBarActions().empty(); + } + else if (CDockManager::testConfigFlag(CDockManager::TabsAtBottom)) + { + Hidden = true; + + for (CDockWidget* DockWidget : Container->openedDockWidgets()) + { + if (!DockWidget->titleBarActions().empty()) + { + Hidden = false; + break; + } + } + } } if (!Hidden && d->Flags.testFlag(HideSingleWidgetTitleBar)) { From e922a1e5bc9adb3ec766042a7cc3aa29c1ebacde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vautour=2C=20Andr=C3=A9?= Date: Wed, 24 Sep 2025 13:48:26 -0300 Subject: [PATCH 03/10] Updated the title label styling in all of the stylesheets. --- src/stylesheets/default_linux.css | 14 +++++++++++++- src/stylesheets/focus_highlighting.css | 6 +++++- src/stylesheets/focus_highlighting_linux.css | 8 +++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/stylesheets/default_linux.css b/src/stylesheets/default_linux.css index d9bc03d..0583526 100644 --- a/src/stylesheets/default_linux.css +++ b/src/stylesheets/default_linux.css @@ -39,6 +39,12 @@ ads--CTitleBarButton { } +#autoHideTitleLabel { + padding-left: 4px; + color: palette(foreground); +} + + #tabsMenuButton { qproperty-icon: url(:/ads/images/tabs-menu-button.svg); qproperty-iconSize: 16px; @@ -88,6 +94,12 @@ ads--CDockWidgetTab[activeTab="true"] QLabel { } +#autoHideTitleLabel { + padding-left: 4px; + color: palette(foreground); +} + + #tabCloseButton { margin-top: 2px; background: none; @@ -314,7 +326,7 @@ ads--CAutoHideDockContainer ads--CDockAreaWidget[focused="true"] ads--CDockAreaT } -#autoHideTitleLabel { +ads--CAutoHideDockContainer #autoHideTitleLabel { padding-left: 4px; color: palette(light); } diff --git a/src/stylesheets/focus_highlighting.css b/src/stylesheets/focus_highlighting.css index 758f586..9c2f8ed 100644 --- a/src/stylesheets/focus_highlighting.css +++ b/src/stylesheets/focus_highlighting.css @@ -95,6 +95,10 @@ ads--CDockWidgetTab[activeTab="true"] QLabel { color: palette(foreground); } +#autoHideTitleLabel { + padding-left: 4px; + color: palette(foreground); +} #tabCloseButton { margin-top: 2px; @@ -316,7 +320,7 @@ ads--CAutoHideDockContainer ads--CDockAreaWidget[focused="true"] ads--CDockAreaT } -#autoHideTitleLabel { +ads--CAutoHideDockContainer #autoHideTitleLabel { padding-left: 4px; color: palette(light); } diff --git a/src/stylesheets/focus_highlighting_linux.css b/src/stylesheets/focus_highlighting_linux.css index cfedf8f..48ec71a 100644 --- a/src/stylesheets/focus_highlighting_linux.css +++ b/src/stylesheets/focus_highlighting_linux.css @@ -40,6 +40,12 @@ ads--CTitleBarButton { } +#autoHideTitleLabel { + padding-left: 4px; + color: palette(foreground); +} + + #tabsMenuButton { qproperty-icon: url(:/ads/images/tabs-menu-button.svg); qproperty-iconSize: 16px; @@ -391,7 +397,7 @@ ads--CAutoHideDockContainer ads--CDockAreaWidget[focused="true"] ads--CDockAreaT } -#autoHideTitleLabel { +ads--CAutoHideDockContainer #autoHideTitleLabel { padding-left: 4px; color: palette(light); } From 39c8407e0cc0074ff5fd5dfcf3270360fcf14f2f Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 26 Sep 2025 21:52:49 +0200 Subject: [PATCH 04/10] Updated autohidedragndrop example to use new TabsAtBottom config flag --- examples/autohidedragndrop/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/autohidedragndrop/mainwindow.cpp b/examples/autohidedragndrop/mainwindow.cpp index fb5017d..774fca2 100644 --- a/examples/autohidedragndrop/mainwindow.cpp +++ b/examples/autohidedragndrop/mainwindow.cpp @@ -27,6 +27,7 @@ CMainWindow::CMainWindow(QWidget *parent) CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true); CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false); CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); + CDockManager::setConfigFlag(CDockManager::TabsAtBottom, true); CDockManager::setAutoHideConfigFlags(CDockManager::DefaultAutoHideConfig); CDockManager::setAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover, true); CDockManager::setConfigParam(CDockManager::AutoHideOpenOnDragHoverDelay_ms, 500); From 9fd50028866f577d56dae54a4de2b1fa6a48bc48 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 26 Sep 2025 22:08:14 +0200 Subject: [PATCH 05/10] Added documentation for TabsAtBottom flag --- doc/cfg_flag_TabsAtBottom.png | Bin 0 -> 25327 bytes doc/user-guide.md | 156 ++++++++++++++++++---------------- 2 files changed, 82 insertions(+), 74 deletions(-) create mode 100644 doc/cfg_flag_TabsAtBottom.png diff --git a/doc/cfg_flag_TabsAtBottom.png b/doc/cfg_flag_TabsAtBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..724987a95a9dcafb3888b2671bc3bc2cb52df520 GIT binary patch literal 25327 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 Date: Thu, 9 Oct 2025 21:26:38 +0200 Subject: [PATCH 06/10] Remove GuiPrivate dependency for Windows builds (#777) --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e386b0b..c9582ae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,7 +92,7 @@ target_link_libraries(${library_name} PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets) -if(QT_VERSION_MAJOR STREQUAL "6") +if(UNIX AND NOT APPLE AND QT_VERSION_MAJOR STREQUAL "6") target_link_libraries(${library_name} PRIVATE Qt6::GuiPrivate) #needed for endif() From d467b219605e70deaec993b69ccc234523bb2107 Mon Sep 17 00:00:00 2001 From: hormnek Date: Thu, 9 Oct 2025 22:27:30 +0300 Subject: [PATCH 07/10] Fix qApp connection (#778) --- src/DockManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index f31e675..9678cbf 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -530,7 +530,7 @@ CDockManager::CDockManager(QWidget *parent) : window()->installEventFilter(this); #if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) - connect(qApp, &QApplication::focusWindowChanged, [this](QWindow* focusWindow) + connect(qApp, &QApplication::focusWindowChanged, this, [this](QWindow* focusWindow) { if (!focusWindow) { From d7092305108d7ee4d40a5c7d1c4b9b0e26c2361b Mon Sep 17 00:00:00 2001 From: Ivan Ugryumov Date: Mon, 10 Nov 2025 22:44:55 +0300 Subject: [PATCH 08/10] Replace qDebug with ADS_PRINT (#787) --- src/DockWidgetTab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 96bf281..943a8c6 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -539,7 +539,7 @@ QMenu* CDockWidgetTab::buildContextMenu(QMenu *Menu) Menu = new QMenu(this); } - qDebug() << "CDockWidgetTab::buildContextMenu"; + ADS_PRINT("CDockWidgetTab::buildContextMenu"); const bool isFloatable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetFloatable); const bool isTopLevelArea = d->DockArea->isTopLevelArea(); const bool isFloating = d->DockWidget->isFloating(); From eb22a9aef6b8755ef8e5d9d7daf20c7e2c8d30d4 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Wed, 12 Nov 2025 02:22:45 -0500 Subject: [PATCH 09/10] COMP: Fix warnings about override on public destructors (#788) --- src/AutoHideTab.h | 2 +- src/DockAreaWidget.h | 2 +- src/DockContainerWidget.h | 2 +- src/DockWidget.h | 2 +- src/FloatingDockContainer.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/AutoHideTab.h b/src/AutoHideTab.h index 20ee70a..f3b5285 100644 --- a/src/AutoHideTab.h +++ b/src/AutoHideTab.h @@ -93,7 +93,7 @@ public: /** * Virtual Destructor */ - virtual ~CAutoHideTab(); + ~CAutoHideTab() override; /** * Update stylesheet style if a property changes diff --git a/src/DockAreaWidget.h b/src/DockAreaWidget.h index e0c39c7..1deda6b 100644 --- a/src/DockAreaWidget.h +++ b/src/DockAreaWidget.h @@ -199,7 +199,7 @@ public: /** * Virtual Destructor */ - virtual ~CDockAreaWidget(); + ~CDockAreaWidget() override; /** * Returns the dock manager object this dock area belongs to diff --git a/src/DockContainerWidget.h b/src/DockContainerWidget.h index f55855a..d32824b 100644 --- a/src/DockContainerWidget.h +++ b/src/DockContainerWidget.h @@ -219,7 +219,7 @@ public: /** * Virtual Destructor */ - virtual ~CDockContainerWidget(); + ~CDockContainerWidget() override; /** * Adds dockwidget into the given area. diff --git a/src/DockWidget.h b/src/DockWidget.h index 04d10f8..47c015d 100644 --- a/src/DockWidget.h +++ b/src/DockWidget.h @@ -289,7 +289,7 @@ public: /** * Virtual Destructor */ - virtual ~CDockWidget(); + ~CDockWidget() override; /** * We return a fixed minimum size hint or the size hint of the content diff --git a/src/FloatingDockContainer.h b/src/FloatingDockContainer.h index 2dd9d49..284e30a 100644 --- a/src/FloatingDockContainer.h +++ b/src/FloatingDockContainer.h @@ -220,7 +220,7 @@ public: /** * Virtual Destructor */ - virtual ~CFloatingDockContainer(); + ~CFloatingDockContainer() override; /** * Access function for the internal dock container From cd984881e5766a9cff438fb7c80042b942ee0120 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 24 Nov 2025 22:15:42 +0100 Subject: [PATCH 10/10] Improved raising of dock widget application on linux. --- src/DockManager.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 9678cbf..9159866 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -537,8 +538,23 @@ CDockManager::CDockManager(QWidget *parent) : return; } - // bring the main application window that hosts the dock manager and all floating - // widgets in front of any other application + auto widget = QWidget::find(focusWindow->winId()); + if (!widget) + { + return; + } + + // If the user clicks the main window or drags a floating widget or works with a + // dialog, then raise the main window, all floating widgets and the focus window + // itself to bring it into foregreound of any other application + bool raise = qobject_cast(widget) + || qobject_cast(widget) + || qobject_cast(widget); + if (!raise) + { + return; + } + this->raise(); for (auto FloatingWidget : d->FloatingWidgets) {