yazi_core/manager/commands/
peek.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
use yazi_proxy::HIDER;
use yazi_shared::{event::{CmdCow, Data}, url::Url};

use crate::manager::Manager;

#[derive(Debug, Default)]
struct Opt {
	skip:        Option<usize>,
	force:       bool,
	only_if:     Option<Url>,
	upper_bound: bool,
}

impl From<CmdCow> for Opt {
	fn from(mut c: CmdCow) -> Self {
		Self {
			skip:        c.first().and_then(Data::as_usize),
			force:       c.bool("force"),
			only_if:     c.take_url("only-if"),
			upper_bound: c.bool("upper-bound"),
		}
	}
}
impl From<bool> for Opt {
	fn from(force: bool) -> Self { Self { force, ..Default::default() } }
}

impl Manager {
	#[yazi_codegen::command]
	pub fn peek(&mut self, opt: Opt) {
		let Some(hovered) = self.hovered().cloned() else {
			return self.active_mut().preview.reset();
		};
		if HIDER.try_acquire().is_err() {
			return self.active_mut().preview.reset_image();
		}

		let mime = self.mimetype.by_file_owned(&hovered).unwrap_or_default();
		let folder = self.active().hovered_folder().map(|f| (f.offset, f.cha));

		if !self.active().preview.same_url(&hovered.url) {
			self.active_mut().preview.skip = folder.map(|f| f.0).unwrap_or_default();
		}
		if !self.active().preview.same_file(&hovered, &mime) {
			self.active_mut().preview.reset();
		}

		if matches!(opt.only_if, Some(u) if u != hovered.url) {
			return;
		}

		if let Some(skip) = opt.skip {
			let preview = &mut self.active_mut().preview;
			if opt.upper_bound {
				preview.skip = preview.skip.min(skip);
			} else {
				preview.skip = skip;
			}
		}

		if hovered.is_dir() {
			self.active_mut().preview.go_folder(hovered, folder.map(|(_, cha)| cha), opt.force);
		} else {
			self.active_mut().preview.go(hovered, mime, opt.force);
		}
	}
}