This commit is contained in:
sxyazi 2024-03-12 18:43:21 +08:00
parent 3ec0d45be7
commit 9e4c70138c
No known key found for this signature in database
9 changed files with 66 additions and 24 deletions

View file

@ -84,7 +84,7 @@ impl Manager {
if targets.is_empty() {
return;
} else if !opt.interactive {
return tasks.file_open(&opt.hovered, &targets);
return tasks.process_from_files(&opt.hovered, &targets);
}
let openers: Vec<_> = OPEN.common_openers(&targets).into_iter().cloned().collect();

View file

@ -2,4 +2,5 @@ mod arrow;
mod cancel;
mod inspect;
mod open_with;
mod process_exec;
mod toggle;

View file

@ -5,7 +5,7 @@ use crate::tasks::Tasks;
impl Tasks {
pub fn open_with(&mut self, opt: impl TryInto<OpenWithOpt>) {
if let Ok(opt) = opt.try_into() {
self.file_open_with(&opt.opener, &opt.targets);
self.process_from_opener(&opt.opener, &opt.targets);
}
}
}

View file

@ -0,0 +1,12 @@
use yazi_proxy::options::ProcessExecOpt;
use crate::tasks::Tasks;
impl Tasks {
pub fn process_exec(&mut self, opt: impl TryInto<ProcessExecOpt>) {
if let Ok(opt) = opt.try_into() {
// FIXME
// self.process_from_opener(&opt.opener, &opt.targets);
}
}
}

View file

@ -1,4 +1,5 @@
mod commands;
mod process;
mod progress;
mod tasks;

View file

@ -0,0 +1,30 @@
use std::{collections::HashMap, ffi::OsStr};
use yazi_config::{open::Opener, OPEN};
use yazi_shared::fs::Url;
use super::Tasks;
impl Tasks {
pub fn process_from_files(&self, hovered: &Url, targets: &[(Url, String)]) {
let mut openers = HashMap::new();
for (url, mime) in targets {
if let Some(opener) = OPEN.openers(url, mime).and_then(|o| o.first().copied()) {
openers.entry(opener).or_insert_with(|| vec![hovered]).push(url);
}
}
for (opener, args) in openers {
self.process_from_opener(opener, &args);
}
}
pub fn process_from_opener(&self, opener: &Opener, args: &[impl AsRef<OsStr>]) {
if opener.spread {
self.scheduler.process_open(opener, args);
return;
}
for target in args.iter().skip(1) {
self.scheduler.process_open(opener, &[&args[0], target]);
}
}
}

View file

@ -56,28 +56,6 @@ impl Tasks {
ongoing.values().take(Self::limit()).map(Into::into).collect()
}
pub fn file_open(&self, hovered: &Url, targets: &[(Url, String)]) {
let mut openers = HashMap::new();
for (url, mime) in targets {
if let Some(opener) = OPEN.openers(url, mime).and_then(|o| o.first().copied()) {
openers.entry(opener).or_insert_with(|| vec![hovered]).push(url);
}
}
for (opener, args) in openers {
self.file_open_with(opener, &args);
}
}
pub fn file_open_with(&self, opener: &Opener, args: &[impl AsRef<OsStr>]) {
if opener.spread {
self.scheduler.process_open(opener, args);
return;
}
for target in args.iter().skip(1) {
self.scheduler.process_open(opener, &[&args[0], target]);
}
}
pub fn file_cut(&self, src: &[&Url], dest: &Url, force: bool) {
for &u in src {
let to = dest.join(u.file_name().unwrap());

View file

@ -1,9 +1,11 @@
mod input;
mod notify;
mod open;
mod process;
mod select;
pub use input::*;
pub use notify::*;
pub use open::*;
pub use process::*;
pub use select::*;

View file

@ -0,0 +1,18 @@
use std::ffi::OsString;
use yazi_shared::event::Cmd;
// --- Exec
#[derive(Default)]
pub struct ProcessExecOpt {
pub cmd: OsString,
pub args: Vec<OsString>,
pub block: bool,
pub orphan: bool,
}
impl TryFrom<Cmd> for ProcessExecOpt {
type Error = ();
fn try_from(mut c: Cmd) -> Result<Self, Self::Error> { c.take_data().ok_or(()) }
}