diff --git a/Changelog b/Changelog index ec95ba29..0bb1028e 100644 --- a/Changelog +++ b/Changelog @@ -23,6 +23,7 @@ - DockWidgetBase::eventFilter() is protected instead of private (regression vs v1.1) (#148) It's recommended that you rebuild your application when updating KDDW, as MSVC encodes private/protected in the name mangling. - Fixed WASM build on Windows (#163) + - Fixed sidebar overlay not getting hidden when clicking on the main window docking area (#157) * v1.2.0 (17 December 2020) - Wayland support diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index cd5c936b..36ed2346 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -637,7 +637,16 @@ bool DockRegistry::eventFilter(QObject *watched, QEvent *event) auto p = watched; while (p) { if (auto dw = qobject_cast(p)) - return onDockWidgetPressed(dw, static_cast(event)); + return onDockWidgetPressed(dw, static_cast(event)); + + if (auto dropArea = qobject_cast(p)) { + if (auto mw = dropArea->mainWindow()) { + // The user clicked somewhere in the main window's drop area, but outside of the + // overlayed dock widget + mw->clearSideBarOverlay(); + return false; + } + } p = p->parent(); } diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 406a1ba6..012c9223 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -263,6 +263,7 @@ private Q_SLOTS: void tst_restoreSideBar(); void tst_toggleActionOnSideBar(); void tst_deleteOnCloseWhenOnSideBar(); + void tst_sidebarOverlayGetsHiddenOnClick(); // And fix these void tst_floatingWindowDeleted(); @@ -5215,6 +5216,61 @@ void TestDocks::tst_deleteOnCloseWhenOnSideBar() QVERIFY(dock1); } +void TestDocks::tst_sidebarOverlayGetsHiddenOnClick() +{ + EnsureTopLevelsDeleted e; + KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_AutoHideSupport); + + { + // Case #1 click on another dockwidget should hide the overlay + + auto m1 = createMainWindow(QSize(1000, 1000), MainWindowOption_None, "MW1"); + auto dw1 = new DockWidgetType(QStringLiteral("1")); + auto dw2 = new DockWidgetType(QStringLiteral("2")); + + m1->addDockWidget(dw1, Location_OnBottom); + m1->addDockWidget(dw2, Location_OnBottom); + + m1->moveToSideBar(dw1); + m1->overlayOnSideBar(dw1); + + QVERIFY(dw1->isOverlayed()); + + Tests::clickOn(dw2->mapToGlobal(dw2->rect().bottomLeft() + QPoint(5, -5)), dw2); + QVERIFY(!dw1->isOverlayed()); + + auto widget2 = new MyWidget("foo"); + dw2->setWidget(widget2); + m1->overlayOnSideBar(dw1); + QVERIFY(dw1->isOverlayed()); + + Tests::clickOn(widget2->mapToGlobal(widget2->rect().bottomLeft() + QPoint(5, -5)), widget2); + QVERIFY(!dw1->isOverlayed()); + + delete dw1; + } + + { + // Case #1 click on empty main window space, should hide the overlay + + auto m1 = createMainWindow(QSize(1000, 1000), MainWindowOption_None, "MW1"); + auto dw1 = new DockWidgetType(QStringLiteral("1")); + + m1->addDockWidget(dw1, Location_OnBottom); + + m1->moveToSideBar(dw1); + m1->overlayOnSideBar(dw1); + + QVERIFY(dw1->isOverlayed()); + + const QPoint localPt(100, 250); + Tests::clickOn(m1->mapToGlobal(m1->rect().topLeft() + localPt), m1->childAt(localPt)); + QVERIFY(!dw1->isOverlayed()); + + delete dw1; + } +} + void TestDocks::tst_embeddedMainWindow() { EnsureTopLevelsDeleted e;