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:
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -117,3 +117,9 @@ QStringList SideBar::serialize() const
|
||||
|
||||
return ids;
|
||||
}
|
||||
|
||||
void SideBar::clear()
|
||||
{
|
||||
for (DockWidgetBase *dw : qAsConst(m_dockWidgets))
|
||||
removeDockWidget(dw);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user