From ee9faac87c87e530a7c9bb2fb4cffc1f094118c7 Mon Sep 17 00:00:00 2001 From: sxyazi Date: Fri, 8 Mar 2024 15:36:40 +0800 Subject: [PATCH] .. --- yazi-core/src/manager/commands/paste.rs | 8 +++++--- yazi-core/src/manager/commands/remove.rs | 6 +++++- yazi-core/src/manager/commands/update_files.rs | 1 - yazi-core/src/tab/selected.rs | 12 ++++++------ yazi-core/src/tasks/tasks.rs | 12 ++++++------ 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/yazi-core/src/manager/commands/paste.rs b/yazi-core/src/manager/commands/paste.rs index e1612e37..f551f023 100644 --- a/yazi-core/src/manager/commands/paste.rs +++ b/yazi-core/src/manager/commands/paste.rs @@ -16,13 +16,15 @@ impl From for Opt { impl Manager { pub fn paste(&mut self, opt: impl Into, tasks: &Tasks) { let opt = opt.into() as Opt; + let (src, dest) = (self.yanked.iter().collect::>(), self.cwd()); - let dest = self.cwd(); if self.yanked.cut { - tasks.file_cut(&self.yanked, dest, opt.force); + tasks.file_cut(&src, dest, opt.force); + + self.tabs.iter_mut().for_each(|t| _ = t.selected.remove_many(&src, false)); self.unyank(()); } else { - tasks.file_copy(&self.yanked, dest, opt.force, opt.follow); + tasks.file_copy(&src, dest, opt.force, opt.follow); } } } diff --git a/yazi-core/src/manager/commands/remove.rs b/yazi-core/src/manager/commands/remove.rs index 797910c3..6ff0d18f 100644 --- a/yazi-core/src/manager/commands/remove.rs +++ b/yazi-core/src/manager/commands/remove.rs @@ -52,9 +52,13 @@ impl Manager { pub fn remove_do(&mut self, opt: impl Into, tasks: &Tasks) { let opt = opt.into() as Opt; + + self.tabs.iter_mut().for_each(|t| { + t.selected.remove_many(&opt.targets, false); + }); + for u in &opt.targets { self.yanked.remove(u); - self.tabs.iter_mut().for_each(|t| _ = t.selected.remove(u)); } tasks.file_remove(opt.targets, opt.permanently); diff --git a/yazi-core/src/manager/commands/update_files.rs b/yazi-core/src/manager/commands/update_files.rs index a4d75f15..097751ca 100644 --- a/yazi-core/src/manager/commands/update_files.rs +++ b/yazi-core/src/manager/commands/update_files.rs @@ -33,7 +33,6 @@ impl Manager { for (_, tab) in self.tabs.iter_mut().enumerate().filter(|(i, _)| *i != idx) { Self::update_tab(tab, Cow::Borrowed(&op), tasks); } - Self::update_tab(self.active_mut(), Cow::Owned(op), tasks); } diff --git a/yazi-core/src/tab/selected.rs b/yazi-core/src/tab/selected.rs index f2c1ca44..8e0f2117 100644 --- a/yazi-core/src/tab/selected.rs +++ b/yazi-core/src/tab/selected.rs @@ -63,27 +63,27 @@ impl Selected { #[inline] pub fn remove(&mut self, url: &Url) -> bool { self.remove_same(&[url]) == 1 } - pub fn remove_many(&mut self, urls: &[&Url], same: bool) -> usize { + pub fn remove_many(&mut self, urls: &[impl AsRef], same: bool) -> usize { if same { return self.remove_same(urls); } let mut grouped: HashMap<_, Vec<_>> = Default::default(); - for &u in urls { - if let Some(p) = u.parent_url() { + for u in urls { + if let Some(p) = u.as_ref().parent_url() { grouped.entry(p).or_default().push(u); } } grouped.into_values().map(|v| self.remove_same(&v)).sum() } - fn remove_same(&mut self, urls: &[&Url]) -> usize { - let count = urls.iter().map(|&u| self.inner.remove(u)).filter(|&b| b).count(); + fn remove_same(&mut self, urls: &[impl AsRef]) -> usize { + let count = urls.iter().map(|u| self.inner.remove(u.as_ref())).filter(|&b| b).count(); if count == 0 { return 0; } - let mut parent = urls[0].parent_url(); + let mut parent = urls[0].as_ref().parent_url(); while let Some(u) = parent { let n = self.parents.get_mut(&u).unwrap(); diff --git a/yazi-core/src/tasks/tasks.rs b/yazi-core/src/tasks/tasks.rs index 50beb272..f2684c1b 100644 --- a/yazi-core/src/tasks/tasks.rs +++ b/yazi-core/src/tasks/tasks.rs @@ -78,10 +78,10 @@ impl Tasks { } } - pub fn file_cut(&self, src: &HashSet, dest: &Url, force: bool) { - for u in src { + pub fn file_cut(&self, src: &[&Url], dest: &Url, force: bool) { + for &u in src { let to = dest.join(u.file_name().unwrap()); - if force && u == &to { + if force && *u == to { debug!("file_cut: same file, skipping {:?}", to); } else { self.scheduler.file_cut(u.clone(), to, force); @@ -89,10 +89,10 @@ impl Tasks { } } - pub fn file_copy(&self, src: &HashSet, dest: &Url, force: bool, follow: bool) { - for u in src { + pub fn file_copy(&self, src: &[&Url], dest: &Url, force: bool, follow: bool) { + for &u in src { let to = dest.join(u.file_name().unwrap()); - if force && u == &to { + if force && *u == to { debug!("file_copy: same file, skipping {:?}", to); } else { self.scheduler.file_copy(u.clone(), to, force, follow);