diff --git a/src/MainWindowBase.cpp b/src/MainWindowBase.cpp index 25ba3bbf..4985e49a 100644 --- a/src/MainWindowBase.cpp +++ b/src/MainWindowBase.cpp @@ -48,6 +48,7 @@ public: QRect rectForOverlay(Frame *, SideBarLocation) const; SideBarLocation preferredSideBar(DockWidgetBase *) const; void updateOverlayGeometry(); + void clearSideBars(); QString name; QStringList affinities; @@ -337,6 +338,15 @@ void MainWindowBase::Private::updateOverlayGeometry() m_overlayedDockWidget->frame()->QWidgetAdapter::setGeometry(rectForOverlay(m_overlayedDockWidget->frame(), sb->location())); } +void MainWindowBase::Private::clearSideBars() +{ + for (auto loc : { SideBarLocation::North, SideBarLocation::South, + SideBarLocation::East, SideBarLocation::West }) { + if (SideBar *sb = q->sideBar(loc)) + sb->clear(); + } +} + void MainWindowBase::moveToSideBar(DockWidgetBase *dw) { moveToSideBar(dw, d->preferredSideBar(dw)); @@ -440,8 +450,20 @@ DockWidgetBase *MainWindowBase::overlayedDockWidget() const bool MainWindowBase::sideBarIsVisible(SideBarLocation loc) const { - if (SideBar *sb = sideBar(loc)) - return sb->isVisible(); + if (SideBar *sb = sideBar(loc)) { + return !sb->isEmpty(); // isVisible() is always true, but its height is 0 when empty. + } + + return false; +} + +bool MainWindowBase::anySideBarIsVisible() const +{ + for (auto loc : { SideBarLocation::North, SideBarLocation::South, + SideBarLocation::East, SideBarLocation::West }) { + if (sideBarIsVisible(loc)) + return true; + } return false; } @@ -484,6 +506,7 @@ bool MainWindowBase::deserialize(const LayoutSaver::MainWindow &mw) const bool success = dropArea()->deserialize(mw.multiSplitterLayout); // Restore the SideBars + d->clearSideBars(); for (SideBarLocation loc : { SideBarLocation::North, SideBarLocation::East, SideBarLocation::West, SideBarLocation::South }) { SideBar *sb = sideBar(loc); if (!sb) diff --git a/src/MainWindowBase.h b/src/MainWindowBase.h index a5869b9b..40f59898 100644 --- a/src/MainWindowBase.h +++ b/src/MainWindowBase.h @@ -168,6 +168,9 @@ public: /// @brief Returns whether the specified sidebar is visible bool sideBarIsVisible(SideBarLocation) const; + /// @brief Returns whether any side bar is visible + bool anySideBarIsVisible() const; + protected: void setUniqueName(const QString &uniqueName); void onResized(QResizeEvent *); // Because QtQuick doesn't have resizeEvent() diff --git a/src/private/SideBar.cpp b/src/private/SideBar.cpp index 1723e7f6..8dadbb06 100644 --- a/src/private/SideBar.cpp +++ b/src/private/SideBar.cpp @@ -117,3 +117,9 @@ QStringList SideBar::serialize() const return ids; } + +void SideBar::clear() +{ + for (DockWidgetBase *dw : qAsConst(m_dockWidgets)) + removeDockWidget(dw); +} diff --git a/src/private/SideBar_p.h b/src/private/SideBar_p.h index 2af24775..6b3a18b4 100644 --- a/src/private/SideBar_p.h +++ b/src/private/SideBar_p.h @@ -53,6 +53,9 @@ public: /// Currently it's just a list of dock widget ids QStringList serialize() const; + /// @brief clears the sidebar (removes all dock widgets from it) + void clear(); + protected: virtual void addDockWidget_Impl(DockWidgetBase *dock) = 0; virtual void removeDockWidget_Impl(DockWidgetBase *dock) = 0; diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 6034d444..f2504a59 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -5155,23 +5155,27 @@ void TestDocks::tst_closeRemovesFromSideBar() void TestDocks::tst_restoreSideBar() { SideBarLocation loc; - QByteArray serialized; + QByteArray serialized; // serialization after having 1 sidebar visible + QByteArray beforeSideBarSerialized; // serialization without any sidebar visible { + LayoutSaver saver; 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")); auto fw1 = dw1->window(); m1->addDockWidget(dw1, Location_OnBottom); + beforeSideBarSerialized = saver.serializeLayout(); + QVERIFY(!m1->anySideBarIsVisible()); m1->moveToSideBar(dw1); + QVERIFY(m1->anySideBarIsVisible()); QVERIFY(!dw1->isOverlayed()); QVERIFY(!dw1->isVisible()); loc = dw1->sideBarLocation(); QVERIFY(loc != SideBarLocation::None); - LayoutSaver saver; serialized = saver.serializeLayout(); delete fw1; @@ -5183,6 +5187,7 @@ void TestDocks::tst_restoreSideBar() auto dw1 = new DockWidgetType(QStringLiteral("1")); auto fw1 = dw1->window(); m1->addDockWidget(dw1, Location_OnBottom); + QVERIFY(!m1->anySideBarIsVisible()); QVERIFY(!dw1->isOverlayed()); QVERIFY(dw1->isVisible()); QVERIFY(!dw1->isFloating()); @@ -5194,9 +5199,17 @@ void TestDocks::tst_restoreSideBar() QVERIFY(!dw1->isOverlayed()); QVERIFY(!dw1->isVisible()); QVERIFY(!dw1->isInMainWindow()); + QVERIFY(m1->anySideBarIsVisible()); QCOMPARE(loc, dw1->sideBarLocation()); + restorer.restoreLayout(beforeSideBarSerialized); + QVERIFY(!dw1->isOverlayed()); + QVERIFY(dw1->isVisible()); + QVERIFY(!dw1->isFloating()); + QVERIFY(dw1->isInMainWindow()); + QVERIFY(!m1->anySideBarIsVisible()); + delete fw1; }