Add support for PgUp and PgDn scrolling #121

Merged
wojtek merged 4 commits from 119---add-support-for-pgup-and-pgdn-scrolling into main 2024-02-05 23:44:30 +01:00
3 changed files with 50 additions and 73 deletions
Showing only changes of commit ecf3b8a4ff - Show all commits

View File

@ -369,7 +369,7 @@ mod tests {
Some(0) Some(0)
); );
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Artist); assert_eq!(app.selection.active, Category::Artist);
assert_eq!(app.selection.artist.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.state.list.selected(), Some(1));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(0));
@ -387,7 +387,7 @@ mod tests {
Some(0) Some(0)
); );
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Album); assert_eq!(app.selection.active, Category::Album);
assert_eq!(app.selection.artist.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.state.list.selected(), Some(1));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(1));
@ -405,7 +405,7 @@ mod tests {
Some(0) Some(0)
); );
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.state.list.selected(), Some(1));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(1));
@ -423,7 +423,7 @@ mod tests {
Some(1) Some(1)
); );
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.state.list.selected(), Some(1));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(1));
@ -432,7 +432,7 @@ mod tests {
Some(0) Some(0)
); );
app.increment_selection(); app.increment_selection(Delta::Line);
app.decrement_category(); app.decrement_category();
assert_eq!(app.selection.active, Category::Album); assert_eq!(app.selection.active, Category::Album);
assert_eq!(app.selection.artist.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.state.list.selected(), Some(1));
@ -442,7 +442,7 @@ mod tests {
Some(1) Some(1)
); );
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Album); assert_eq!(app.selection.active, Category::Album);
assert_eq!(app.selection.artist.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.state.list.selected(), Some(1));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(0));
@ -451,7 +451,7 @@ mod tests {
Some(0) Some(0)
); );
app.increment_selection(); app.increment_selection(Delta::Line);
app.decrement_category(); app.decrement_category();
assert_eq!(app.selection.active, Category::Artist); assert_eq!(app.selection.active, Category::Artist);
assert_eq!(app.selection.artist.state.list.selected(), Some(1)); assert_eq!(app.selection.artist.state.list.selected(), Some(1));
@ -461,7 +461,7 @@ mod tests {
Some(0) Some(0)
); );
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Artist); assert_eq!(app.selection.active, Category::Artist);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(0));
@ -471,9 +471,9 @@ mod tests {
); );
app.increment_category(); app.increment_category();
app.increment_selection(); app.increment_selection(Delta::Line);
app.decrement_category(); app.decrement_category();
app.decrement_selection(); app.decrement_selection(Delta::Line);
app.decrement_category(); app.decrement_category();
assert_eq!(app.selection.active, Category::Artist); assert_eq!(app.selection.active, Category::Artist);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
@ -500,13 +500,13 @@ mod tests {
app.increment_category(); app.increment_category();
app.increment_category(); app.increment_category();
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.track.state.list.selected(), None); assert_eq!(app.selection.artist.album.track.state.list.selected(), None);
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.album.state.list.selected(), Some(0));
@ -528,13 +528,13 @@ mod tests {
app.increment_category(); app.increment_category();
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Album); assert_eq!(app.selection.active, Category::Album);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
assert_eq!(app.selection.artist.album.track.state.list.selected(), None); assert_eq!(app.selection.artist.album.track.state.list.selected(), None);
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Album); assert_eq!(app.selection.active, Category::Album);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
@ -542,13 +542,13 @@ mod tests {
app.increment_category(); app.increment_category();
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
assert_eq!(app.selection.artist.album.track.state.list.selected(), None); assert_eq!(app.selection.artist.album.track.state.list.selected(), None);
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), Some(0)); assert_eq!(app.selection.artist.state.list.selected(), Some(0));
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
@ -565,13 +565,13 @@ mod tests {
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
assert_eq!(app.selection.artist.album.track.state.list.selected(), None); assert_eq!(app.selection.artist.album.track.state.list.selected(), None);
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Artist); assert_eq!(app.selection.active, Category::Artist);
assert_eq!(app.selection.artist.state.list.selected(), None); assert_eq!(app.selection.artist.state.list.selected(), None);
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
assert_eq!(app.selection.artist.album.track.state.list.selected(), None); assert_eq!(app.selection.artist.album.track.state.list.selected(), None);
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Artist); assert_eq!(app.selection.active, Category::Artist);
assert_eq!(app.selection.artist.state.list.selected(), None); assert_eq!(app.selection.artist.state.list.selected(), None);
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
@ -579,13 +579,13 @@ mod tests {
app.increment_category(); app.increment_category();
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Album); assert_eq!(app.selection.active, Category::Album);
assert_eq!(app.selection.artist.state.list.selected(), None); assert_eq!(app.selection.artist.state.list.selected(), None);
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
assert_eq!(app.selection.artist.album.track.state.list.selected(), None); assert_eq!(app.selection.artist.album.track.state.list.selected(), None);
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Album); assert_eq!(app.selection.active, Category::Album);
assert_eq!(app.selection.artist.state.list.selected(), None); assert_eq!(app.selection.artist.state.list.selected(), None);
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
@ -593,13 +593,13 @@ mod tests {
app.increment_category(); app.increment_category();
app.increment_selection(); app.increment_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), None); assert_eq!(app.selection.artist.state.list.selected(), None);
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);
assert_eq!(app.selection.artist.album.track.state.list.selected(), None); assert_eq!(app.selection.artist.album.track.state.list.selected(), None);
app.decrement_selection(); app.decrement_selection(Delta::Line);
assert_eq!(app.selection.active, Category::Track); assert_eq!(app.selection.active, Category::Track);
assert_eq!(app.selection.artist.state.list.selected(), None); assert_eq!(app.selection.artist.state.list.selected(), None);
assert_eq!(app.selection.artist.album.state.list.selected(), None); assert_eq!(app.selection.artist.album.state.list.selected(), None);

