diff --git a/Changelog b/Changelog index e07bac17..65e5e2a7 100644 --- a/Changelog +++ b/Changelog @@ -7,9 +7,8 @@ - Co-installable with Qt6 - Adds support for non-detachable central widget, MainWindowOption_HasCentralWidget. (#225) - Fix corrupt layout when restoring old JSON - -* v1.4.1 (unreleased) - - + - Fix "Unpin" button not showing up in overlayed widgets + - Minimum Qt version is now 5.15 * v1.4.0 (16 July 2021) - No longer supports Qt versions less than 5.12 diff --git a/README-QtQuick.md b/README-QtQuick.md index f67dfbe7..af68ded5 100644 --- a/README-QtQuick.md +++ b/README-QtQuick.md @@ -2,7 +2,7 @@ Supported Qt versions and toolchains ===================================== KDDockWidgets for QtQuick requires a C++17 capable compiler and either -Qt >= 5.15.0 or Qt >= 6.2. +Qt >= 5.15.2 or Qt >= 6.2.1 TROUBLESHOOTING diff --git a/README.md b/README.md index 8ac8583f..114c4f28 100644 --- a/README.md +++ b/README.md @@ -146,12 +146,7 @@ your application whenever updating KDDW. Supported Qt versions and toolchains ===================================== -KDDockWidgets requires Qt5 >= 5.12 or Qt6 >= 6.1. -The QtQuick support requires Qt5 >= 5.15 or Qt6 >= 6.1. - - -Regarding compilers, whatever toolchain is able to build Qt 5.9 should also be -fine. Note however that MSVC 2013 isn't supported anymore due to compiler crashes. +KDDockWidgets requires Qt 5.15.x or Qt6 >= 6.2. Styling diff --git a/conan/conanfile.py b/conan/conanfile.py index b4742df9..b929647b 100644 --- a/conan/conanfile.py +++ b/conan/conanfile.py @@ -11,7 +11,7 @@ from conans import ConanFile, CMake, tools class KDDockWidgetsConan(ConanFile): name = "kddockwidgets" - version = "1.4.0" + version = "1.5.0" default_user = "kdab" default_channel = "stable" license = ("https://raw.githubusercontent.com/KDAB/KDDockWidgets/master/LICENSES/GPL-2.0-only.txt", diff --git a/src/MainWindowBase.h b/src/MainWindowBase.h index e473cca3..4a664152 100644 --- a/src/MainWindowBase.h +++ b/src/MainWindowBase.h @@ -101,7 +101,7 @@ public: * * Example: kddockwidgets_example --central-widget */ - Q_INVOKABLE void setPersistentCentralWidget(QWidgetOrQuick *widget); + Q_INVOKABLE void setPersistentCentralWidget(KDDockWidgets::QWidgetOrQuick *widget); QWidgetOrQuick *persistentCentralWidget() const; /** diff --git a/src/private/TitleBar.cpp b/src/private/TitleBar.cpp index dc12815a..b22e17de 100644 --- a/src/private/TitleBar.cpp +++ b/src/private/TitleBar.cpp @@ -285,7 +285,7 @@ bool TitleBar::supportsMinimizeButton() const bool TitleBar::supportsAutoHideButton() const { // Only dock widgets docked into the MainWindow can minimize - return m_supportsAutoHide && m_frame && m_frame->isInMainWindow(); + return m_supportsAutoHide && m_frame && (m_frame->isInMainWindow() || m_frame->isOverlayed()); } bool TitleBar::hasIcon() const diff --git a/tests/Testing.cpp b/tests/Testing.cpp index d0dc6b0a..03cc4c32 100644 --- a/tests/Testing.cpp +++ b/tests/Testing.cpp @@ -69,7 +69,10 @@ static bool shouldBlacklistWarning(const QString &msg, const QString &category) #ifdef KDDOCKWIDGETS_QTQUICK // TODO: Fix later, not important right now || msg.contains(QLatin1String("Binding loop detected for property")) - || msg.contains(QLatin1String("Implement me")) + || msg.contains(QLatin1String("Implement me")) + + // Ignore benign warning in Material style when deleting a dock widget. Should be fixed in Qt. + || (msg.contains(QLatin1String("TypeError: Cannot read property")) && msg.contains(QLatin1String("Material"))) #endif ; } diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 2656aec1..668de191 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -619,28 +619,6 @@ void TestDocks::tst_restoreMaximizedState() QCOMPARE(m->windowHandle()->windowState(), Qt::WindowMaximized); } -void TestDocks::tst_restoreFloatingMaximizedState() -{ - EnsureTopLevelsDeleted e; - KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_TitleBarHasMaximizeButton); - auto dock1 = createDockWidget("dock1", new MyWidget("one")); - const QRect originalNormalGeometry = dock1->floatingWindow()->normalGeometry(); - dock1->floatingWindow()->showMaximized(); - qDebug() << originalNormalGeometry; - - QCOMPARE(dock1->floatingWindow()->windowHandle()->windowState(), Qt::WindowMaximized); - - LayoutSaver saver; - const QByteArray saved = saver.serializeLayout(); - - saver.restoreLayout(saved); - QCOMPARE(dock1->floatingWindow()->windowHandle()->windowState(), Qt::WindowMaximized); - QCOMPARE(dock1->floatingWindow()->normalGeometry(), originalNormalGeometry); - - dock1->floatingWindow()->showNormal(); - QCOMPARE(dock1->floatingWindow()->normalGeometry(), originalNormalGeometry); -} - void TestDocks::tst_restoreFloatingMinimizedState() { EnsureTopLevelsDeleted e; @@ -897,6 +875,31 @@ void TestDocks::tst_shutdown() #ifdef KDDOCKWIDGETS_QTWIDGETS +void TestDocks::tst_restoreFloatingMaximizedState() +{ + EnsureTopLevelsDeleted e; + KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_TitleBarHasMaximizeButton); + auto dock1 = createDockWidget("dock1", new MyWidget("one")); + const QRect originalNormalGeometry = dock1->floatingWindow()->normalGeometry(); + dock1->floatingWindow()->showMaximized(); + qDebug() << originalNormalGeometry; + + QCOMPARE(dock1->floatingWindow()->windowHandle()->windowState(), Qt::WindowMaximized); + + LayoutSaver saver; + const QByteArray saved = saver.serializeLayout(); + + saver.restoreLayout(saved); + QCOMPARE(dock1->floatingWindow()->windowHandle()->windowState(), Qt::WindowMaximized); + + + + QCOMPARE(dock1->floatingWindow()->normalGeometry(), originalNormalGeometry); + + dock1->floatingWindow()->showNormal(); + QCOMPARE(dock1->floatingWindow()->normalGeometry(), originalNormalGeometry); +} + void TestDocks::tst_complex() { // Tests some anchors out of bounds I got @@ -4132,12 +4135,14 @@ void TestDocks::tst_dragOverTitleBar() DropArea *da = dock1->floatingWindow()->dropArea(); FloatingWindow *fw1 = dock1->floatingWindow(); FloatingWindow *fw2 = dock2->floatingWindow(); - WindowBeingDragged wbd(fw2, fw2); + { + WindowBeingDragged wbd(fw2, fw2); - const QPoint titleBarPoint = fw1->titleBar()->mapToGlobal(QPoint(5, 5)); + const QPoint titleBarPoint = fw1->titleBar()->mapToGlobal(QPoint(5, 5)); - auto loc = da->hover(&wbd, titleBarPoint); - QCOMPARE(loc, DropIndicatorOverlayInterface::DropLocation_None); + auto loc = da->hover(&wbd, titleBarPoint); + QCOMPARE(loc, DropIndicatorOverlayInterface::DropLocation_None); + } delete fw1; delete fw2; @@ -5253,6 +5258,31 @@ void TestDocks::tst_deleteOnCloseWhenOnSideBar() QVERIFY(dock1); } +void TestDocks::tst_sidebarOverlayShowsAutohide() +{ + // Tests that overlayed widgets show the "Disable auto-hide" button + + EnsureTopLevelsDeleted e; + KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_AutoHideSupport); + + auto m1 = createMainWindow(QSize(1000, 1000), MainWindowOption_None, "MW1"); + auto dw1 = new DockWidgetType(QStringLiteral("1")); + + m1->addDockWidget(dw1, Location_OnBottom); + QVERIFY(dw1->titleBar()->supportsAutoHideButton()); + + m1->moveToSideBar(dw1); + m1->overlayOnSideBar(dw1); + + QVERIFY(dw1->isOverlayed()); + + auto titleBar = dw1->titleBar(); + QVERIFY(titleBar->isVisible()); + QVERIFY(titleBar->supportsAutoHideButton()); + + delete dw1; +} + void TestDocks::tst_sidebarOverlayGetsHiddenOnClick() { EnsureTopLevelsDeleted e; diff --git a/tests/tst_docks.h b/tests/tst_docks.h index 02451501..74f9bb46 100644 --- a/tests/tst_docks.h +++ b/tests/tst_docks.h @@ -91,7 +91,6 @@ private Q_SLOTS: void tst_restoreEmpty(); void tst_restoreCentralFrame(); void tst_restoreMaximizedState(); - void tst_restoreFloatingMaximizedState(); void tst_restoreFloatingMinimizedState(); void tst_restoreNonExistingDockWidget(); void tst_shutdown(); @@ -262,6 +261,7 @@ private Q_SLOTS: void tst_restoreSideBar(); void tst_toggleActionOnSideBar(); void tst_deleteOnCloseWhenOnSideBar(); + void tst_sidebarOverlayShowsAutohide(); void tst_sidebarOverlayGetsHiddenOnClick(); void tst_floatRemovesFromSideBar(); void tst_overlayedGeometryIsSaved(); @@ -282,6 +282,7 @@ private Q_SLOTS: void tst_addToHiddenMainWindow(); void tst_maximumSizePolicy(); void tst_complex(); + void tst_restoreFloatingMaximizedState(); #else void tst_hoverShowsDropIndicators(); #endif