v1.9.27: add disconnect button in terminal + disconnect in context menu

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chrome-storm-c442
2026-03-06 05:27:03 -05:00
parent 7522908404
commit 064de8df8d
10 changed files with 78 additions and 2 deletions

View File

@@ -318,6 +318,10 @@ class FilesTab(ctk.CTkFrame):
if self._current_alias and not self._sftp:
self._connect_sftp()
def disconnect(self):
"""Disconnect SFTP and update UI (called by app)."""
self._disconnect_sftp()
# ── SFTP connection ──
def _connect_sftp(self):

View File

@@ -104,6 +104,12 @@ class PowershellTab(ctk.CTkFrame):
if self._current_alias and not self._client:
self._connect(self._current_alias)
def disconnect(self):
"""Disconnect WinRM and update UI (called by app)."""
self._disconnect()
if self._current_alias:
self._set_status(t("term_click_to_connect").format(alias=self._current_alias), "#f59e0b")
# ── Connection ───────────────────────────────────────────────────
def _connect(self, alias: str):

View File

@@ -29,6 +29,17 @@ class TerminalTab(ctk.CTkFrame):
# Import here to avoid circular issues
from gui.widgets.terminal_widget import TerminalWidget
self._toolbar = ctk.CTkFrame(self, fg_color="transparent", height=32)
self._toolbar.pack(fill="x", padx=5, pady=(5, 0))
self._toolbar.pack_propagate(False)
self._disconnect_btn = ctk.CTkButton(
self._toolbar, text=t("ctx_disconnect"), width=110, height=28,
fg_color="#dc2626", hover_color="#b91c1c",
font=ctk.CTkFont(size=12), state="disabled",
command=self._on_disconnect_click,
)
self._disconnect_btn.pack(side="right", padx=2)
self._terminal = TerminalWidget(
self,
send_callback=self._send_to_shell,
@@ -45,6 +56,7 @@ class TerminalTab(ctk.CTkFrame):
# Sudo auto-password detection
self._sudo_buffer = b"" # Buffer for detecting sudo prompts
self._sudo_sent = False # Prevent sending password twice for same prompt
self._on_disconnect_callback = None
def set_server(self, alias: str | None):
if alias == self._current_alias:
@@ -61,6 +73,7 @@ class TerminalTab(ctk.CTkFrame):
self._current_alias = alias
if alias:
self._disconnect_btn.configure(state="disabled")
self._terminal.set_status(t("term_click_to_connect").format(alias=alias), "#f59e0b")
else:
self._terminal.reset()
@@ -71,6 +84,17 @@ class TerminalTab(ctk.CTkFrame):
if self._current_alias and not self._session:
self._connect()
def _on_disconnect_click(self):
if self._on_disconnect_callback and self._current_alias:
self._on_disconnect_callback(self._current_alias)
def disconnect(self):
"""Disconnect and update UI (called by app)."""
self._disconnect()
self._disconnect_btn.configure(state="disabled")
if self._current_alias:
self._terminal.set_status(t("term_click_to_connect").format(alias=self._current_alias), "#f59e0b")
def _connect(self):
if not self._current_alias:
return
@@ -140,6 +164,7 @@ class TerminalTab(ctk.CTkFrame):
# Only grab focus if terminal tab is currently visible
if self._terminal.winfo_ismapped():
self._terminal.focus_terminal()
self._disconnect_btn.configure(state="normal")
self.after(0, _set_session)
except Exception as e:
self.after(0, lambda: self._terminal.set_status(