From c40058ebfa1cddfb59d1a23439d940b765752110 Mon Sep 17 00:00:00 2001 From: sxyazi Date: Sat, 9 Sep 2023 01:25:38 +0800 Subject: [PATCH] fix: unable to scroll back after scrolling beyond the maximum boundary --- Cargo.lock | 16 ++++++++-------- app/src/app.rs | 11 +++++++---- app/src/executor.rs | 2 +- core/src/event.rs | 6 +++--- core/src/manager/manager.rs | 5 ----- core/src/manager/preview/preview.rs | 10 +++++++++- core/src/manager/tab.rs | 9 ++++++--- 7 files changed, 34 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4bbdb672..79fe8430 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -237,9 +237,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cassowary" @@ -264,9 +264,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d9d13be47a5b7c3907137f1290b0459a7f80efb26be8c52afb11963bccb02" +checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1880,9 +1880,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "de0a3ab2091e52d7299a39d098e200114a972df0a7724add02a273aa9aada592" dependencies = [ "indexmap 2.0.0", "serde", @@ -1902,9 +1902,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.0.0", "serde", diff --git a/app/src/app.rs b/app/src/app.rs index 3a399f87..d513509d 100644 --- a/app/src/app.rs +++ b/app/src/app.rs @@ -160,10 +160,13 @@ impl App { } emit!(Peek); } - Event::Peek(skip, sequent) => { - let b = sequent.is_some(); - manager.active_mut().update_peek(skip as isize, sequent); - self.cx.manager.peek(b, self.cx.image_layer()); + Event::Peek(sequent) => { + if let Some((max, url)) = sequent { + manager.active_mut().update_peek(max, url); + self.cx.manager.peek(true, self.cx.image_layer()); + } else { + self.cx.manager.peek(false, self.cx.image_layer()); + } } Event::Preview(lock) => { if manager.active_mut().update_preview(lock) { diff --git a/app/src/executor.rs b/app/src/executor.rs index 1897bf4f..a7399b9f 100644 --- a/app/src/executor.rs +++ b/app/src/executor.rs @@ -66,7 +66,7 @@ impl Executor { } "peek" => { let step = exec.args.get(0).and_then(|s| s.parse().ok()).unwrap_or(0); - cx.manager.active_mut().update_peek(step, None); + cx.manager.active_mut().preview_arrow(step); cx.manager.peek(true, cx.image_layer()) } "leave" => cx.manager.active_mut().leave(), diff --git a/core/src/event.rs b/core/src/event.rs index 762d6e46..1b7236c7 100644 --- a/core/src/event.rs +++ b/core/src/event.rs @@ -27,7 +27,7 @@ pub enum Event { Pages(usize), Mimetype(BTreeMap), Hover(Option), - Peek(usize, Option), + Peek(Option<(usize, Url)>), Preview(PreviewLock), // Input @@ -90,10 +90,10 @@ macro_rules! emit { $crate::Event::Hover(Some($file)).emit(); }; (Peek) => { - $crate::Event::Peek(0, None).emit(); + $crate::Event::Peek(None).emit(); }; (Peek($skip:expr, $url:expr)) => { - $crate::Event::Peek($skip, Some($url)).emit(); + $crate::Event::Peek(Some(($skip, $url))).emit(); }; (Preview($lock:expr)) => { $crate::Event::Preview($lock).emit(); diff --git a/core/src/manager/manager.rs b/core/src/manager/manager.rs index 7159a3ff..2e83fc52 100644 --- a/core/src/manager/manager.rs +++ b/core/src/manager/manager.rs @@ -71,11 +71,6 @@ impl Manager { } let Some(mime) = self.mimetype.get(url).cloned() else { - tokio::spawn(async move { - if let Ok(mimes) = external::file(&[hovered.url()]).await { - emit!(Mimetype(mimes)); - } - }); return false; }; diff --git a/core/src/manager/preview/preview.rs b/core/src/manager/preview/preview.rs index d7353f78..7f0bc4bc 100644 --- a/core/src/manager/preview/preview.rs +++ b/core/src/manager/preview/preview.rs @@ -129,7 +129,6 @@ impl Preview { })); } - #[inline] pub fn arrow(&mut self, step: isize) -> bool { let Some(kind) = self.lock.as_ref().map(|l| MimeKind::new(&l.mime)) else { return false; @@ -142,6 +141,15 @@ impl Preview { self.skip != old } + pub fn arrow_max(&mut self, max: usize) -> bool { + if self.skip > max { + self.skip = max; + return true; + } + + false + } + pub fn reset bool>(&mut self, f: F) -> bool { self.handle.take().map(|h| h.abort()); INCR.fetch_add(1, Ordering::Relaxed); diff --git a/core/src/manager/tab.rs b/core/src/manager/tab.rs index 162f0101..facd9d65 100644 --- a/core/src/manager/tab.rs +++ b/core/src/manager/tab.rs @@ -325,16 +325,16 @@ impl Tab { false } - pub fn update_peek(&mut self, step: isize, url: Option) -> bool { + pub fn update_peek(&mut self, max: usize, url: Url) -> bool { let Some(ref hovered) = self.current.hovered else { return false; }; - if url.as_ref().map(|p| p != hovered.url()) == Some(true) { + if &url != hovered.url() { return false; } - self.preview.arrow(step) + self.preview.arrow_max(max) } pub fn update_preview(&mut self, lock: PreviewLock) -> bool { @@ -404,6 +404,9 @@ impl Tab { #[inline] pub fn preview_reset_image(&mut self) -> bool { self.preview.reset(|l| l.is_image()) } + #[inline] + pub fn preview_arrow(&mut self, step: isize) -> bool { self.preview.arrow(step) } + // --- Sorter pub fn set_sorter(&mut self, sorter: FilesSorter) -> bool { if !self.current.files.set_sorter(sorter) {