diff options
| author | akbash <akbash@herdr.dev> | 2026-07-08 15:22:57 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-08 15:22:57 +0300 |
| commit | 552aa8ca223908a2ee3b1058587d4b5a84828e71 (patch) | |
| tree | 24cbf4dbaf71ffef05c30e915cef8b434e1a0b5e /src/ui | |
| parent | 77f0339c3cd387c4ca3f4f240ff8b88065d66a22 (diff) | |
fix: align collapsed sidebar agent rows (#1182)
refs #1168
Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/sidebar.rs | 85 |
1 files changed, 58 insertions, 27 deletions
diff --git a/src/ui/sidebar.rs b/src/ui/sidebar.rs index 72b344fb..687e0ad5 100644 --- a/src/ui/sidebar.rs +++ b/src/ui/sidebar.rs @@ -710,11 +710,6 @@ pub(super) fn render_sidebar_collapsed(app: &AppState, frame: &mut Frame, area: } } - let detail_ws_idx = if is_navigating { - Some(app.selected) - } else { - app.active - }; let detail_content_area = Rect::new( detail_area.x, detail_area.y, @@ -722,29 +717,26 @@ pub(super) fn render_sidebar_collapsed(app: &AppState, frame: &mut Frame, area: detail_area.height.saturating_sub(1), ); if detail_content_area != Rect::default() { - if let Some(ws_idx) = detail_ws_idx { - if let Some(ws) = app.workspaces.get(ws_idx) { - for (detail_idx, detail) in ws.pane_details(&app.terminals).iter().enumerate() { - let y = detail_content_area.y + detail_idx as u16; - if y >= detail_content_area.y + detail_content_area.height { - break; - } - let pane_num = ws - .public_pane_number(detail.pane_id) - .unwrap_or(detail_idx + 1); - let pane_style = Style::default().fg(p.overlay0); - let (icon, icon_style) = - agent_icon(detail.state, detail.seen, app.spinner_tick, p); - frame.render_widget( - Paragraph::new(Line::from(vec![ - Span::styled(format!("{pane_num}"), pane_style), - Span::styled(" ", pane_style), - Span::styled(icon, icon_style), - ])), - Rect::new(detail_content_area.x, y, detail_content_area.width, 1), - ); - } + for (detail_idx, detail) in agent_panel_entries(app).iter().enumerate() { + let y = detail_content_area.y + detail_idx as u16; + if y >= detail_content_area.y + detail_content_area.height { + break; } + let pane_num = app + .workspaces + .get(detail.ws_idx) + .and_then(|ws| ws.public_pane_number(detail.pane_id)) + .unwrap_or(detail_idx + 1); + let pane_style = Style::default().fg(p.overlay0); + let (icon, icon_style) = agent_icon(detail.state, detail.seen, app.spinner_tick, p); + frame.render_widget( + Paragraph::new(Line::from(vec![ + Span::styled(format!("{pane_num}"), pane_style), + Span::styled(" ", pane_style), + Span::styled(icon, icon_style), + ])), + Rect::new(detail_content_area.x, y, detail_content_area.width, 1), + ); } } @@ -1297,6 +1289,45 @@ mod tests { assert_eq!(labels, ["four", "two", "one", "three"]); } + #[test] + fn collapsed_sidebar_uses_all_workspaces_agent_panel_order() { + let mut app = crate::app::state::AppState::test_new(); + app.workspaces = vec![Workspace::test_new("one"), Workspace::test_new("two")]; + app.ensure_test_terminals(); + app.active = Some(0); + app.selected = 0; + app.agent_panel_sort = crate::app::state::AgentPanelSort::Priority; + + let set_state = |app: &mut crate::app::state::AppState, ws_idx: usize, state| { + let pane = app.workspaces[ws_idx].tabs[0].root_pane; + let terminal_id = app.workspaces[ws_idx].tabs[0].panes[&pane] + .attached_terminal_id + .clone(); + let terminal = app.terminals.get_mut(&terminal_id).unwrap(); + terminal.detected_agent = Some(Agent::Claude); + terminal.state = state; + }; + set_state(&mut app, 0, AgentState::Working); + set_state(&mut app, 1, AgentState::Blocked); + + let area = Rect::new(0, 0, 5, 12); + let (_, _, detail_area) = collapsed_sidebar_sections(area); + let first_detail_y = detail_area.y; + let mut terminal = Terminal::new(TestBackend::new(area.width, area.height)) + .expect("test terminal should initialize"); + + terminal + .draw(|frame| render_sidebar_collapsed(&app, frame, area)) + .expect("collapsed sidebar should render"); + + let buffer = terminal.backend().buffer(); + assert_eq!(buffer[(detail_area.x + 2, first_detail_y)].symbol(), "◉"); + assert_eq!( + buffer[(detail_area.x + 2, first_detail_y)].style().fg, + Some(app.palette.red) + ); + } + #[cfg(unix)] #[tokio::test] async fn all_workspaces_agent_panel_entries_use_live_root_runtime_cwd_for_workspace_label() { |
