From 4a3cab03f5d853f4dd48531979fc3fb57dde5e2e Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Sun, 15 Aug 2021 15:51:33 +0200 Subject: [PATCH] When closing a session, don't close the whole window if there are splits When closing a session, we check if that is the last tab, and make the code close the whole window, but we also need to make sure it's the last view, i.e. no split views. CCBUG: 440976 FIXED-IN: 21.12 --- src/ViewManager.cpp | 6 +++--- src/widgets/ViewContainer.cpp | 9 +++++++++ src/widgets/ViewContainer.h | 6 ++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/ViewManager.cpp b/src/ViewManager.cpp index 9585e2c5..92d2951f 100644 --- a/src/ViewManager.cpp +++ b/src/ViewManager.cpp @@ -494,9 +494,9 @@ void ViewManager::sessionFinished() return; } - // The last session/tab? emit empty() so that close() is called in - // MainWindow, fixes #432077 - if (_viewContainer->count() == 1) { + // The last session/tab, and only one view (no splits), emit empty() + // so that close() is called in MainWindow, fixes #432077 + if (_viewContainer->count() == 1 && _viewContainer->currentTabViewCount() == 1) { Q_EMIT empty(); return; } diff --git a/src/widgets/ViewContainer.cpp b/src/widgets/ViewContainer.cpp index dda01316..291de84a 100644 --- a/src/widgets/ViewContainer.cpp +++ b/src/widgets/ViewContainer.cpp @@ -144,6 +144,15 @@ ViewSplitter *TabbedViewContainer::viewSplitterAt(int index) return qobject_cast(widget(index)); } +int TabbedViewContainer::currentTabViewCount() +{ + if (auto *splitter = activeViewSplitter()) { + return splitter->findChildren().count(); + } + + return 1; +} + void TabbedViewContainer::moveTabToWindow(int index, QWidget *window) { auto splitter = viewSplitterAt(index); diff --git a/src/widgets/ViewContainer.h b/src/widgets/ViewContainer.h index 3cbacf2c..8e0a0986 100644 --- a/src/widgets/ViewContainer.h +++ b/src/widgets/ViewContainer.h @@ -135,6 +135,12 @@ public: */ ViewSplitter *viewSplitterAt(int index); + /** + * Returns the number of split views (i.e. TerminalDisplay widgets) + * in this tab; if there are no split views, 1 is returned. + */ + int currentTabViewCount(); + void connectTerminalDisplay(TerminalDisplay *display); void disconnectTerminalDisplay(TerminalDisplay *display); void moveTabLeft();