diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-03 01:58:17 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-03 01:58:17 +0300 |
| commit | 685862e276ef4911029e47bdffad79143b096d0a (patch) | |
| tree | 02e938bbb191e424a87acfce207f82ca19fe9779 /src | |
| parent | 1468436fe39b65c8052f1df42d545843061266a6 (diff) | |
polish sidebar agent cards
Diffstat (limited to 'src')
| -rw-r--r-- | src/app/input.rs | 9 | ||||
| -rw-r--r-- | src/ui.rs | 42 |
2 files changed, 33 insertions, 18 deletions
diff --git a/src/app/input.rs b/src/app/input.rs index 83d1d579..9d8e5d6b 100644 --- a/src/app/input.rs +++ b/src/app/input.rs @@ -2153,7 +2153,12 @@ impl AppState { }; let ws = self.workspaces.get(detail_ws_idx)?; - let detail_idx = (row - (detail_area.y + 3)) as usize; + let relative_row = row - (detail_area.y + 3); + let entry_height = 3; + if relative_row % entry_height == 2 { + return None; + } + let detail_idx = (relative_row / entry_height) as usize; let details = ws.pane_details(); let detail = details.get(detail_idx)?; Some((detail_ws_idx, detail.tab_idx, detail.pane_id)) @@ -3004,7 +3009,7 @@ mod tests { app.state.selected = 0; app.state.mode = Mode::Terminal; - app.handle_mouse(mouse(MouseEventKind::Down(MouseButton::Left), 2, 14)); + app.handle_mouse(mouse(MouseEventKind::Down(MouseButton::Left), 2, 16)); assert_eq!(app.state.workspaces[0].active_tab, 1); assert_eq!( @@ -313,7 +313,11 @@ fn compute_sidebar_width(app: &AppState) -> u16 { .workspaces .iter() .flat_map(|ws| ws.pane_details().into_iter()) - .map(|detail| 3 + detail.label.len() + 1 + state_label(detail.state, detail.seen).len()) + .map(|detail| { + let name_line = 3 + detail.label.len(); // " icon name" + let state_line = 2 + state_label(detail.state, detail.seen).len(); // " state" + name_line.max(state_line) + }) .max() .unwrap_or(0); ((max_workspace_line.max(max_agent_line) as u16) + 2) @@ -642,7 +646,7 @@ fn render_agent_detail( // Per-pane agent entries, sorted by urgency let details = ws.pane_details(); for detail in &details { - if row_y >= area.y + area.height { + if row_y + 1 >= area.y + area.height { break; } @@ -650,32 +654,38 @@ fn render_agent_detail( let label_color = state_label_color(detail.state, detail.seen, p); let label = state_label(detail.state, detail.seen); - // Agent name in soft white, state label right-aligned in its color let name_style = Style::default().fg(p.subtext0).add_modifier(Modifier::BOLD); + let status_style = Style::default().fg(label_color).add_modifier(Modifier::DIM); - // Calculate padding to right-align state label - let used = 3 + detail.label.len() + 1; // " icon name " - let label_len = label.len(); - let avail = (area.width as usize).saturating_sub(used + label_len); - let padding = " ".repeat(avail); - - let line = Line::from(vec![ + let name_line = Line::from(vec![ Span::styled(" ", Style::default()), Span::styled(icon, icon_style), Span::styled(" ", Style::default()), Span::styled(&detail.label, name_style), - Span::styled(padding, Style::default()), - Span::styled( - label, - Style::default().fg(label_color).add_modifier(Modifier::DIM), - ), ]); + frame.render_widget( + Paragraph::new(name_line), + Rect::new(area.x, row_y, area.width, 1), + ); + row_y += 1; + + if row_y >= area.y + area.height { + break; + } + let status_line = Line::from(vec![ + Span::styled(" ", Style::default()), + Span::styled(label, status_style), + ]); frame.render_widget( - Paragraph::new(line), + Paragraph::new(status_line), Rect::new(area.x, row_y, area.width, 1), ); row_y += 1; + + if row_y < area.y + area.height { + row_y += 1; + } } } |
