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
+19 -12
View File
@@ -1830,6 +1830,7 @@ pub struct Editor {
startup_diagnostic: Option<StartupDiagnostic>,
project_root: PathBuf,
file_picker: Option<FilePicker>,
picker_repository_changes: Vec<crate::repository::WorkingFileChange>,
file_explorer_side: DockSide,
file_picker_view: FileView,
file_explorer_view: FileView,
@@ -1958,6 +1959,7 @@ impl Editor {
startup_diagnostic: None,
project_root: std::env::current_dir()?,
file_picker: None,
picker_repository_changes: Vec::new(),
file_explorer_side: DockSide::Right,
file_picker_view: FileView::Tree,
file_explorer_view: FileView::Tree,
@@ -4790,21 +4792,24 @@ impl Editor {
pub(crate) fn set_picker_repository_changes(
&mut self,
tab: usize,
root: &Path,
changes: Vec<crate::repository::WorkingFileChange>,
) -> bool {
let picker = if tab == self.tab_id {
self.file_picker.as_mut().filter(|_| self.diff.is_none())
} else {
self.tabs
.get_mut(&tab)
.and_then(|tab| tab.file_picker.as_mut().filter(|_| tab.diff.is_none()))
};
let Some(picker) = picker.filter(|picker| picker.root == root) else {
if root != self.project_root {
return false;
};
picker.set_repository_changes(changes)
}
let mut changed = false;
for picker in self.file_picker.iter_mut().chain(
self.tabs
.values_mut()
.filter_map(|tab| tab.file_picker.as_mut()),
) {
if picker.root == root {
changed |= picker.set_repository_changes(changes.clone());
}
}
self.picker_repository_changes = changes;
changed
}
pub fn file_explorer_side(&self) -> DockSide {
@@ -4861,6 +4866,7 @@ impl Editor {
#[cfg(test)]
pub(crate) fn set_project_root(&mut self, root: PathBuf) {
self.project_root = root;
self.picker_repository_changes.clear();
}
/// Pending decimal prefix for the next Normal/Visual motion or editing action.
pub fn count(&self) -> Option<usize> {
@@ -5950,7 +5956,8 @@ impl Editor {
picker.clear_error();
} else {
match FilePicker::scan(self.project_root.clone(), presentation, view) {
Ok(picker) => {
Ok(mut picker) => {
picker.set_repository_changes(self.picker_repository_changes.clone());
self.file_picker = Some(picker);
}
Err(error) => {