Clear sidebars before restoring them

If restoring a state without a sidebar, the existing sidebars
should hide

Fixes issue #116
This commit is contained in:
Sergio Martins
2020-12-17 10:35:04 +00:00
parent 75368d334a
commit b6925c928a
5 changed files with 52 additions and 4 deletions

View File

@@ -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)

View File

@@ -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()

View File

@@ -117,3 +117,9 @@ QStringList SideBar::serialize() const
return ids;
}
void SideBar::clear()
{
for (DockWidgetBase *dw : qAsConst(m_dockWidgets))
removeDockWidget(dw);
}

View File

@@ -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;

View File

@@ -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;
}