From 6d3965152e91639babaedb1e8a00953a9b01b05f Mon Sep 17 00:00:00 2001 From: Alexandre Pasmantier <47638216+alexpasmantier@users.noreply.github.com> Date: Sun, 24 Nov 2024 16:54:35 +0100 Subject: [PATCH] feat(navigation): add action to scroll results list by a page (#72) --- .config/config.toml | 6 ++ Cargo.lock | 122 +++++++++++++++++++------------- crates/television/action.rs | 6 ++ crates/television/picker.rs | 52 +++++++++----- crates/television/television.rs | 18 +++-- 5 files changed, 132 insertions(+), 72 deletions(-) diff --git a/.config/config.toml b/.config/config.toml index 1479538..8b58926 100644 --- a/.config/config.toml +++ b/.config/config.toml @@ -45,6 +45,8 @@ quit = "esc" # Scrolling through entries select_next_entry = "down" select_prev_entry = "up" +select_next_page = "pagedown" +select_prev_page = "pageup" # Scrolling the preview pane scroll_preview_half_page_down = "ctrl-d" scroll_preview_half_page_up = "ctrl-u" @@ -68,6 +70,8 @@ quit = "esc" # Scrolling through entries select_next_entry = "down" select_prev_entry = "up" +select_next_page = "pagedown" +select_prev_page = "pageup" # Select an entry select_entry = "enter" # Toggle the remote control mode @@ -84,6 +88,8 @@ quit = "esc" # Scrolling through entries select_next_entry = "down" select_prev_entry = "up" +select_next_page = "pagedown" +select_prev_page = "pageup" # Select an entry select_entry = "enter" # Toggle the send to channel mode diff --git a/Cargo.lock b/Cargo.lock index 0fe09f6..280ac95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,7 +194,7 @@ dependencies = [ "serde", "serde_yaml", "syntect", - "thiserror", + "thiserror 1.0.69", "unicode-width 0.1.14", ] @@ -287,7 +287,7 @@ dependencies = [ "polling", "rustix", "slab", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -331,7 +331,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -893,7 +893,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", "winapi", ] @@ -1025,7 +1025,7 @@ dependencies = [ "parking_lot", "signal-hook", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1038,26 +1038,26 @@ dependencies = [ "gix-date", "gix-utils", "itoa", - "thiserror", + "thiserror 1.0.69", "winnow", ] [[package]] name = "gix-bitmap" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f78312288bd02052be5dbc2ecbc342c9f4eb791986d86c0a5c06b92dc72efa" +checksum = "d48b897b4bbc881aea994b4a5bbb340a04979d7be9089791304e04a9fbc66b53" dependencies = [ - "thiserror", + "thiserror 2.0.3", ] [[package]] name = "gix-chunk" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28b58ba04f0c004722344390af9dbc85888fbb84be1981afb934da4114d4cf" +checksum = "c6ffbeb3a5c0b8b84c3fe4133a6f8c82fa962f4caefe8d0762eced025d3eb4f7" dependencies = [ - "thiserror", + "thiserror 2.0.3", ] [[package]] @@ -1071,7 +1071,7 @@ dependencies = [ "gix-features", "gix-hash", "memmap2", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1090,34 +1090,34 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", "unicode-bom", "winnow", ] [[package]] name = "gix-config-value" -version = "0.14.9" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3de3fdca9c75fa4b83a76583d265fa49b1de6b088ebcd210749c24ceeb74660" +checksum = "49aaeef5d98390a3bcf9dbc6440b520b793d1bf3ed99317dc407b02be995b28e" dependencies = [ "bitflags 2.6.0", "bstr", "gix-path", "libc", - "thiserror", + "thiserror 2.0.3", ] [[package]] name = "gix-date" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d10d543ac13c97292a15e8e8b7889cd006faf739777437ed95362504b8fe81a0" +checksum = "691142b1a34d18e8ed6e6114bc1a2736516c5ad60ef3aa9bd1b694886e3ca92d" dependencies = [ "bstr", "itoa", "jiff", - "thiserror", + "thiserror 2.0.3", ] [[package]] @@ -1129,7 +1129,7 @@ dependencies = [ "bstr", "gix-hash", "gix-object", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1145,7 +1145,7 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1163,7 +1163,7 @@ dependencies = [ "once_cell", "prodash", "sha1_smol", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -1197,7 +1197,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e" dependencies = [ "faster-hex", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1236,7 +1236,7 @@ dependencies = [ "memmap2", "rustix", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1247,7 +1247,7 @@ checksum = "e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d" dependencies = [ "gix-tempfile", "gix-utils", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1265,7 +1265,7 @@ dependencies = [ "gix-validate", "itoa", "smallvec", - "thiserror", + "thiserror 1.0.69", "winnow", ] @@ -1286,7 +1286,7 @@ dependencies = [ "gix-quote", "parking_lot", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1304,31 +1304,31 @@ dependencies = [ "gix-path", "memmap2", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "gix-path" -version = "0.10.12" +version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c04e5a94fdb56b1e91eb7df2658ad16832428b8eeda24ff1a0f0288de2bce554" +checksum = "afc292ef1a51e340aeb0e720800338c805975724c1dfbd243185452efd8645b7" dependencies = [ "bstr", "gix-trace", "home", "once_cell", - "thiserror", + "thiserror 2.0.3", ] [[package]] name = "gix-quote" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89f9a1525dcfd9639e282ea939f5ab0d09d93cf2b90c1fc6104f1b9582a8e49" +checksum = "64a1e282216ec2ab2816cd57e6ed88f8009e634aec47562883c05ac8a7009a63" dependencies = [ "bstr", "gix-utils", - "thiserror", + "thiserror 2.0.3", ] [[package]] @@ -1348,7 +1348,7 @@ dependencies = [ "gix-utils", "gix-validate", "memmap2", - "thiserror", + "thiserror 1.0.69", "winnow", ] @@ -1363,7 +1363,7 @@ dependencies = [ "gix-revision", "gix-validate", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1379,7 +1379,7 @@ dependencies = [ "gix-object", "gix-revwalk", "gix-trace", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1394,14 +1394,14 @@ dependencies = [ "gix-hashtable", "gix-object", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "gix-sec" -version = "0.10.9" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2007538eda296445c07949cf04f4a767307d887184d6b3e83e2d636533ddc6e" +checksum = "a8b876ef997a955397809a2ec398d6a45b7a55b4918f2446344330f778d14fd6" dependencies = [ "bitflags 2.6.0", "gix-path", @@ -1444,7 +1444,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1457,7 +1457,7 @@ dependencies = [ "gix-features", "gix-path", "home", - "thiserror", + "thiserror 1.0.69", "url", ] @@ -1473,12 +1473,12 @@ dependencies = [ [[package]] name = "gix-validate" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e187b263461bc36cea17650141567753bc6207d036cedd1de6e81a52f277ff68" +checksum = "cd520d09f9f585b34b32aba1d0b36ada89ab7fefb54a8ca3fe37fc482a750937" dependencies = [ "bstr", - "thiserror", + "thiserror 2.0.3", ] [[package]] @@ -2200,7 +2200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.69", "ucd-trie", ] @@ -2395,7 +2395,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2688,7 +2688,7 @@ dependencies = [ "log", "memmap2", "rustix", - "thiserror", + "thiserror 1.0.69", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -2805,7 +2805,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "thiserror", + "thiserror 1.0.69", "walkdir", "yaml-rust", ] @@ -2932,7 +2932,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", ] [[package]] @@ -2946,6 +2955,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" version = "1.1.8" diff --git a/crates/television/action.rs b/crates/television/action.rs index 43d68ba..b0e9ee5 100644 --- a/crates/television/action.rs +++ b/crates/television/action.rs @@ -52,6 +52,12 @@ pub enum Action { /// Select the previous entry in the currently focused list. #[serde(alias = "select_prev_entry")] SelectPrevEntry, + /// Select the next page of entries in the currently focused list. + #[serde(alias = "select_next_page")] + SelectNextPage, + /// Select the previous page of entries in the currently focused list. + #[serde(alias = "select_prev_page")] + SelectPrevPage, /// Copy the currently selected entry to the clipboard. #[serde(alias = "copy_entry_to_clipboard")] CopyEntryToClipboard, diff --git a/crates/television/picker.rs b/crates/television/picker.rs index 13272db..64c2555 100644 --- a/crates/television/picker.rs +++ b/crates/television/picker.rs @@ -62,19 +62,37 @@ impl Picker { self.relative_state.select(index); } - pub(crate) fn select_next(&mut self, total_items: usize, height: usize) { + pub(crate) fn select_next( + &mut self, + step: u32, + total_items: usize, + height: usize, + ) { if self.inverted { - self._select_prev(total_items, height); + for _ in 0..step { + self._select_prev(total_items, height); + } } else { - self._select_next(total_items, height); + for _ in 0..step { + self._select_next(total_items, height); + } } } - pub(crate) fn select_prev(&mut self, total_items: usize, height: usize) { + pub(crate) fn select_prev( + &mut self, + step: u32, + total_items: usize, + height: usize, + ) { if self.inverted { - self._select_next(total_items, height); + for _ in 0..step { + self._select_next(total_items, height); + } } else { - self._select_prev(total_items, height); + for _ in 0..step { + self._select_prev(total_items, height); + } } } @@ -112,7 +130,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(0)); picker.relative_select(Some(0)); - picker.select_next(4, 2); + picker.select_next(1, 4, 2); assert_eq!(picker.selected(), Some(1), "selected"); assert_eq!(picker.relative_selected(), Some(1), "relative_selected"); } @@ -126,7 +144,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(1)); picker.relative_select(Some(1)); - picker.select_next(4, 2); + picker.select_next(1, 4, 2); assert_eq!(picker.selected(), Some(2), "selected"); assert_eq!(picker.relative_selected(), Some(2), "relative_selected"); } @@ -140,7 +158,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(2)); picker.relative_select(Some(2)); - picker.select_next(4, 2); + picker.select_next(1, 4, 2); assert_eq!(picker.selected(), Some(3), "selected"); assert_eq!(picker.relative_selected(), Some(2), "relative_selected"); } @@ -154,7 +172,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(3)); picker.relative_select(Some(2)); - picker.select_next(4, 2); + picker.select_next(1, 4, 2); assert_eq!(picker.selected(), Some(0), "selected"); assert_eq!(picker.relative_selected(), Some(0), "relative_selected"); } @@ -168,7 +186,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(2)); picker.relative_select(Some(2)); - picker.select_next(3, 2); + picker.select_next(1, 3, 2); assert_eq!(picker.selected(), Some(0), "selected"); assert_eq!(picker.relative_selected(), Some(0), "relative_selected"); } @@ -182,7 +200,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(1)); picker.relative_select(Some(1)); - picker.select_prev(4, 2); + picker.select_prev(1, 4, 2); assert_eq!(picker.selected(), Some(0), "selected"); assert_eq!(picker.relative_selected(), Some(0), "relative_selected"); } @@ -196,7 +214,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(0)); picker.relative_select(Some(0)); - picker.select_prev(4, 2); + picker.select_prev(1, 4, 2); assert_eq!(picker.selected(), Some(3), "selected"); assert_eq!(picker.relative_selected(), Some(2), "relative_selected"); } @@ -210,7 +228,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(3)); picker.relative_select(Some(2)); - picker.select_prev(4, 2); + picker.select_prev(1, 4, 2); assert_eq!(picker.selected(), Some(2), "selected"); assert_eq!(picker.relative_selected(), Some(1), "relative_selected"); } @@ -224,7 +242,7 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(2)); picker.relative_select(Some(2)); - picker.select_prev(4, 2); + picker.select_prev(1, 4, 2); assert_eq!(picker.selected(), Some(1), "selected"); assert_eq!(picker.relative_selected(), Some(1), "relative_selected"); } @@ -256,9 +274,9 @@ mod tests { let mut picker = Picker::default(); picker.select(Some(0)); picker.relative_select(Some(0)); - picker.select_next(4, 2); + picker.select_next(1, 4, 2); picker = picker.inverted(); - picker.select_next(4, 2); + picker.select_next(1, 4, 2); assert!(picker.inverted, "inverted"); assert_eq!(picker.selected(), Some(0), "selected"); assert_eq!(picker.relative_selected(), Some(0), "relative_selected"); diff --git a/crates/television/television.rs b/crates/television/television.rs index 8a2ee1e..67f7379 100644 --- a/crates/television/television.rs +++ b/crates/television/television.rs @@ -118,7 +118,7 @@ impl Television { } } - pub fn select_prev_entry(&mut self) { + pub fn select_prev_entry(&mut self, step: u32) { let (result_count, picker) = match self.mode { Mode::Channel => { (self.channel.result_count(), &mut self.results_picker) @@ -131,12 +131,13 @@ impl Television { return; } picker.select_prev( + step, result_count as usize, self.results_area_height as usize, ); } - pub fn select_next_entry(&mut self) { + pub fn select_next_entry(&mut self, step: u32) { let (result_count, picker) = match self.mode { Mode::Channel => { (self.channel.result_count(), &mut self.results_picker) @@ -149,6 +150,7 @@ impl Television { return; } picker.select_next( + step, result_count as usize, self.results_area_height as usize, ); @@ -277,11 +279,19 @@ impl Television { } Action::SelectNextEntry => { self.reset_preview_scroll(); - self.select_next_entry(); + self.select_next_entry(1); } Action::SelectPrevEntry => { self.reset_preview_scroll(); - self.select_prev_entry(); + self.select_prev_entry(1); + } + Action::SelectNextPage => { + self.reset_preview_scroll(); + self.select_next_entry(self.results_area_height); + } + Action::SelectPrevPage => { + self.reset_preview_scroll(); + self.select_prev_entry(self.results_area_height); } Action::ScrollPreviewDown => self.scroll_preview_down(1), Action::ScrollPreviewUp => self.scroll_preview_up(1),