From 577e7ebd870fd0193ef8afc779187406faa5d6d5 Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Thu, 8 Apr 2021 17:46:50 +0200 Subject: [PATCH] Unify pagination setup for ApiResult values Also: - Fix duplicate results - Rename `album.load_tracks` to `album.load_all_tracks` --- src/album.rs | 8 ++++---- src/library.rs | 4 ++-- src/ui/album.rs | 2 +- src/ui/artist.rs | 15 ++------------- src/ui/listview.rs | 2 +- src/ui/pagination.rs | 16 ++++++++++++++-- src/ui/show.rs | 13 ++----------- 7 files changed, 26 insertions(+), 34 deletions(-) diff --git a/src/album.rs b/src/album.rs index 51c7ed3..93d70e5 100644 --- a/src/album.rs +++ b/src/album.rs @@ -27,7 +27,7 @@ pub struct Album { } impl Album { - pub fn load_tracks(&mut self, spotify: Spotify) { + pub fn load_all_tracks(&mut self, spotify: Spotify) { if self.tracks.is_some() { return; } @@ -176,7 +176,7 @@ impl ListItem for Album { } fn play(&mut self, queue: Arc) { - self.load_tracks(queue.get_spotify()); + self.load_all_tracks(queue.get_spotify()); if let Some(tracks) = self.tracks.as_ref() { let tracks: Vec = tracks @@ -189,7 +189,7 @@ impl ListItem for Album { } fn play_next(&mut self, queue: Arc) { - self.load_tracks(queue.get_spotify()); + self.load_all_tracks(queue.get_spotify()); if let Some(tracks) = self.tracks.as_ref() { for t in tracks.iter().rev() { @@ -199,7 +199,7 @@ impl ListItem for Album { } fn queue(&mut self, queue: Arc) { - self.load_tracks(queue.get_spotify()); + self.load_all_tracks(queue.get_spotify()); if let Some(tracks) = self.tracks.as_ref() { for t in tracks { diff --git a/src/library.rs b/src/library.rs index 77df4d2..57a7ec1 100644 --- a/src/library.rs +++ b/src/library.rs @@ -618,7 +618,7 @@ impl Library { } } - album.load_tracks(self.spotify.clone()); + album.load_all_tracks(self.spotify.clone()); { let mut store = self.albums.write().unwrap(); @@ -649,7 +649,7 @@ impl Library { } } - album.load_tracks(self.spotify.clone()); + album.load_all_tracks(self.spotify.clone()); { let mut store = self.albums.write().unwrap(); diff --git a/src/ui/album.rs b/src/ui/album.rs index 85bab82..baccb49 100644 --- a/src/ui/album.rs +++ b/src/ui/album.rs @@ -22,7 +22,7 @@ impl AlbumView { pub fn new(queue: Arc, library: Arc, album: &Album) -> Self { let mut album = album.clone(); - album.load_tracks(queue.get_spotify()); + album.load_all_tracks(queue.get_spotify()); let tracks = if let Some(t) = album.tracks.as_ref() { t.clone() diff --git a/src/ui/artist.rs b/src/ui/artist.rs index dd86fe1..1768c51 100644 --- a/src/ui/artist.rs +++ b/src/ui/artist.rs @@ -107,20 +107,9 @@ impl ArtistView { if let Some(artist_id) = &artist.id { let spotify = queue.get_spotify(); let albums_page = spotify.artist_albums(artist_id, Some(album_type)); - let view = ListView::new(albums_page.items.clone(), queue, library.clone()); - let pagination = view.get_pagination().clone(); + let view = ListView::new(albums_page.items.clone(), queue, library); + albums_page.apply_pagination(view.get_pagination()); - pagination.set( - albums_page.total as usize, - Box::new(move |items| { - if let Some(next_page) = albums_page.next() { - let mut w = items.write().unwrap(); - w.extend(next_page); - w.sort_by(|a, b| b.year.cmp(&a.year)); - library.trigger_redraw(); - } - }), - ); view } else { ListView::new(Arc::new(RwLock::new(Vec::new())), queue, library) diff --git a/src/ui/listview.rs b/src/ui/listview.rs index badafab..e1f7a21 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -458,7 +458,7 @@ impl ViewExt for ListView { return Ok(CommandResult::Consumed(None)); } MoveMode::Down if self.selected == last_idx && self.can_paginate() => { - self.pagination.call(&self.content); + self.pagination.call(&self.content, self.library.clone()); } _ => {} } diff --git a/src/ui/pagination.rs b/src/ui/pagination.rs index 12eb000..a5cb93e 100644 --- a/src/ui/pagination.rs +++ b/src/ui/pagination.rs @@ -1,5 +1,6 @@ use std::sync::{Arc, RwLock}; +use crate::library::Library; use crate::traits::ListItem; pub struct ApiPage { @@ -16,7 +17,7 @@ pub struct ApiResult { fetch_page: Arc>, } -impl ApiResult { +impl ApiResult { pub fn new(limit: u32, fetch_page: Arc>) -> ApiResult { let items = Arc::new(RwLock::new(Vec::new())); if let Some(first_page) = fetch_page(0) { @@ -47,6 +48,16 @@ impl ApiResult { (self.offset() + self.limit as u32) >= self.total } + pub fn apply_pagination(self, pagination: &Pagination) { + let total = self.total as usize; + pagination.set( + total, + Box::new(move |_| { + self.next(); + }), + ) + } + pub fn next(&self) -> Option> { let offset = self.offset() + self.limit as u32; debug!("fetching next page at offset {}", offset); @@ -112,7 +123,7 @@ impl Pagination { *self.busy.read().unwrap() } - pub fn call(&self, content: &Arc>>) { + pub fn call(&self, content: &Arc>>, library: Arc) { let pagination = self.clone(); let content = content.clone(); if !self.is_busy() { @@ -123,6 +134,7 @@ impl Pagination { debug!("calling paginator!"); cb(content); *pagination.busy.write().unwrap() = false; + library.trigger_redraw(); } }); } diff --git a/src/ui/show.rs b/src/ui/show.rs index b5938d4..2225e91 100644 --- a/src/ui/show.rs +++ b/src/ui/show.rs @@ -24,17 +24,8 @@ impl ShowView { let list = { let results = spotify.show_episodes(&show.id); - let view = ListView::new(results.items.clone(), queue, library.clone()); - let pagination = view.get_pagination(); - - pagination.set( - results.total as usize, - Box::new(move |_| { - if results.next().is_some() { - library.trigger_redraw(); - } - }), - ); + let view = ListView::new(results.items.clone(), queue, library); + results.apply_pagination(view.get_pagination()); view };