mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-24 16:21:04 +00:00
70 lines
1.9 KiB
Rust
70 lines
1.9 KiB
Rust
use yazi_config::{YAZI, plugin::MAX_PREWORKERS};
|
|
use yazi_fs::{File, Files, SortBy};
|
|
|
|
use super::Tasks;
|
|
use crate::mgr::Mimetype;
|
|
|
|
impl Tasks {
|
|
pub fn fetch_paged(&self, paged: &[File], mimetype: &Mimetype) {
|
|
let mut loaded = self.scheduler.prework.loaded.lock();
|
|
let mut tasks: [Vec<_>; MAX_PREWORKERS as usize] = Default::default();
|
|
for f in paged {
|
|
let hash = f.hash_u64();
|
|
for g in YAZI.plugin.fetchers(&f.url, mimetype.by_file(f).unwrap_or_default()) {
|
|
match loaded.get_mut(&hash) {
|
|
Some(n) if *n & (1 << g.idx) != 0 => continue,
|
|
Some(n) => *n |= 1 << g.idx,
|
|
None => _ = loaded.put(hash, 1 << g.idx),
|
|
}
|
|
tasks[g.idx as usize].push(f.clone());
|
|
}
|
|
}
|
|
|
|
drop(loaded);
|
|
for (i, tasks) in tasks.into_iter().enumerate() {
|
|
if !tasks.is_empty() {
|
|
self.scheduler.fetch_paged(&YAZI.plugin.fetchers[i], tasks);
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn preload_paged(&self, paged: &[File], mimetype: &Mimetype) {
|
|
let mut loaded = self.scheduler.prework.loaded.lock();
|
|
for f in paged {
|
|
let hash = f.hash_u64();
|
|
for p in YAZI.plugin.preloaders(&f.url, mimetype.by_file(f).unwrap_or_default()) {
|
|
match loaded.get_mut(&hash) {
|
|
Some(n) if *n & (1 << p.idx) != 0 => continue,
|
|
Some(n) => *n |= 1 << p.idx,
|
|
None => _ = loaded.put(hash, 1 << p.idx),
|
|
}
|
|
self.scheduler.preload_paged(p, f);
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn prework_sorted(&self, targets: &Files) {
|
|
if targets.sorter().by != SortBy::Size {
|
|
return;
|
|
}
|
|
|
|
let targets: Vec<_> = {
|
|
let loading = self.scheduler.prework.sizing.read();
|
|
targets
|
|
.iter()
|
|
.filter(|f| f.is_dir() && !targets.sizes.contains_key(f.urn()) && !loading.contains(&f.url))
|
|
.map(|f| &f.url)
|
|
.collect()
|
|
};
|
|
if targets.is_empty() {
|
|
return;
|
|
}
|
|
|
|
let mut loading = self.scheduler.prework.sizing.write();
|
|
for &target in &targets {
|
|
loading.insert(target.clone());
|
|
}
|
|
|
|
self.scheduler.prework_size(targets);
|
|
}
|
|
}
|