aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-03 01:58:17 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-03 01:58:17 +0300
commit685862e276ef4911029e47bdffad79143b096d0a (patch)
tree02e938bbb191e424a87acfce207f82ca19fe9779 /src
parent1468436fe39b65c8052f1df42d545843061266a6 (diff)
polish sidebar agent cards
Diffstat (limited to 'src')
-rw-r--r--src/app/input.rs9
-rw-r--r--src/ui.rs42
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!(
diff --git a/src/ui.rs b/src/ui.rs
index 05b5a634..bf6c075a 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -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;
+ }
}
}