diff --git a/clients/terminal/tui/screens/terminals_picker.py b/clients/terminal/tui/screens/terminals_picker.py index 32868ca..09cc7d1 100644 --- a/clients/terminal/tui/screens/terminals_picker.py +++ b/clients/terminal/tui/screens/terminals_picker.py @@ -32,12 +32,17 @@ line = Text() line.append(f"{icon} ", style="bold") line.append(str(name), style="bold") + + meta: list[str] = [] if description: - line.append(f" {description}", style="dim") + meta.append(str(description)) if pid is not None: - line.append(f" pid {pid}", style="dim") + meta.append(f"pid {pid}") if uptime is not None: - line.append(f" {int(uptime)}s", style="dim") + meta.append(f"{int(uptime)}s") + if meta: + line.append("\n") + line.append(" " + " ยท ".join(meta), style="dim") return line @@ -108,7 +113,7 @@ def compose(self) -> ComposeResult: with Container(): - yield Static("Open terminals โ€” Enter to close, Esc to cancel", classes="title") + yield Static("Open terminals โ€” Delete to close, Esc to cancel", classes="title") yield ListView(id="terminals-list") def on_mount(self) -> None: @@ -212,7 +217,10 @@ list_view.action_cursor_up() event.stop() event.prevent_default() - elif event.key in ("enter", "return"): + elif event.key in ("delete", "backspace"): + # Delete closes the highlighted terminal โ€” more intuitive than Enter + # (Enter commonly means "open/select", Delete means "remove/close"). + # No-op on an empty list. if self._order: self.run_worker(self._close_highlighted()) event.stop() diff --git a/tests/clients/test_terminals_picker.py b/tests/clients/test_terminals_picker.py index ea52341..7ee69f5 100644 --- a/tests/clients/test_terminals_picker.py +++ b/tests/clients/test_terminals_picker.py @@ -72,7 +72,7 @@ @pytest.mark.anyio -async def test_picker_close_on_enter(monkeypatch: pytest.MonkeyPatch) -> None: +async def test_picker_close_on_delete(monkeypatch: pytest.MonkeyPatch) -> None: async def fake_list(sid): return _terminals()[:1] closed: list[tuple] = [] @@ -88,7 +88,7 @@ await pilot.pause() pilot.app.push_screen(TerminalsPickerScreen("test-session")) await pilot.pause() - await pilot.press("enter") + await pilot.press("delete") await pilot.pause() assert closed == [("test-session", "dev")] # The closed terminal drops out of the list. @@ -147,8 +147,8 @@ screen = pilot.app.screen assert isinstance(screen, TerminalsPickerScreen) assert screen._order == [] - # Enter on an empty list does not raise / does not call close. - await pilot.press("enter") + # Delete on an empty list does not raise / does not call close. + await pilot.press("delete") await pilot.pause() # Still mounted, nothing closed (no crash). assert isinstance(pilot.app.screen, TerminalsPickerScreen) \ No newline at end of file