aboutsummaryrefslogtreecommitdiff
path: root/src/ui.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-03-30 00:30:24 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-03-30 00:30:24 +0300
commit263b8f32654588bc0ca229361f7b7be30d72aed2 (patch)
tree9f777e31a43169dc6a3237dcd48ac0e8e106eda1 /src/ui.rs
parent00e5da8704ecc1a59fbb270e01defdf7dcd9593e (diff)
feat: show upstream status in workspace sidebar
Diffstat (limited to 'src/ui.rs')
-rw-r--r--src/ui.rs32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/ui.rs b/src/ui.rs
index 291a2e98..2b5b8a4a 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -410,7 +410,23 @@ fn render_workspace_list(app: &AppState, frame: &mut Frame, area: Rect, is_navig
);
row_y += 1;
} else if let Some(branch) = ws.branch() {
- let max_branch_len = (area.width as usize).saturating_sub(5);
+ let upstream_label = ws.git_ahead_behind().and_then(|(ahead, behind)| {
+ let mut parts = Vec::new();
+ if ahead > 0 {
+ parts.push((format!("↑{}", ahead), p.green));
+ }
+ if behind > 0 {
+ parts.push((format!("↓{}", behind), p.red));
+ }
+ (!parts.is_empty()).then_some(parts)
+ });
+ let reserved = upstream_label
+ .as_ref()
+ .map(|parts| {
+ parts.iter().map(|(label, _)| label.len()).sum::<usize>() + parts.len()
+ })
+ .unwrap_or(0);
+ let max_branch_len = (area.width as usize).saturating_sub(5 + reserved);
let branch_display = if branch.len() > max_branch_len {
format!("{}…", &branch[..max_branch_len.saturating_sub(1)])
} else {
@@ -421,10 +437,20 @@ fn render_workspace_list(app: &AppState, frame: &mut Frame, area: Rect, is_navig
} else {
p.overlay0
};
- let line2 = Line::from(vec![
+ let mut spans = vec![
Span::styled(" ", Style::default()),
Span::styled(branch_display, Style::default().fg(branch_color)),
- ]);
+ ];
+ if let Some(parts) = upstream_label {
+ spans.push(Span::styled(" ", Style::default()));
+ for (idx, (label, color)) in parts.into_iter().enumerate() {
+ if idx > 0 {
+ spans.push(Span::styled(" ", Style::default()));
+ }
+ spans.push(Span::styled(label, Style::default().fg(color)));
+ }
+ }
+ let line2 = Line::from(spans);
frame.render_widget(
Paragraph::new(line2),
Rect::new(area.x, row_y, area.width, 1),