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 cwd = self.cwd().clone();
let (mut done, mut todo) = (Vec::with_capacity(selected.len()), vec![]); let (mut targets, mut todo) = (vec![Default::default(); selected.len()], vec![]);
for u in selected {
for (i, u) in selected.into_iter().enumerate() {
if self.mimetype.contains(u) { if self.mimetype.contains(u) {
done.push((u.clone(), "")); targets[i] = (u.clone(), "");
} else if self.guess_folder(u) { } else if self.guess_folder(u) {
done.push((u.clone(), MIME_DIR)); targets[i] = (u.clone(), MIME_DIR);
} else { } else {
todo.push(u.clone()); targets[i] = (u.clone(), "");
todo.push(i);
} }
} }
if todo.is_empty() { if todo.is_empty() {
return self 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 { tokio::spawn(async move {
let mut files = Vec::with_capacity(todo.len()); let mut files = Vec::with_capacity(todo.len());
for u in todo { for i in todo.into_iter().rev() {
if let Ok(f) = File::new(u).await { if let Ok(f) = File::new(targets[i].0.clone()).await {
targets[i] = (f.url_owned(), "");
files.push(f); 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) { for (fetcher, files) in YAZI.plugin.mime_fetchers(files) {
if let Err(e) = isolate::fetch(CmdCow::from(&fetcher.run), files).await { if let Err(e) = isolate::fetch(CmdCow::from(&fetcher.run), files).await {
error!("Fetch mime failed on opening: {e}"); 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 });
}); });
} }