From 9e2e104baa36e722c865bf148f143e762d77d99a Mon Sep 17 00:00:00 2001 From: hstyi Date: Tue, 11 Nov 2025 10:50:34 +0800 Subject: [PATCH] chore: enhance terminal tab closing behavior to support reconnect option --- .../kotlin/app/termora/PtyHostTerminalTab.kt | 2 +- src/main/kotlin/app/termora/TerminalTabbed.kt | 33 ++++++++++--------- .../app/termora/TerminalTabbedManager.kt | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/app/termora/PtyHostTerminalTab.kt b/src/main/kotlin/app/termora/PtyHostTerminalTab.kt index 1f3fdfc..168c9f1 100644 --- a/src/main/kotlin/app/termora/PtyHostTerminalTab.kt +++ b/src/main/kotlin/app/termora/PtyHostTerminalTab.kt @@ -179,7 +179,7 @@ abstract class PtyHostTerminalTab( val tab = createReconnectTerminalTab() manager.addTerminalTab(index, tab, true) - manager.closeTerminalTab(this, true) + manager.closeTerminalTab(this, disposable = true, reconnect = true) if (tab is HostTerminalTab) { tab.start() diff --git a/src/main/kotlin/app/termora/TerminalTabbed.kt b/src/main/kotlin/app/termora/TerminalTabbed.kt index 4cf0a9b..5c1295d 100644 --- a/src/main/kotlin/app/termora/TerminalTabbed.kt +++ b/src/main/kotlin/app/termora/TerminalTabbed.kt @@ -141,25 +141,28 @@ class TerminalTabbed( } - private fun removeTabAt(index: Int, disposable: Boolean = true) { + private fun removeTabAt(index: Int, disposable: Boolean = true, reconnect: Boolean = false) { if (tabbedPane.isTabClosable(index)) { val tab = tabs[index] // 询问是否可以关闭 if (disposable) { - // 如果开启了关闭确认,那么直接询问用户 - if (appearance.confirmTabClose) { - if (OptionPane.showConfirmDialog( - windowScope.window, - I18n.getString("termora.tabbed.tab.close-prompt"), - messageType = JOptionPane.QUESTION_MESSAGE, - optionType = JOptionPane.OK_CANCEL_OPTION - ) != JOptionPane.OK_OPTION - ) { + // 如果是重连接,那么直接关闭不进行任何形式的询问 + if (reconnect.not()) { + // 如果开启了关闭确认,那么直接询问用户 + if (appearance.confirmTabClose) { + if (OptionPane.showConfirmDialog( + windowScope.window, + I18n.getString("termora.tabbed.tab.close-prompt"), + messageType = JOptionPane.QUESTION_MESSAGE, + optionType = JOptionPane.OK_CANCEL_OPTION + ) != JOptionPane.OK_OPTION + ) { + return + } + } else if (!tab.willBeClose()) { // 如果没有开启则询问用户 return } - } else if (!tab.willBeClose()) { // 如果没有开启则询问用户 - return } } @@ -361,7 +364,7 @@ class TerminalTabbed( } } - override fun indexOfTerminalTab(tab: TerminalTab):Int { + override fun indexOfTerminalTab(tab: TerminalTab): Int { return tabbedPane.indexOfComponent(tab.getJComponent()) } @@ -451,10 +454,10 @@ class TerminalTabbed( } } - override fun closeTerminalTab(tab: TerminalTab, disposable: Boolean) { + override fun closeTerminalTab(tab: TerminalTab, disposable: Boolean, reconnect: Boolean) { for (i in 0 until tabs.size) { if (tabs[i] == tab) { - removeTabAt(i, disposable) + removeTabAt(i, disposable, reconnect) break } } diff --git a/src/main/kotlin/app/termora/TerminalTabbedManager.kt b/src/main/kotlin/app/termora/TerminalTabbedManager.kt index 518a9b1..6eca564 100644 --- a/src/main/kotlin/app/termora/TerminalTabbedManager.kt +++ b/src/main/kotlin/app/termora/TerminalTabbedManager.kt @@ -6,7 +6,7 @@ interface TerminalTabbedManager { fun getSelectedTerminalTab(): TerminalTab? fun getTerminalTabs(): List fun setSelectedTerminalTab(tab: TerminalTab) - fun closeTerminalTab(tab: TerminalTab, disposable: Boolean = true) + fun closeTerminalTab(tab: TerminalTab, disposable: Boolean = true, reconnect: Boolean = false) fun refreshTerminalTabs() fun indexOfTerminalTab(tab: TerminalTab): Int } \ No newline at end of file