fix: unable to scroll back after scrolling beyond the maximum boundary

This commit is contained in:
sxyazi 2023-09-09 01:25:38 +08:00
parent 3544578a12
commit c40058ebfa
No known key found for this signature in database
7 changed files with 34 additions and 25 deletions

16
Cargo.lock generated
View file

@ -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",

View file

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

View file

@ -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(),

View file

@ -27,7 +27,7 @@ pub enum Event {
Pages(usize),
Mimetype(BTreeMap<Url, String>),
Hover(Option<File>),
Peek(usize, Option<Url>),
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();

View file

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

View file

@ -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<F: FnOnce(&PreviewLock) -> bool>(&mut self, f: F) -> bool {
self.handle.take().map(|h| h.abort());
INCR.fetch_add(1, Ordering::Relaxed);

View file

@ -325,16 +325,16 @@ impl Tab {
false
}
pub fn update_peek(&mut self, step: isize, url: Option<Url>) -> 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) {