Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion psst-gui/src/controller/nav.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ impl NavController {
}
}
Nav::ArtistDetail(link) => {
if !data.artist_detail.top_tracks.contains(link) {
if !data.artist_detail.artist.contains(link) {
ctx.submit_command(artist::LOAD_DETAIL.with(link.to_owned()));
}
}
Expand Down
19 changes: 1 addition & 18 deletions psst-gui/src/data/artist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@ use std::sync::Arc;
use druid::{im::Vector, Data, Lens};
use serde::{Deserialize, Serialize};

use crate::data::{Album, Cached, Image, Promise, Track};
use crate::data::{Album, Cached, Image, Promise};

#[derive(Clone, Data, Lens)]
pub struct ArtistDetail {
pub artist: Promise<Artist, ArtistLink>,
pub albums: Promise<ArtistAlbums, ArtistLink>,
pub top_tracks: Promise<ArtistTracks, ArtistLink>,
pub related_artists: Promise<Cached<Vector<Artist>>, ArtistLink>,
pub artist_info: Promise<ArtistInfo, ArtistLink>,
}
Expand Down Expand Up @@ -56,22 +55,6 @@ pub struct ArtistStats {
pub world_rank: i64,
}

#[derive(Clone, Data, Lens)]
pub struct ArtistTracks {
pub id: Arc<str>,
pub name: Arc<str>,
pub tracks: Vector<Arc<Track>>,
}

impl ArtistTracks {
pub fn link(&self) -> ArtistLink {
ArtistLink {
id: self.id.clone(),
name: self.name.clone(),
}
}
}

#[derive(Clone, Debug, Data, Lens, Eq, PartialEq, Hash, Deserialize, Serialize)]
pub struct ArtistLink {
pub id: Arc<str>,
Expand Down
4 changes: 1 addition & 3 deletions psst-gui/src/data/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ use psst_core::{item_id::ItemId, session::SessionService};
pub use crate::data::{
album::{Album, AlbumDetail, AlbumLink, AlbumType},
artist::{
Artist, ArtistAlbums, ArtistDetail, ArtistInfo, ArtistLink, ArtistStats, ArtistTracks,
Artist, ArtistAlbums, ArtistDetail, ArtistInfo, ArtistLink, ArtistStats,
},
config::{AudioQuality, Authentication, Config, Preferences, PreferencesTab, Theme},
ctx::Ctx,
Expand Down Expand Up @@ -153,7 +153,6 @@ impl AppState {
artist_detail: ArtistDetail {
artist: Promise::Empty,
albums: Promise::Empty,
top_tracks: Promise::Empty,
related_artists: Promise::Empty,
artist_info: Promise::Empty,
},
Expand Down Expand Up @@ -209,7 +208,6 @@ impl AppState {
self.artist_detail.albums = Promise::Empty;
self.artist_detail.artist = Promise::Empty;
self.artist_detail.related_artists = Promise::Empty;
self.artist_detail.top_tracks = Promise::Empty;
self.playlist_detail.playlist = Promise::Empty;
self.playlist_detail.tracks = Promise::Empty;
self.show_detail.episodes = Promise::Empty;
Expand Down
6 changes: 1 addition & 5 deletions psst-gui/src/data/playback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ use psst_core::item_id::ItemId;
use serde::{Deserialize, Serialize};

use super::{
AlbumLink, ArtistLink, Episode, Library, Nav, PlaylistLink, RecommendationsRequest, ShowLink,
Track,
AlbumLink, Episode, Library, Nav, PlaylistLink, RecommendationsRequest, ShowLink, Track,
};

#[derive(Clone, Data, Lens)]
Expand Down Expand Up @@ -145,7 +144,6 @@ pub enum PlaybackOrigin {
Home,
Library,
Album(AlbumLink),
Artist(ArtistLink),
Playlist(PlaylistLink),
Show(ShowLink),
Search(Arc<str>),
Expand All @@ -158,7 +156,6 @@ impl PlaybackOrigin {
PlaybackOrigin::Home => Nav::Home,
PlaybackOrigin::Library => Nav::SavedTracks,
PlaybackOrigin::Album(link) => Nav::AlbumDetail(link.clone(), None),
PlaybackOrigin::Artist(link) => Nav::ArtistDetail(link.clone()),
PlaybackOrigin::Playlist(link) => Nav::PlaylistDetail(link.clone()),
PlaybackOrigin::Show(link) => Nav::ShowDetail(link.clone()),
PlaybackOrigin::Search(query) => Nav::SearchResults(query.clone()),
Expand All @@ -173,7 +170,6 @@ impl fmt::Display for PlaybackOrigin {
PlaybackOrigin::Home => f.write_str("Home"),
PlaybackOrigin::Library => f.write_str("Saved Tracks"),
PlaybackOrigin::Album(link) => link.name.fmt(f),
PlaybackOrigin::Artist(link) => link.name.fmt(f),
PlaybackOrigin::Playlist(link) => link.name.fmt(f),
PlaybackOrigin::Show(link) => link.name.fmt(f),
PlaybackOrigin::Search(query) => query.fmt(f),
Expand Down
6 changes: 4 additions & 2 deletions psst-gui/src/data/playlist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ pub struct PlaylistAddTrack {
#[derive(Clone, Debug, Data, Lens, Deserialize)]
pub struct PlaylistRemoveTrack {
pub link: PlaylistLink,
pub track_pos: usize,
pub track_uri: Arc<str>,
}

#[derive(Clone, Debug, Data, Lens, Deserialize)]
Expand All @@ -32,8 +32,10 @@ pub struct Playlist {
pub images: Option<Vector<Image>>,
#[serde(deserialize_with = "deserialize_description")]
pub description: Arc<str>,
#[serde(rename = "tracks")]
#[serde(rename = "items")]
#[serde(alias = "tracks")]
#[serde(deserialize_with = "deserialize_track_count")]
#[serde(default)]
pub track_count: Option<usize>,
pub owner: PublicUser,
pub collaborative: bool,
Expand Down
1 change: 1 addition & 0 deletions psst-gui/src/data/show.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub struct Show {
pub id: Arc<str>,
pub name: Arc<str>,
pub images: Vector<Image>,
#[serde(default)]
pub publisher: Arc<str>,
pub description: Arc<str>,
pub total_episodes: Option<usize>,
Expand Down
1 change: 1 addition & 0 deletions psst-gui/src/data/track.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ pub struct Track {
#[serde(skip_deserializing)]
pub local_path: Option<Arc<str>>,
pub is_playable: Option<bool>,
#[serde(default)]
pub popularity: Option<u32>,
#[serde(skip)]
pub track_pos: usize,
Expand Down
1 change: 1 addition & 0 deletions psst-gui/src/data/user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use serde::Deserialize;
#[derive(Clone, Data, Lens, Deserialize)]
pub struct UserProfile {
pub display_name: Arc<str>,
#[serde(default)]
pub email: Arc<str>,
pub id: Arc<str>,
}
Expand Down
47 changes: 3 additions & 44 deletions psst-gui/src/ui/artist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ use druid::{
use crate::{
cmd,
data::{
AppState, Artist, ArtistAlbums, ArtistDetail, ArtistInfo, ArtistLink, ArtistTracks, Cached,
Ctx, Nav, WithCtx,
AppState, Artist, ArtistAlbums, ArtistDetail, ArtistInfo, ArtistLink, Cached, Ctx, Nav,
WithCtx,
},
ui::utils::{stat_row, InfoLayout},
webapi::WebApi,
widget::{Async, Empty, MyWidgetExt, RemoteImage},
};

use super::{
album, playable, theme, track,
album, theme,
utils::{self},
};

Expand All @@ -27,39 +27,10 @@ pub const LOAD_DETAIL: Selector<ArtistLink> = Selector::new("app.artist.load-det
pub fn detail_widget() -> impl Widget<AppState> {
Flex::column()
.with_child(async_artist_info().padding((theme::grid(1.0), 0.0)))
.with_child(async_top_tracks_widget())
.with_child(async_albums_widget().padding((theme::grid(1.0), 0.0)))
.with_child(async_related_widget().padding((theme::grid(1.0), 0.0)))
}

fn async_top_tracks_widget() -> impl Widget<AppState> {
Async::new(
utils::spinner_widget,
top_tracks_widget,
utils::error_widget,
)
.lens(
Ctx::make(
AppState::common_ctx,
AppState::artist_detail.then(ArtistDetail::top_tracks),
)
.then(Ctx::in_promise()),
)
.on_command_async(
LOAD_DETAIL,
|d| WebApi::global().get_artist_top_tracks(&d.id),
|_, data, d| data.artist_detail.top_tracks.defer(d),
|_, data, (d, r)| {
let r = r.map(|tracks| ArtistTracks {
id: d.id.clone(),
name: d.name.clone(),
tracks,
});
data.artist_detail.top_tracks.update((d, r))
},
)
}

fn async_albums_widget() -> impl Widget<AppState> {
Async::new(utils::spinner_widget, albums_widget, utils::error_widget)
.lens(
Expand Down Expand Up @@ -217,18 +188,6 @@ fn artist_info_widget() -> impl Widget<WithCtx<ArtistInfo>> {
.padding((0.0, theme::grid(1.0))) // Keep overall vertical padding
}

fn top_tracks_widget() -> impl Widget<WithCtx<ArtistTracks>> {
playable::list_widget(playable::Display {
track: track::Display {
title: true,
album: true,
popularity: true,
cover: true,
..track::Display::empty()
},
})
}

fn albums_widget() -> impl Widget<WithCtx<ArtistAlbums>> {
Flex::column()
.cross_axis_alignment(CrossAxisAlignment::Start)
Expand Down
18 changes: 1 addition & 17 deletions psst-gui/src/ui/playable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use druid::{
use crate::{
cmd,
data::{
ArtistTracks, CommonCtx, FindQuery, MatchFindQuery, Playable, PlaybackOrigin,
CommonCtx, FindQuery, MatchFindQuery, Playable, PlaybackOrigin,
PlaybackPayload, PlaylistTracks, Recommendations, SavedTracks, SearchResults, ShowEpisodes,
Track, WithCtx,
},
Expand Down Expand Up @@ -170,22 +170,6 @@ impl PlayableIter for PlaylistTracks {
}
}

impl PlayableIter for ArtistTracks {
fn origin(&self) -> PlaybackOrigin {
PlaybackOrigin::Artist(self.link())
}

fn for_each(&self, mut cb: impl FnMut(Playable, usize)) {
for (position, track) in self.tracks.iter().enumerate() {
cb(Playable::Track(track.to_owned()), position);
}
}

fn count(&self) -> usize {
self.tracks.len()
}
}

impl PlayableIter for SavedTracks {
fn origin(&self) -> PlaybackOrigin {
PlaybackOrigin::Library
Expand Down
10 changes: 3 additions & 7 deletions psst-gui/src/ui/playback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,9 @@ fn playing_item_widget() -> impl Widget<NowPlaying> {
ctx.submit_command(cmd::NAVIGATE.with(now_playing.origin.to_nav()));
})
.context_menu(|now_playing| match &now_playing.item {
Playable::Track(track) => track::track_menu(
track,
&now_playing.library,
&now_playing.origin,
usize::MAX,
),
Playable::Track(track) => {
track::track_menu(track, &now_playing.library, &now_playing.origin)
}
Playable::Episode(episode) => {
episode::episode_menu(episode, &now_playing.library)
}
Expand Down Expand Up @@ -178,7 +175,6 @@ fn playback_origin_icon(origin: &PlaybackOrigin) -> &'static SvgIcon {
PlaybackOrigin::Home => &icons::HOME,
PlaybackOrigin::Library => &icons::HEART,
PlaybackOrigin::Album { .. } => &icons::ALBUM,
PlaybackOrigin::Artist { .. } => &icons::ARTIST,
PlaybackOrigin::Playlist { .. } => &icons::PLAYLIST,
PlaybackOrigin::Show { .. } => &icons::PODCAST,
PlaybackOrigin::Search { .. } => &icons::SEARCH,
Expand Down
2 changes: 1 addition & 1 deletion psst-gui/src/ui/playlist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ pub fn list_widget() -> impl Widget<AppState> {
})
.on_command_async(
REMOVE_TRACK,
|d| WebApi::global().remove_track_from_playlist(&d.link.id, d.track_pos),
|d| WebApi::global().remove_track_from_playlist(&d.link.id, &d.track_uri),
|_, data, d| {
data.with_library_mut(|library| library.decrement_playlist_track_count(&d.link))
},
Expand Down
2 changes: 1 addition & 1 deletion psst-gui/src/ui/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use crate::{
use super::{album, artist, playable, playlist, theme, track, utils};

const NUMBER_OF_RESULTS_PER_TOPIC: usize = 5;
const INDIVIDUAL_TOPIC_RESULTS_LIMIT: usize = 50;
const INDIVIDUAL_TOPIC_RESULTS_LIMIT: usize = 10;

pub const LOAD_RESULTS: Selector<(Arc<str>, Option<SearchTopic>)> =
Selector::new("app.search.load-results");
Expand Down
5 changes: 2 additions & 3 deletions psst-gui/src/ui/track.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,14 +232,13 @@ fn popularity_stars(popularity: u32) -> String {
}

fn track_row_menu(row: &PlayRow<Arc<Track>>) -> Menu<AppState> {
track_menu(&row.item, &row.ctx.library, &row.origin, row.item.track_pos)
track_menu(&row.item, &row.ctx.library, &row.origin)
}

pub fn track_menu(
track: &Arc<Track>,
library: &Library,
origin: &PlaybackOrigin,
track_pos: usize,
) -> Menu<AppState> {
let mut menu = Menu::empty();

Expand Down Expand Up @@ -347,7 +346,7 @@ pub fn track_menu(
)
.command(playlist::REMOVE_TRACK.with(PlaylistRemoveTrack {
link: playlist.to_owned(),
track_pos,
track_uri: format!("spotify:track:{}", track.id.0.to_base62()).into(),
})),
);
}
Expand Down
Loading
Loading