Files
ncspot/src/ui/artist.rs
2019-05-20 22:15:12 +02:00

118 lines
3.0 KiB
Rust

use std::sync::{Arc, RwLock};
use std::thread;
use cursive::view::ViewWrapper;
use cursive::Cursive;
use artist::Artist;
use command::Command;
use commands::CommandResult;
use library::Library;
use queue::Queue;
use track::Track;
use traits::ViewExt;
use ui::listview::ListView;
use ui::tabview::TabView;
pub struct ArtistView {
artist: Artist,
tabs: TabView,
}
impl ArtistView {
pub fn new(queue: Arc<Queue>, library: Arc<Library>, artist: &Artist) -> Self {
let mut artist = artist.clone();
let spotify = queue.get_spotify();
artist.load_albums(spotify.clone());
let albums = if let Some(a) = artist.albums.as_ref() {
a.clone()
} else {
Vec::new()
};
let top_tracks: Arc<RwLock<Vec<Track>>> = Arc::new(RwLock::new(Vec::new()));
{
let top_tracks = top_tracks.clone();
let spotify = spotify.clone();
let id = artist.id.clone();
thread::spawn(move || {
if let Some(id) = id {
if let Some(tracks) = spotify.artist_top_tracks(id) {
top_tracks.write().unwrap().extend(tracks);
}
}
});
}
let related: Arc<RwLock<Vec<Artist>>> = Arc::new(RwLock::new(Vec::new()));
{
let related = related.clone();
let spotify = spotify.clone();
let id = artist.id.clone();
thread::spawn(move || {
if let Some(id) = id {
if let Some(artists) = spotify.artist_related_artists(id) {
related.write().unwrap().extend(artists);
}
}
});
}
let mut tabs = TabView::new();
if let Some(tracks) = artist.tracks.as_ref() {
let tracks = tracks.clone();
tabs.add_tab(
"tracks",
"Saved Tracks",
ListView::new(
Arc::new(RwLock::new(tracks)),
queue.clone(),
library.clone(),
),
);
}
tabs.add_tab(
"top_tracks",
"Top 10",
ListView::new(top_tracks.clone(), queue.clone(), library.clone()),
);
tabs.add_tab(
"albums",
"Albums",
ListView::new(
Arc::new(RwLock::new(albums)),
queue.clone(),
library.clone(),
),
);
tabs.add_tab(
"related",
"Related Artists",
ListView::new(related.clone(), queue.clone(), library.clone()),
);
Self { artist, tabs }
}
}
impl ViewWrapper for ArtistView {
wrap_impl!(self.tabs: TabView);
}
impl ViewExt for ArtistView {
fn title(&self) -> String {
self.artist.name.clone()
}
fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result<CommandResult, String> {
self.tabs.on_command(s, cmd)
}
}