feat: preserve selection order for directories with many files

This commit is contained in:
TKperson 2025-06-28 14:19:17 +08:00
parent 8ef28ec678
commit f73f1e1319
No known key found for this signature in database
GPG key ID: 8A4D0A490CD9919A

View file

@ -37,38 +37,42 @@ impl Mgr {
}
let cwd = self.cwd().clone();
let (mut done, mut todo) = (Vec::with_capacity(selected.len()), vec![]);
for u in selected {
let (mut targets, mut todo) = (vec![Default::default(); selected.len()], vec![]);
for (i, u) in selected.into_iter().enumerate() {
if self.mimetype.contains(u) {
done.push((u.clone(), ""));
targets[i] = (u.clone(), "");
} else if self.guess_folder(u) {
done.push((u.clone(), MIME_DIR));
targets[i] = (u.clone(), MIME_DIR);
} else {
todo.push(u.clone());
targets[i] = (u.clone(), "");
todo.push(i);
}
}
if todo.is_empty() {
return self
.open_do(OpenDoOpt { cwd, hovered, targets: done, interactive: opt.interactive }, tasks);
.open_do(OpenDoOpt { cwd, hovered, targets, interactive: opt.interactive }, tasks);
}
tokio::spawn(async move {
let mut files = Vec::with_capacity(todo.len());
for u in todo {
if let Ok(f) = File::new(u).await {
for i in todo.into_iter().rev() {
if let Ok(f) = File::new(targets[i].0.clone()).await {
targets[i] = (f.url_owned(), "");
files.push(f);
} else {
targets.remove(i);
}
}
done.extend(files.iter().map(|f| (f.url_owned(), "")));
for (fetcher, files) in YAZI.plugin.mime_fetchers(files) {
if let Err(e) = isolate::fetch(CmdCow::from(&fetcher.run), files).await {
error!("Fetch mime failed on opening: {e}");
}
}
MgrProxy::open_do(OpenDoOpt { cwd, hovered, targets: done, interactive: opt.interactive });
MgrProxy::open_do(OpenDoOpt { cwd, hovered, targets, interactive: opt.interactive });
});
}