From 18045f3fe093f3e6d855c94bdfd40231d4e16b2b Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 28 Mar 2023 09:21:01 +0200 Subject: [PATCH] Terminal: Close Pane with last Terminal Closes the Terminal pane once the last terminal is closed. Opening the pane again will also open a new Terminal. Change-Id: I2f822b0058b26506250c784357ba522f29fd4078 Reviewed-by: Cristian Adam Reviewed-by: --- src/plugins/terminal/terminalpane.cpp | 30 ++++++++++++++++++--------- src/plugins/terminal/terminalpane.h | 2 ++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index 3d110e764ee..35a099d410a 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -64,7 +64,6 @@ TerminalPane::TerminalPane(QObject *parent) {":/utils/images/iconoverlay_close_small.png", Theme::IconsStopToolBarColor}}) .icon()); closeTerminal.setToolTip(Tr::tr("Close the current Terminal.")); - closeTerminal.setEnabled(false); connect(&closeTerminal, &QAction::triggered, this, [this] { removeTab(m_tabWidget->currentIndex()); @@ -175,7 +174,8 @@ static std::optional startupProjectDirectory() void TerminalPane::openTerminal(const OpenTerminalParameters ¶meters) { OpenTerminalParameters parametersCopy{parameters}; - showPage(0); + if (!m_isVisible) + emit showPage(0); if (!parametersCopy.workingDirectory) { const std::optional projectDir = startupProjectDirectory(); @@ -193,17 +193,16 @@ void TerminalPane::openTerminal(const OpenTerminalParameters ¶meters) m_tabWidget->currentWidget()->setFocus(); - TerminalCommands::instance().paneActions().closeTerminal.setEnabled(m_tabWidget->count() > 1); emit navigateStateUpdate(); } void TerminalPane::addTerminal(TerminalWidget *terminal, const QString &title) { - showPage(0); + if (!m_isVisible) + emit showPage(0); m_tabWidget->setCurrentIndex(m_tabWidget->addTab(terminal, title)); setupTerminalWidget(terminal); - TerminalCommands::instance().paneActions().closeTerminal.setEnabled(m_tabWidget->count() > 1); emit navigateStateUpdate(); } @@ -236,6 +235,8 @@ QWidget *TerminalPane::outputWidget(QWidget *parent) connect(m_tabWidget, &QTabWidget::currentChanged, this, [this](int index) { if (auto widget = m_tabWidget->widget(index)) widget->setFocus(); + else + emit hidePage(); }); auto terminalWidget = new TerminalWidget(parent); @@ -254,11 +255,7 @@ TerminalWidget *TerminalPane::currentTerminal() const void TerminalPane::removeTab(int index) { - if (m_tabWidget->count() > 1) - delete m_tabWidget->widget(index); - - TerminalCommands::instance().paneActions().closeTerminal.setEnabled(m_tabWidget->count() > 1); - + delete m_tabWidget->widget(index); emit navigateStateUpdate(); } @@ -322,6 +319,19 @@ void TerminalPane::clearContents() t->clearContents(); } +void TerminalPane::visibilityChanged(bool visible) +{ + if (m_isVisible == visible) + return; + + m_isVisible = visible; + + if (visible && m_tabWidget && m_tabWidget->count() == 0) + openTerminal({}); + + IOutputPane::visibilityChanged(visible); +} + void TerminalPane::setFocus() { if (const auto t = currentTerminal()) diff --git a/src/plugins/terminal/terminalpane.h b/src/plugins/terminal/terminalpane.h index 5d93dcb4d9a..079d45a6712 100644 --- a/src/plugins/terminal/terminalpane.h +++ b/src/plugins/terminal/terminalpane.h @@ -27,6 +27,7 @@ public: QString displayName() const override; int priorityInStatusBar() const override; void clearContents() override; + void visibilityChanged(bool visible) override; void setFocus() override; bool hasFocus() const override; bool canFocus() const override; @@ -56,6 +57,7 @@ private: QToolButton *m_escSettingButton{nullptr}; bool m_widgetInitialized{false}; + bool m_isVisible{false}; }; } // namespace Terminal