fix: precache n-1 and n+1 pages (#349)

This commit is contained in:
Hanaasagi 2023-11-08 20:44:31 +08:00 committed by GitHub
parent 7c49d9c57a
commit a0ba853718
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 12 deletions

View file

@ -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]
}

View file

@ -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) {