fix: retain repository status between picker openings

This commit is contained in:
Valdemar Lorenzen
2026-10-14 14:36:42 +02:00
parent 77a9111f45
commit 1cb9a0ddfc
7 changed files with 166 additions and 73 deletions
+57 -10
View File
@@ -4649,7 +4649,6 @@ fn draw_file_list(
);
}
let entries = picker.entries();
let normal_markers = changed_files.is_none() && picker.has_repository_changes();
if entries.len() == 0 {
frame.render_widget(
Paragraph::new(if picker.query.is_empty() {
@@ -4722,7 +4721,7 @@ fn draw_file_list(
Style::default().fg(color),
));
spans.push(Span::raw(" "));
} else if normal_markers {
} else if changed_files.is_none() {
spans.push(Span::raw(" "));
}
if status == Some(FileStatus::Renamed)
@@ -7559,7 +7558,6 @@ mod tests {
}
}
picker.refresh();
assert!(picker.has_repository_changes());
assert!(
picker
.entries()
@@ -7581,13 +7579,57 @@ mod tests {
})
.unwrap();
let text = screen_text(&terminal);
assert!(text.contains("> clean.txt"));
assert!(text.contains("r.txt"));
assert!(!text.contains("old�name.txt"));
assert!(!text.contains("d.txt"));
assert!(!text.contains('✓'));
}
#[test]
fn normal_file_names_stay_put_when_status_arrives_or_clears() {
let directory = Directory::new();
directory.file("file.txt", "");
let mut picker = FilePicker::scan(
directory.0.clone(),
FilePresentation::Floating,
FileView::List,
)
.unwrap();
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(80, 12)).unwrap();
for view in [FileView::List, FileView::Tree] {
picker.set_view(view);
let mut columns = Vec::new();
for status in [None, Some(FileStatus::Modified), None] {
picker.set_repository_changes(
status
.into_iter()
.map(|status| crate::repository::WorkingFileChange {
path: "file.txt".into(),
status,
old_path: None,
})
.collect(),
);
terminal
.draw(|frame| {
draw_file_list(
frame,
&picker,
frame.area(),
"",
&mut WheelPanels::default(),
None,
);
})
.unwrap();
let text = screen_text(&terminal);
columns.push(text.lines().find_map(|row| row.find("file.txt")).unwrap());
}
assert_eq!(columns[0], columns[1], "status arrival moved the filename");
assert_eq!(columns[1], columns[2], "clearing status moved the filename");
}
}
#[test]
fn normal_status_prefix_clips_without_review_columns_or_painting_outside_tiny_bounds() {
let directory = Directory::new();
@@ -13167,7 +13209,7 @@ end
.draw(|frame| draw_file_list(frame, &picker, area, "", &mut panels, None))
.unwrap();
assert!(panels.manual_files.is_none());
assert!(screen_text(&terminal).contains("> file-10"));
assert!(screen_text(&terminal).contains("file-10"));
}
#[test]
@@ -13306,7 +13348,11 @@ end
})
.unwrap();
let text = screen_text(&terminal);
assert!(text.contains(&format!("> {label}")), "{text}");
assert!(
text.lines()
.any(|row| row.contains(label) && row.contains('>')),
"{text}"
);
let buffer = terminal.backend().buffer();
let selected_y = (3..8).find(|&y| buffer[(1, y)].symbol() == ">").unwrap();
assert_eq!(buffer[(1, selected_y)].bg, Color::Blue);
@@ -13451,8 +13497,10 @@ end
let selected_y = (area.y + 2..area.bottom() - 1)
.find(|&y| buffer[(area.x + 1, y)].symbol() == ">")
.unwrap();
assert_eq!(buffer[(area.x + 3, selected_y)].symbol(), "界");
assert_eq!(buffer[(area.x + 5, selected_y)].symbol(), "e\u{301}");
let selected_x = (area.x + 2..area.right())
.find(|&x| buffer[(x, selected_y)].symbol() == "界")
.unwrap();
assert_eq!(buffer[(selected_x + 2, selected_y)].symbol(), "e\u{301}");
assert_eq!(buffer[(area.x + 1, selected_y)].bg, Color::Blue);
assert!(
buffer[(area.x + 1, selected_y)]
@@ -13729,7 +13777,6 @@ end
" nested/",
" inner.txt",
" sibling.txt",
"> single/",
" only.txt",
" root.txt",
] {
@@ -13833,7 +13880,7 @@ end
}
if width == 100 {
let text = screen_text(&terminal);
assert!(text.contains("> file.txt"), "{text}");
assert!(text.contains("file.txt"), "{text}");
assert!(!text.contains("dir-00"), "{text}");
}
for query in ["missing", long_query.as_str()] {