Files
ncspot/src/ui/album.rs
Henrik Friedrichsen 32cb6e70d3 Show tracks + duration of album, playlist, queue
Stats are in the top right

Fixes #475
2021-04-08 22:26:19 +02:00

84 lines
2.2 KiB
Rust

use std::sync::{Arc, RwLock};
use cursive::view::ViewWrapper;
use cursive::Cursive;
use crate::album::Album;
use crate::artist::Artist;
use crate::command::Command;
use crate::commands::CommandResult;
use crate::library::Library;
use crate::queue::Queue;
use crate::traits::ViewExt;
use crate::ui::listview::ListView;
use crate::ui::tabview::TabView;
pub struct AlbumView {
album: Album,
tabs: TabView,
}
impl AlbumView {
pub fn new(queue: Arc<Queue>, library: Arc<Library>, album: &Album) -> Self {
let mut album = album.clone();
album.load_all_tracks(queue.get_spotify());
let tracks = if let Some(t) = album.tracks.as_ref() {
t.clone()
} else {
Vec::new()
};
let artists = album
.artist_ids
.iter()
.zip(album.artists.iter())
.map(|(id, name)| Artist::new(id.clone(), name.clone()))
.collect();
let tabs = TabView::new()
.tab(
"tracks",
"Tracks",
ListView::new(
Arc::new(RwLock::new(tracks)),
queue.clone(),
library.clone(),
),
)
.tab(
"artists",
"Artists",
ListView::new(Arc::new(RwLock::new(artists)), queue, library),
);
Self { album, tabs }
}
}
impl ViewWrapper for AlbumView {
wrap_impl!(self.tabs: TabView);
}
impl ViewExt for AlbumView {
fn title(&self) -> String {
format!("{} ({})", self.album.title, self.album.year)
}
fn title_sub(&self) -> String {
if let Some(tracks) = &self.album.tracks {
let duration_secs: u64 = tracks.iter().map(|t| t.duration as u64 / 1000).sum();
let duration = std::time::Duration::from_secs(duration_secs);
let duration_str = crate::utils::format_duration(&duration);
format!("{} tracks, {}", tracks.len(), duration_str)
} else {
"".to_string()
}
}
fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result<CommandResult, String> {
self.tabs.on_command(s, cmd)
}
}