From 378c647952243e72a90f3f73ce93cccc6540db9f Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 20 Jan 2023 09:44:18 +0100 Subject: [PATCH] Fixed #481 issue Undocking an autohide dock widget does not close the AutoHideTab from the sidebar --- src/DockAreaTitleBar.cpp | 29 ++++++++++++++++------------- src/DockWidgetTab.cpp | 8 ++++++++ src/ads_globals.h | 2 ++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index 86cd744..68d0a7c 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -262,12 +262,16 @@ IFloatingWidget* DockAreaTitleBarPrivate::makeAreaFloating(const QPoint& Offset, { QSize Size = DockArea->size(); this->DragState = DragState; - bool OpaqueUndocking = CDockManager::testConfigFlag(CDockManager::OpaqueUndocking) || - (DraggingFloatingWidget != DragState); + bool CreateFloatingDockContainer = CDockManager::testConfigFlag( + CDockManager::OpaqueUndocking) || (DraggingFloatingWidget != DragState); CFloatingDockContainer* FloatingDockContainer = nullptr; IFloatingWidget* FloatingWidget; - if (OpaqueUndocking) + if (CreateFloatingDockContainer) { + if (DockArea->autoHideDockContainer()) + { + DockArea->autoHideDockContainer()->cleanupAndDelete(); + } FloatingWidget = FloatingDockContainer = new CFloatingDockContainer(DockArea); } else @@ -297,7 +301,7 @@ IFloatingWidget* DockAreaTitleBarPrivate::makeAreaFloating(const QPoint& Offset, //============================================================================ void DockAreaTitleBarPrivate::startFloating(const QPoint& Offset) { - if (DockArea->autoHideDockContainer() != nullptr) + if (DockArea->autoHideDockContainer()) { DockArea->autoHideDockContainer()->hide(); } @@ -428,11 +432,6 @@ void CDockAreaTitleBar::onUndockButtonClicked() { if (d->DockArea->features().testFlag(CDockWidget::DockWidgetFloatable)) { - if (d->DockArea->autoHideDockContainer()) - { - d->DockArea->autoHideDockContainer()->cleanupAndDelete(); - } - d->makeAreaFloating(mapFromGlobal(QCursor::pos()), DraggingInactive); } } @@ -590,6 +589,10 @@ void CDockAreaTitleBar::mouseReleaseEvent(QMouseEvent* ev) if (ev->button() == Qt::LeftButton) { ADS_PRINT("CDockAreaTitleBar::mouseReleaseEvent"); + if (CDockManager::testConfigFlag(CDockManager::OpaqueUndocking)) + { + releaseMouse(); + } ev->accept(); auto CurrentDragState = d->DragState; d->DragStartMousePos = QPoint(); @@ -650,6 +653,10 @@ void CDockAreaTitleBar::mouseMoveEvent(QMouseEvent* ev) d->startFloating(d->DragStartMousePos); auto Overlay = d->DockArea->dockManager()->containerOverlay(); Overlay->setAllowedAreas(OuterDockAreas); + if (CDockManager::testConfigFlag(CDockManager::OpaqueUndocking)) + { + grabMouse(); + } } return; @@ -671,10 +678,6 @@ void CDockAreaTitleBar::mouseDoubleClickEvent(QMouseEvent *event) { return; } - if (d->DockArea->autoHideDockContainer()) - { - d->DockArea->autoHideDockContainer()->cleanupAndDelete(); - } d->makeAreaFloating(event->pos(), DraggingInactive); } diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 3fc9609..dfdf908 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -392,6 +392,10 @@ void CDockWidgetTab::mouseReleaseEvent(QMouseEvent* ev) { if (ev->button() == Qt::LeftButton) { + if (CDockManager::testConfigFlag(CDockManager::OpaqueUndocking)) + { + releaseMouse(); + } auto CurrentDragState = d->DragState; d->GlobalDragStartMousePosition = QPoint(); d->DragStartMousePosition = QPoint(); @@ -490,6 +494,10 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev) parentWidget()->layout()->update(); } d->startFloating(); + if (CDockManager::testConfigFlag(CDockManager::OpaqueUndocking)) + { + grabMouse(); + } } return; } diff --git a/src/ads_globals.h b/src/ads_globals.h index 24a65c7..135fc37 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -38,6 +38,8 @@ #include #include +#include + #ifdef Q_OS_LINUX #include #endif