From d07f715ed74d848077d91256a060d2449a5d0a0e Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Tue, 26 May 2020 21:49:18 +0100 Subject: [PATCH] updateTitleBarVisibility after deserializing Fixes floating window having two title bars --- src/private/FloatingWindow.cpp | 4 ++++ src/private/Frame.cpp | 12 +++++++++++- src/private/Frame_p.h | 1 + tests/tst_docks.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index a40bd37f..9f25d4ea 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -336,6 +336,9 @@ void FloatingWindow::updateTitleBarVisibility() visible = !frames().first()->hasTabsVisible(); } } + + for (Frame *frame : frames()) + frame->updateTitleBarVisibility(); } m_titleBar->setVisible(visible); @@ -390,6 +393,7 @@ void FloatingWindow::onCloseEvent(QCloseEvent *e) bool FloatingWindow::deserialize(const LayoutSaver::FloatingWindow &fw) { if (dropArea()->multiSplitterLayout()->deserialize(fw.multiSplitterLayout)) { + updateTitleBarVisibility(); show(); return true; } else { diff --git a/src/private/Frame.cpp b/src/private/Frame.cpp index 8016544e..5d53ea50 100644 --- a/src/private/Frame.cpp +++ b/src/private/Frame.cpp @@ -201,6 +201,13 @@ void Frame::onCurrentTabChanged(int index) void Frame::updateTitleBarVisibility() { + if (m_updatingTitleBar) { + // To break a cyclic dependency + return; + } + + QScopedValueRollback guard(m_updatingTitleBar, true); + bool visible = false; if (isCentralFrame()) { visible = false; @@ -214,8 +221,11 @@ void Frame::updateTitleBarVisibility() } m_titleBar->setVisible(visible); - if (auto fw = floatingWindow()) + if (auto fw = floatingWindow()) { + // Update the floating window which might be using Flag_HideTitleBarWhenTabsVisible + // In that case it might not show title bar depending on the number of tabs that the frame has fw->updateTitleBarVisibility(); + } } bool Frame::containsMouse(QPoint globalPos) const diff --git a/src/private/Frame_p.h b/src/private/Frame_p.h index 86b4d61d..fcc42a5f 100644 --- a/src/private/Frame_p.h +++ b/src/private/Frame_p.h @@ -223,6 +223,7 @@ private: DropArea *m_dropArea = nullptr; const FrameOptions m_options; QPointer m_layoutItem; + bool m_updatingTitleBar = false; bool m_beingDeleted = false; QMetaObject::Connection m_visibleWidgetCountChangedConnection; }; diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 14a5f98f..e5368423 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -5301,6 +5301,32 @@ void TestDocks::tst_moreTitleBarCornerCases() delete fw1; delete fw2; } + + { + // Tests that restoring a single floating dock widget doesn't make it show two title-bars + // As reproduced myself... and fixed in this commit + + EnsureTopLevelsDeleted e; + auto dock1 = createDockWidget("dock1", new QPushButton("foo1")); + dock1->show(); + + auto fw1 = qobject_cast(dock1->window()); + QVERIFY(!dock1->frame()->titleBar()->isVisible()); + QVERIFY(fw1->titleBar()->isVisible()); + + LayoutSaver saver; + const QByteArray saved = saver.serializeLayout(); + saver.restoreLayout(saved); + + delete fw1; // the old window + + fw1 = qobject_cast(dock1->window()); + QVERIFY(dock1->isVisible()); + QVERIFY(!dock1->frame()->titleBar()->isVisible()); + QVERIFY(fw1->titleBar()->isVisible()); + delete dock1->window(); + } + } int main(int argc, char *argv[])