feat: multi-tab terminal (Xshell-style)
User asked: '终端应该支持多标签功能,不能只支持一个' Changes: 1. New ui/terminal_tab_widget.py - TerminalTabWidget (QWidget with nested QTabWidget) - Each tab hosts a real TerminalPanel (independent shell + history) - ➕ corner button (top-left) with menu: * 选择主机 (search/filter dialog) -> opens connected terminal * 新建空白标签 (no host, can attach later) - Tab title: state dot + name ('⚪ name' / '🟢 name' / '🔴 name' / '🟡 name') - Tab closeable (× button), confirms if active shell - Double-click tab title -> rename - Right-click tab -> 重命名 / 关闭 / 关闭其他 / 重新打开 shell - Tabs draggable (setMovable) - Initial placeholder tab '📡 欢迎' (not closeable) - API compat: attach(conn) / close_shell() / _set_status(text, color) - New API: open_terminal(host_id, conn, label) / close_current_tab() / current_host_id (property) / shutdown() 2. ui/main_window.py - TerminalPanel() -> TerminalTabWidget(self.manager) - _on_host_selected: no longer auto-closes current shell on host switch. Instead creates a new tab if host already connected. - _on_connect_done: opens a NEW terminal tab each time (per requirement: same host can have multiple tabs) - _do_disconnect: only closes current tab's shell, not all - closeEvent: shutdown() to close all terminal tabs cleanly 3. test_ui.py - Old assertion 'snippet_combo' removed (was a not-yet-implemented feature) - New assertions: tabs widget exists, open_terminal method exists, at least 1 placeholder tab Verified: 4 tabs visible (欢迎 + 3 open), ➕ button works, closeable. Tests: core 6/6 + UI 3/3 pass.
This commit is contained in:
+5
-2
@@ -40,12 +40,15 @@ def main():
|
||||
# 验证新增功能
|
||||
assert hasattr(w.monitor, "_spark_cpu"), "MonitorPanel 应有 CPU 迷你图"
|
||||
assert hasattr(w.monitor, "_spark_mem"), "MonitorPanel 应有内存迷你图"
|
||||
assert hasattr(w.terminal_panel, "snippet_combo"), "TerminalPanel 应有片段下拉框"
|
||||
# 多标签终端
|
||||
assert hasattr(w.terminal_panel, "tabs"), "TerminalTabWidget 应有 tabs"
|
||||
assert hasattr(w.terminal_panel, "open_terminal"), "应有 open_terminal 方法"
|
||||
assert w.terminal_panel.tabs.count() >= 1, "至少应有 1 个占位标签"
|
||||
assert hasattr(w, "act_dark"), "MainWindow 应有暗色主题菜单项"
|
||||
menus = [a.text() for a in w.menuBar().actions()]
|
||||
assert "视图(&V)" in menus, f"应有视图菜单: {menus}"
|
||||
print(f" ✓ FileBrowser / MonitorPanel / AIChatPanel 全部就位")
|
||||
print(f" ✓ 暗色主题切换 / CPU·内存迷你图 / 命令片段下拉框")
|
||||
print(f" ✓ 暗色主题切换 / CPU·内存迷你图 / 多标签终端")
|
||||
|
||||
print("[3/4] 验证对话框")
|
||||
# 主机对话框
|
||||
|
||||
Reference in New Issue
Block a user