View File

@ -452,17 +452,17 @@ mod tests {
let mut sel = TrackSelection::initialise(tracks); let mut sel = TrackSelection::initialise(tracks);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
sel.decrement(tracks); sel.decrement(tracks, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
sel.increment(tracks); sel.increment(tracks, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(1)); assert_eq!(sel.state.list.selected(), Some(1));
sel.decrement(tracks); sel.decrement(tracks, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
for _ in 0..(tracks.len() + 5) { for _ in 0..(tracks.len() + 5) {
sel.increment(tracks); sel.increment(tracks, Delta::Line);
} }
assert_eq!(sel.state.list.selected(), Some(tracks.len() - 1)); assert_eq!(sel.state.list.selected(), Some(tracks.len() - 1));
@ -474,7 +474,7 @@ mod tests {
// Re-initialise out-of-bounds. // Re-initialise out-of-bounds.
let mut expected = sel.clone(); let mut expected = sel.clone();
expected.decrement(tracks); expected.decrement(tracks, Delta::Line);
let active_track = ActiveTrack::get(tracks, &sel); let active_track = ActiveTrack::get(tracks, &sel);
sel.reinitialise(&tracks[..(tracks.len() - 1)], active_track); sel.reinitialise(&tracks[..(tracks.len() - 1)], active_track);
assert_eq!(sel, expected); assert_eq!(sel, expected);
@ -484,13 +484,6 @@ mod tests {
let active_track = ActiveTrack::get(tracks, &sel); let active_track = ActiveTrack::get(tracks, &sel);
sel.reinitialise(&[], active_track); sel.reinitialise(&[], active_track);
assert_eq!(sel, expected); assert_eq!(sel, expected);
// Artifical test case to verify upper limit.
sel.state.list.select(Some(std::usize::MAX));
assert_eq!(sel.state.list.selected(), Some(std::usize::MAX));
sel.increment(&[]);
assert_eq!(sel.state.list.selected(), Some(std::usize::MAX));
} }
#[test] #[test]
@ -505,35 +498,35 @@ mod tests {
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.track.state.list.selected(), Some(0)); assert_eq!(sel.track.state.list.selected(), Some(0));
sel.increment_track(albums); sel.increment_track(albums, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.track.state.list.selected(), Some(1)); assert_eq!(sel.track.state.list.selected(), Some(1));
// Verify that decrement that doesn't change index does not reset track. // Verify that decrement that doesn't change index does not reset track.
sel.decrement(albums); sel.decrement(albums, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.track.state.list.selected(), Some(1)); assert_eq!(sel.track.state.list.selected(), Some(1));
sel.increment(albums); sel.increment(albums, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(1)); assert_eq!(sel.state.list.selected(), Some(1));
assert_eq!(sel.track.state.list.selected(), Some(0)); assert_eq!(sel.track.state.list.selected(), Some(0));
sel.decrement(albums); sel.decrement(albums, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.track.state.list.selected(), Some(0)); assert_eq!(sel.track.state.list.selected(), Some(0));
for _ in 0..(albums.len() + 5) { for _ in 0..(albums.len() + 5) {
sel.increment(albums); sel.increment(albums, Delta::Line);
} }
assert_eq!(sel.state.list.selected(), Some(albums.len() - 1)); assert_eq!(sel.state.list.selected(), Some(albums.len() - 1));
assert_eq!(sel.track.state.list.selected(), Some(0)); assert_eq!(sel.track.state.list.selected(), Some(0));
sel.increment_track(albums); sel.increment_track(albums, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(albums.len() - 1)); assert_eq!(sel.state.list.selected(), Some(albums.len() - 1));
assert_eq!(sel.track.state.list.selected(), Some(1)); assert_eq!(sel.track.state.list.selected(), Some(1));
// Verify that increment that doesn't change index does not reset track. // Verify that increment that doesn't change index does not reset track.
sel.increment(albums); sel.increment(albums, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(albums.len() - 1)); assert_eq!(sel.state.list.selected(), Some(albums.len() - 1));
assert_eq!(sel.track.state.list.selected(), Some(1)); assert_eq!(sel.track.state.list.selected(), Some(1));
@ -545,7 +538,7 @@ mod tests {
// Re-initialise out-of-bounds. // Re-initialise out-of-bounds.
let mut expected = sel.clone(); let mut expected = sel.clone();
expected.decrement(albums); expected.decrement(albums, Delta::Line);
let active_album = ActiveAlbum::get(albums, &sel); let active_album = ActiveAlbum::get(albums, &sel);
sel.reinitialise(&albums[..(albums.len() - 1)], active_album); sel.reinitialise(&albums[..(albums.len() - 1)], active_album);
assert_eq!(sel, expected); assert_eq!(sel, expected);
@ -555,16 +548,6 @@ mod tests {
let active_album = ActiveAlbum::get(albums, &sel); let active_album = ActiveAlbum::get(albums, &sel);
sel.reinitialise(&[], active_album); sel.reinitialise(&[], active_album);
assert_eq!(sel, expected); assert_eq!(sel, expected);
// Artifical test case to verify upper limit.
sel.state.list.select(Some(std::usize::MAX));
sel.track.state.list.select(Some(1));
assert_eq!(sel.state.list.selected(), Some(std::usize::MAX));
assert_eq!(sel.track.state.list.selected(), Some(1));
sel.increment(&[]);
assert_eq!(sel.state.list.selected(), Some(std::usize::MAX));
assert_eq!(sel.track.state.list.selected(), Some(1));
} }
#[test] #[test]
@ -579,35 +562,35 @@ mod tests {
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.album.state.list.selected(), Some(0)); assert_eq!(sel.album.state.list.selected(), Some(0));
sel.increment_album(artists); sel.increment_album(artists, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.album.state.list.selected(), Some(1)); assert_eq!(sel.album.state.list.selected(), Some(1));
// Verify that decrement that doesn't change index does not reset album. // Verify that decrement that doesn't change index does not reset album.
sel.decrement(artists); sel.decrement(artists, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.album.state.list.selected(), Some(1)); assert_eq!(sel.album.state.list.selected(), Some(1));
sel.increment(artists); sel.increment(artists, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(1)); assert_eq!(sel.state.list.selected(), Some(1));
assert_eq!(sel.album.state.list.selected(), Some(0)); assert_eq!(sel.album.state.list.selected(), Some(0));
sel.decrement(artists); sel.decrement(artists, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(0)); assert_eq!(sel.state.list.selected(), Some(0));
assert_eq!(sel.album.state.list.selected(), Some(0)); assert_eq!(sel.album.state.list.selected(), Some(0));
for _ in 0..(artists.len() + 5) { for _ in 0..(artists.len() + 5) {
sel.increment(artists); sel.increment(artists, Delta::Line);
} }
assert_eq!(sel.state.list.selected(), Some(artists.len() - 1)); assert_eq!(sel.state.list.selected(), Some(artists.len() - 1));
assert_eq!(sel.album.state.list.selected(), Some(0)); assert_eq!(sel.album.state.list.selected(), Some(0));
sel.increment_album(artists); sel.increment_album(artists, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(artists.len() - 1)); assert_eq!(sel.state.list.selected(), Some(artists.len() - 1));
assert_eq!(sel.album.state.list.selected(), Some(1)); assert_eq!(sel.album.state.list.selected(), Some(1));
// Verify that increment that doesn't change index does not reset album. // Verify that increment that doesn't change index does not reset album.
sel.increment(artists); sel.increment(artists, Delta::Line);
assert_eq!(sel.state.list.selected(), Some(artists.len() - 1)); assert_eq!(sel.state.list.selected(), Some(artists.len() - 1));
assert_eq!(sel.album.state.list.selected(), Some(1)); assert_eq!(sel.album.state.list.selected(), Some(1));
@ -619,7 +602,7 @@ mod tests {
// Re-initialise out-of-bounds. // Re-initialise out-of-bounds.
let mut expected = sel.clone(); let mut expected = sel.clone();
expected.decrement(artists); expected.decrement(artists, Delta::Line);
let active_artist = ActiveArtist::get(artists, &sel); let active_artist = ActiveArtist::get(artists, &sel);
sel.reinitialise(&artists[..(artists.len() - 1)], active_artist); sel.reinitialise(&artists[..(artists.len() - 1)], active_artist);
assert_eq!(sel, expected); assert_eq!(sel, expected);
@ -629,15 +612,5 @@ mod tests {
let active_artist = ActiveArtist::get(artists, &sel); let active_artist = ActiveArtist::get(artists, &sel);
sel.reinitialise(&[], active_artist); sel.reinitialise(&[], active_artist);
assert_eq!(sel, expected); assert_eq!(sel, expected);
// Artifical test case to verify upper limit.
sel.state.list.select(Some(std::usize::MAX));
sel.album.state.list.select(Some(1));
assert_eq!(sel.state.list.selected(), Some(std::usize::MAX));
assert_eq!(sel.album.state.list.selected(), Some(1));
sel.increment(&[]);
assert_eq!(sel.state.list.selected(), Some(std::usize::MAX));
assert_eq!(sel.album.state.list.selected(), Some(1));
} }
} }

View File

@ -513,7 +513,11 @@ impl IUi for Ui {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::tui::{app::app::AppPublic, testmod::COLLECTION, tests::terminal}; use crate::tui::{
app::{app::AppPublic, selection::Delta},
testmod::COLLECTION,
tests::terminal,
};
use super::*; use super::*;
@ -567,14 +571,14 @@ mod tests {
// Change the track (which has a different track format). // Change the track (which has a different track format).
selection.increment_category(); selection.increment_category();
selection.increment_category(); selection.increment_category();
selection.increment_selection(artists); selection.increment_selection(artists, Delta::Line);
draw_test_suite(artists, &mut selection); draw_test_suite(artists, &mut selection);
// Change the artist (which has a multi-link entry). // Change the artist (which has a multi-link entry).
selection.decrement_category(); selection.decrement_category();
selection.decrement_category(); selection.decrement_category();
selection.increment_selection(artists); selection.increment_selection(artists, Delta::Line);
draw_test_suite(artists, &mut selection); draw_test_suite(artists, &mut selection);
} }