From a91d956429d17ba708ae8725bb2d0b9cd4028b87 Mon Sep 17 00:00:00 2001 From: Felipe Coury Date: Sat, 11 Apr 2026 18:16:29 -0300 Subject: [PATCH] fix(tui): allow clearing hidden github pr status item Treat an empty `/statusline` confirmation as an intentional clear even when `github-pr` is hidden because `gh` is unavailable. Preserve hidden items only when visible selections remain. --- .../tui/src/bottom_pane/status_line_setup.rs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/codex-rs/tui/src/bottom_pane/status_line_setup.rs b/codex-rs/tui/src/bottom_pane/status_line_setup.rs index ff2c5da2eb..fe0e1e962e 100644 --- a/codex-rs/tui/src/bottom_pane/status_line_setup.rs +++ b/codex-rs/tui/src/bottom_pane/status_line_setup.rs @@ -201,6 +201,10 @@ fn restore_hidden_status_line_items( mut items: Vec, hidden_items: &[(usize, StatusLineItem)], ) -> Vec { + if items.is_empty() { + return items; + } + for (index, item) in hidden_items { if items.contains(item) { continue; @@ -548,6 +552,28 @@ mod tests { ); } + #[tokio::test] + async fn confirm_empty_selection_does_not_restore_hidden_github_pr() { + let (tx_raw, mut rx) = unbounded_channel::(); + let mut view = StatusLineSetupView::new( + Some(&[ + StatusLineItem::ModelName.to_string(), + StatusLineItem::GithubPr.to_string(), + ]), + StatusLinePreviewData::default(), + /*github_pr_available*/ false, + AppEventSender::new(tx_raw), + ); + + view.handle_key_event(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE)); + view.handle_key_event(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)); + + let Some(AppEvent::StatusLineSetup { items }) = rx.recv().await else { + panic!("expected status line setup event"); + }; + assert_eq!(items, Vec::::new()); + } + fn render_lines(view: &StatusLineSetupView, width: u16) -> String { let height = view.desired_height(width); let area = Rect::new(0, 0, width, height);