diff --git a/src/ui/listview.rs b/src/ui/listview.rs index c3ce13c..c4da511 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -27,72 +27,9 @@ use crate::traits::{IntoBoxedViewExt, ListItem, ViewExt}; use crate::ui::album::AlbumView; use crate::ui::artist::ArtistView; use crate::ui::contextmenu::ContextMenu; +use crate::ui::pagination::Pagination; use crate::{album::Album, spotify::URIType, spotify_url::SpotifyURL}; -pub type Paginator = Box>>) + Send + Sync>; - -pub struct Pagination { - max_content: Arc>>, - callback: Arc>>>, - busy: Arc>, -} - -impl Default for Pagination { - fn default() -> Self { - Pagination { - max_content: Arc::new(RwLock::new(None)), - callback: Arc::new(RwLock::new(None)), - busy: Arc::new(RwLock::new(false)), - } - } -} - -// TODO: figure out why deriving Clone doesn't work -impl Clone for Pagination { - fn clone(&self) -> Self { - Pagination { - max_content: self.max_content.clone(), - callback: self.callback.clone(), - busy: self.busy.clone(), - } - } -} - -impl Pagination { - pub fn clear(&mut self) { - *self.max_content.write().unwrap() = None; - *self.callback.write().unwrap() = None; - } - pub fn set(&mut self, max_content: usize, callback: Paginator) { - *self.max_content.write().unwrap() = Some(max_content); - *self.callback.write().unwrap() = Some(callback); - } - - fn max_content(&self) -> Option { - *self.max_content.read().unwrap() - } - - fn is_busy(&self) -> bool { - *self.busy.read().unwrap() - } - - fn call(&self, content: &Arc>>) { - let pagination = self.clone(); - let content = content.clone(); - if !self.is_busy() { - *self.busy.write().unwrap() = true; - std::thread::spawn(move || { - let cb = pagination.callback.read().unwrap(); - if let Some(ref cb) = *cb { - debug!("calling paginator!"); - cb(content); - *pagination.busy.write().unwrap() = false; - } - }); - } - } -} - pub struct ListView { content: Arc>>, last_content_len: usize, diff --git a/src/ui/mod.rs b/src/ui/mod.rs index e4f7dd9..d531f86 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -6,6 +6,7 @@ pub mod layout; pub mod library; pub mod listview; pub mod modal; +pub mod pagination; pub mod playlist; pub mod playlists; pub mod queue; diff --git a/src/ui/pagination.rs b/src/ui/pagination.rs new file mode 100644 index 0000000..03576e0 --- /dev/null +++ b/src/ui/pagination.rs @@ -0,0 +1,67 @@ +use std::sync::{Arc, RwLock}; + +use crate::traits::ListItem; + +pub type Paginator = Box>>) + Send + Sync>; + +pub struct Pagination { + max_content: Arc>>, + callback: Arc>>>, + busy: Arc>, +} + +impl Default for Pagination { + fn default() -> Self { + Pagination { + max_content: Arc::new(RwLock::new(None)), + callback: Arc::new(RwLock::new(None)), + busy: Arc::new(RwLock::new(false)), + } + } +} + +// TODO: figure out why deriving Clone doesn't work +impl Clone for Pagination { + fn clone(&self) -> Self { + Pagination { + max_content: self.max_content.clone(), + callback: self.callback.clone(), + busy: self.busy.clone(), + } + } +} + +impl Pagination { + pub fn clear(&mut self) { + *self.max_content.write().unwrap() = None; + *self.callback.write().unwrap() = None; + } + pub fn set(&mut self, max_content: usize, callback: Paginator) { + *self.max_content.write().unwrap() = Some(max_content); + *self.callback.write().unwrap() = Some(callback); + } + + pub fn max_content(&self) -> Option { + *self.max_content.read().unwrap() + } + + fn is_busy(&self) -> bool { + *self.busy.read().unwrap() + } + + pub fn call(&self, content: &Arc>>) { + let pagination = self.clone(); + let content = content.clone(); + if !self.is_busy() { + *self.busy.write().unwrap() = true; + std::thread::spawn(move || { + let cb = pagination.callback.read().unwrap(); + if let Some(ref cb) = *cb { + debug!("calling paginator!"); + cb(content); + *pagination.busy.write().unwrap() = false; + } + }); + } + } +} diff --git a/src/ui/search.rs b/src/ui/search.rs index 69030f8..57e2427 100644 --- a/src/ui/search.rs +++ b/src/ui/search.rs @@ -23,7 +23,8 @@ use crate::spotify::{Spotify, URIType}; use crate::track::Track; use crate::traits::{ListItem, ViewExt}; use crate::ui::layout::Layout; -use crate::ui::listview::{ListView, Pagination}; +use crate::ui::listview::ListView; +use crate::ui::pagination::Pagination; use crate::ui::search_results::SearchResultsView; use crate::ui::tabview::TabView; use rspotify::model::search::SearchResult; diff --git a/src/ui/search_results.rs b/src/ui/search_results.rs index 3c99cb4..4b2e1a6 100644 --- a/src/ui/search_results.rs +++ b/src/ui/search_results.rs @@ -12,7 +12,8 @@ use crate::spotify::{Spotify, URIType}; use crate::spotify_url::SpotifyURL; use crate::track::Track; use crate::traits::{ListItem, ViewExt}; -use crate::ui::listview::{ListView, Pagination}; +use crate::ui::listview::ListView; +use crate::ui::pagination::Pagination; use crate::ui::tabview::TabView; use cursive::view::ViewWrapper; use cursive::Cursive;