From a0ba8537188cd5c29593b1c53a3569ac7f1a0bd7 Mon Sep 17 00:00:00 2001 From: Hanaasagi Date: Wed, 8 Nov 2023 20:44:31 +0800 Subject: [PATCH] fix: precache n-1 and n+1 pages (#349) --- yazi-core/src/tab/folder.rs | 32 ++++++++++++++++++++++++-------- yazi-fm/src/app.rs | 6 ++---- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/yazi-core/src/tab/folder.rs b/yazi-core/src/tab/folder.rs index 44a356a6..923def05 100644 --- a/yazi-core/src/tab/folder.rs +++ b/yazi-core/src/tab/folder.rs @@ -43,22 +43,38 @@ impl Folder { self.prev(Default::default()); if self.page == old { - emit!(Pages(self.page)); // Force update + self.set_page(true); // Force update } true } - pub fn set_page(&mut self, force: bool) -> bool { + pub fn set_page(&mut self, force: bool) { let limit = MANAGER.layout.folder_height(); - let new = if limit == 0 { 0 } else { self.cursor / limit }; + if limit == 0 { + return; + } + + let new = self.cursor / limit; if !force && self.page == new { - return false; + return; + } + + // Current page + emit!(Pages(new)); + + // Next page + let max_page = (self.files.len() + limit - 1) / limit; + if new < max_page && new + 1 != self.page { + emit!(Pages(new + 1)); + } + + // Previous page + if new > 1 && new - 1 != self.page { + emit!(Pages(new - 1)); } self.page = new; - emit!(Pages(new)); - true } pub fn next(&mut self, step: Step) -> bool { @@ -115,11 +131,11 @@ impl Folder { #[inline] pub fn hovered(&self) -> Option<&File> { self.files.get(self.cursor) } - pub fn paginate(&self) -> &[File] { + pub fn paginate(&self, page: usize) -> &[File] { let len = self.files.len(); let limit = MANAGER.layout.folder_height(); - let start = (self.page * limit).min(len.saturating_sub(1)); + let start = (page * limit).min(len.saturating_sub(1)); let end = (start + limit).min(len); &self.files[start..end] } diff --git a/yazi-fm/src/app.rs b/yazi-fm/src/app.rs index 3a83a297..40f80ae6 100644 --- a/yazi-fm/src/app.rs +++ b/yazi-fm/src/app.rs @@ -143,10 +143,8 @@ impl App { } } Event::Pages(page) => { - if manager.current().page == page { - let targets = self.cx.manager.current().paginate(); - tasks.precache_mime(targets, &self.cx.manager.mimetype); - } + let targets = self.cx.manager.current().paginate(page); + tasks.precache_mime(targets, &self.cx.manager.mimetype); } Event::Mimetype(mimes) => { if manager.update_mimetype(mimes, tasks) {