diff --git a/src/app.rs b/src/app.rs index c53a940f..d2851b58 100644 --- a/src/app.rs +++ b/src/app.rs @@ -218,6 +218,7 @@ pub struct App { pub liked_song_ids_set: HashSet, pub large_search_limit: u32, pub library: Library, + pub playlist_offset: u32, pub playback_params: PlaybackParams, pub playlist_tracks: Vec, pub playlists: Option>, @@ -269,6 +270,7 @@ impl App { input: vec![], input_idx: 0, input_cursor_position: 0, + playlist_offset: 0, playlist_tracks: vec![], playlists: None, search_results: SearchResult { @@ -584,13 +586,15 @@ impl App { &playlist_id, None, Some(self.large_search_limit), - None, + Some(self.playlist_offset), None, ) { self.set_playlist_tracks_to_table(&playlist_tracks); self.playlist_tracks = playlist_tracks.items; - self.push_navigation_stack(RouteId::TrackTable, ActiveBlock::TrackTable); + if self.get_current_route().id != RouteId::TrackTable { + self.push_navigation_stack(RouteId::TrackTable, ActiveBlock::TrackTable); + }; }; } None => {} diff --git a/src/handlers/playlist.rs b/src/handlers/playlist.rs index 44ff0aba..26b71b4f 100644 --- a/src/handlers/playlist.rs +++ b/src/handlers/playlist.rs @@ -36,6 +36,7 @@ pub fn handler(key: Key, app: &mut App) { (&app.playlists, &app.selected_playlist_index) { app.track_table.context = Some(TrackTableContext::MyPlaylists); + app.playlist_offset = 0; if let Some(selected_playlist) = playlists.items.get(selected_playlist_index.to_owned()) { diff --git a/src/handlers/track_table.rs b/src/handlers/track_table.rs index 31d1eac7..7acff216 100644 --- a/src/handlers/track_table.rs +++ b/src/handlers/track_table.rs @@ -45,7 +45,7 @@ pub fn handler(key: Key, app: &mut App) { app.start_playback( context_uri, None, - Some(app.track_table.selected_index), + Some(app.track_table.selected_index + app.playlist_offset as usize), ); }; } @@ -105,7 +105,19 @@ pub fn handler(key: Key, app: &mut App) { Key::Ctrl('d') => { match &app.track_table.context { Some(context) => match context { - TrackTableContext::MyPlaylists => {} + TrackTableContext::MyPlaylists => { + if let (Some(playlists), Some(selected_playlist_index)) = + (&app.playlists, &app.selected_playlist_index) + { + if let Some(selected_playlist) = + playlists.items.get(selected_playlist_index.to_owned()) + { + app.playlist_offset += app.large_search_limit; + let playlist_id = selected_playlist.id.to_owned(); + app.get_playlist_tracks(playlist_id); + } + }; + } TrackTableContext::SavedTracks => { app.get_current_user_saved_tracks_next(); } @@ -119,7 +131,21 @@ pub fn handler(key: Key, app: &mut App) { Key::Ctrl('u') => { match &app.track_table.context { Some(context) => match context { - TrackTableContext::MyPlaylists => {} + TrackTableContext::MyPlaylists => { + if let (Some(playlists), Some(selected_playlist_index)) = + (&app.playlists, &app.selected_playlist_index) + { + if app.playlist_offset >= app.large_search_limit { + app.playlist_offset -= app.large_search_limit; + }; + if let Some(selected_playlist) = + playlists.items.get(selected_playlist_index.to_owned()) + { + let playlist_id = selected_playlist.id.to_owned(); + app.get_playlist_tracks(playlist_id); + } + }; + } TrackTableContext::SavedTracks => { app.get_current_user_saved_tracks_previous(); }