yazi_core/manager/commands/
remove.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use yazi_config::popup::ConfirmCfg;
use yazi_proxy::{ConfirmProxy, ManagerProxy};
use yazi_shared::{event::CmdCow, url::Url};

use crate::{manager::Manager, tasks::Tasks};

struct Opt {
	force:       bool,
	permanently: bool,
	hovered:     bool,
	targets:     Vec<Url>,
}

impl From<CmdCow> for Opt {
	fn from(mut c: CmdCow) -> Self {
		Self {
			force:       c.bool("force"),
			permanently: c.bool("permanently"),
			hovered:     c.bool("hovered"),
			targets:     c.take_any("targets").unwrap_or_default(),
		}
	}
}

impl Manager {
	#[yazi_codegen::command]
	pub fn remove(&mut self, mut opt: Opt, tasks: &Tasks) {
		if !self.active_mut().try_escape_visual() {
			return;
		}

		opt.targets = if opt.hovered {
			self.hovered().map_or(vec![], |h| vec![h.url.clone()])
		} else {
			self.selected_or_hovered().cloned().collect()
		};

		if opt.targets.is_empty() {
			return;
		} else if opt.force {
			return self.remove_do(opt, tasks);
		}

		tokio::spawn(async move {
			let result = ConfirmProxy::show(if opt.permanently {
				ConfirmCfg::delete(&opt.targets)
			} else {
				ConfirmCfg::trash(&opt.targets)
			});

			if result.await {
				ManagerProxy::remove_do(opt.targets, opt.permanently);
			}
		});
	}

	#[yazi_codegen::command]
	pub fn remove_do(&mut self, opt: Opt, tasks: &Tasks) {
		self.tabs.iter_mut().for_each(|t| {
			t.selected.remove_many(&opt.targets, false);
		});

		for u in &opt.targets {
			self.yanked.remove(u);
		}

		self.yanked.catchup_revision(false);
		tasks.file_remove(opt.targets, opt.permanently);
	}
}