yazi/core/src/manager/commands/open.rs
2023-10-15 09:09:36 +08:00

58 lines
1.3 KiB
Rust

use config::OPEN;
use shared::MIME_DIR;
use crate::{emit, external, manager::Manager, select::SelectOpt};
impl Manager {
pub fn open(&mut self, interactive: bool) -> bool {
let mut files: Vec<_> = self
.selected()
.into_iter()
.map(|f| {
(
f.url(),
f.is_dir().then(|| MIME_DIR.to_owned()).or_else(|| self.mimetype.get(&f.url).cloned()),
)
})
.collect();
if files.is_empty() {
return false;
}
tokio::spawn(async move {
let todo: Vec<_> = files.iter().filter(|(_, m)| m.is_none()).map(|(u, _)| u).collect();
if let Ok(mut mimes) = external::file(&todo).await {
files = files
.into_iter()
.map(|(u, m)| {
let mime = m.or_else(|| mimes.remove(&u));
(u, mime)
})
.collect();
}
let files: Vec<_> =
files.into_iter().filter_map(|(u, m)| m.map(|m| (u.into_os_string(), m))).collect();
if !interactive {
emit!(Open(files, None));
return;
}
let openers = OPEN.common_openers(&files);
if openers.is_empty() {
return;
}
let result = emit!(Select(SelectOpt::hovered(
"Open with:",
openers.iter().map(|o| o.display_name.clone()).collect()
)));
if let Ok(choice) = result.await {
emit!(Open(files, Some(openers[choice].clone())));
}
});
false
}
}