diff --git a/psst-gui/src/controller/nav.rs b/psst-gui/src/controller/nav.rs index 647eeef6..fccaab34 100644 --- a/psst-gui/src/controller/nav.rs +++ b/psst-gui/src/controller/nav.rs @@ -34,7 +34,7 @@ impl NavController { ctx.submit_command(search::LOAD_RESULTS.with(query.to_owned())); } } - Nav::AlbumDetail(link) => { + Nav::AlbumDetail(link, _) => { if !data.album_detail.album.contains(link) { ctx.submit_command(album::LOAD_DETAIL.with(link.to_owned())); } diff --git a/psst-gui/src/data/mod.rs b/psst-gui/src/data/mod.rs index 18c7e707..83769014 100644 --- a/psst-gui/src/data/mod.rs +++ b/psst-gui/src/data/mod.rs @@ -103,6 +103,7 @@ impl AppState { now_playing: None, library: Arc::clone(&library), show_track_cover: config.show_track_cover, + nav: Nav::Home, }); let playback = Playback { state: PlaybackState::Stopped, @@ -179,16 +180,28 @@ impl AppState { impl AppState { pub fn navigate(&mut self, nav: &Nav) { if &self.nav != nav { - let previous: Nav = mem::replace(&mut self.nav, nav.to_owned()); + let previous = mem::replace(&mut self.nav, nav.to_owned()); self.history.push_back(previous); self.config.last_route.replace(nav.to_owned()); + Arc::make_mut(&mut self.common_ctx).nav = nav.to_owned(); } } pub fn navigate_back(&mut self) { - if let Some(nav) = self.history.pop_back() { - self.config.last_route.replace(nav.clone()); + if let Some(mut nav) = self.history.pop_back() { + if let Nav::SearchResults(query) = &nav { + if SpotifyUrl::parse(query).is_some() { + nav = self.history.pop_back().unwrap_or(Nav::Home); + } + } + + if let Nav::AlbumDetail(album, _) = nav { + nav = Nav::AlbumDetail(album, None); + } + self.nav = nav; + self.config.last_route.replace(self.nav.to_owned()); + Arc::make_mut(&mut self.common_ctx).nav = self.nav.clone(); } } @@ -518,6 +531,7 @@ pub struct CommonCtx { pub now_playing: Option, pub library: Arc, pub show_track_cover: bool, + pub nav: Nav, } impl CommonCtx { diff --git a/psst-gui/src/data/nav.rs b/psst-gui/src/data/nav.rs index 3b0e2b1d..3b72137b 100644 --- a/psst-gui/src/data/nav.rs +++ b/psst-gui/src/data/nav.rs @@ -4,6 +4,7 @@ use druid::Data; use serde::{Deserialize, Serialize}; use url::Url; +use crate::data::track::TrackId; use crate::data::{AlbumLink, ArtistLink, PlaylistLink, ShowLink}; use super::RecommendationsRequest; @@ -23,7 +24,7 @@ pub enum Route { Recommendations, } -#[derive(Default, Clone, Debug, Data, PartialEq, Eq, Deserialize, Serialize)] +#[derive(Clone, Debug, Data, PartialEq, Eq, Default, Serialize, Deserialize)] pub enum Nav { #[default] Home, @@ -32,10 +33,10 @@ pub enum Nav { SavedAlbums, SavedShows, SearchResults(Arc), + AlbumDetail(AlbumLink, Option), ArtistDetail(ArtistLink), - AlbumDetail(AlbumLink), - ShowDetail(ShowLink), PlaylistDetail(PlaylistLink), + ShowDetail(ShowLink), Recommendations(Arc), } @@ -48,8 +49,8 @@ impl Nav { Nav::SavedAlbums => Route::SavedAlbums, Nav::SavedShows => Route::SavedShows, Nav::SearchResults(_) => Route::SearchResults, + Nav::AlbumDetail(_, _) => Route::AlbumDetail, Nav::ArtistDetail(_) => Route::ArtistDetail, - Nav::AlbumDetail(_) => Route::AlbumDetail, Nav::PlaylistDetail(_) => Route::PlaylistDetail, Nav::ShowDetail(_) => Route::ShowDetail, Nav::Recommendations(_) => Route::Recommendations, @@ -64,7 +65,7 @@ impl Nav { Nav::SavedAlbums => "Saved Albums".to_string(), Nav::SavedShows => "Saved Podcasts".to_string(), Nav::SearchResults(query) => query.to_string(), - Nav::AlbumDetail(link) => link.name.to_string(), + Nav::AlbumDetail(link, _) => link.name.to_string(), Nav::ArtistDetail(link) => link.name.to_string(), Nav::PlaylistDetail(link) => link.name.to_string(), Nav::ShowDetail(link) => link.name.to_string(), @@ -79,11 +80,11 @@ impl Nav { Nav::SavedTracks => "Saved Tracks".to_string(), Nav::SavedAlbums => "Saved Albums".to_string(), Nav::SavedShows => "Saved Shows".to_string(), - Nav::SearchResults(query) => format!("Search “{}”", query), - Nav::AlbumDetail(link) => format!("Album “{}”", link.name), - Nav::ArtistDetail(link) => format!("Artist “{}”", link.name), - Nav::PlaylistDetail(link) => format!("Playlist “{}”", link.name), - Nav::ShowDetail(link) => format!("Show “{}”", link.name), + Nav::SearchResults(query) => format!("Search \"{}\"", query), + Nav::AlbumDetail(link, _) => format!("Album \"{}\"", link.name), + Nav::ArtistDetail(link) => format!("Artist \"{}\"", link.name), + Nav::PlaylistDetail(link) => format!("Playlist \"{}\"", link.name), + Nav::ShowDetail(link) => format!("Show \"{}\"", link.name), Nav::Recommendations(_) => "Recommended".to_string(), } } @@ -104,7 +105,6 @@ impl SpotifyUrl { let mut segments = url.path_segments()?; let entity = segments.next()?; let id = segments.next()?; - log::info!("url: {:?}", url); match entity { "playlist" => Some(Self::Playlist(id.into())), "artist" => Some(Self::Artist(id.into())), diff --git a/psst-gui/src/data/playback.rs b/psst-gui/src/data/playback.rs index e64ab586..c7a42fcb 100644 --- a/psst-gui/src/data/playback.rs +++ b/psst-gui/src/data/playback.rs @@ -122,7 +122,7 @@ impl PlaybackOrigin { match &self { PlaybackOrigin::Home => Nav::Home, PlaybackOrigin::Library => Nav::SavedTracks, - PlaybackOrigin::Album(link) => Nav::AlbumDetail(link.clone()), + 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()), diff --git a/psst-gui/src/ui/album.rs b/psst-gui/src/ui/album.rs index f53ad678..b540e501 100644 --- a/psst-gui/src/ui/album.rs +++ b/psst-gui/src/ui/album.rs @@ -178,7 +178,7 @@ pub fn album_widget(horizontal: bool) -> impl Widget>> { .link() .rounded(theme::BUTTON_BORDER_RADIUS) .on_left_click(|ctx, _, album, _| { - ctx.submit_command(cmd::NAVIGATE.with(Nav::AlbumDetail(album.data.link()))); + ctx.submit_command(cmd::NAVIGATE.with(Nav::AlbumDetail(album.data.link(), None))); }) .context_menu(album_ctx_menu) } diff --git a/psst-gui/src/ui/mod.rs b/psst-gui/src/ui/mod.rs index 09b1bdd9..1c57faef 100644 --- a/psst-gui/src/ui/mod.rs +++ b/psst-gui/src/ui/mod.rs @@ -555,7 +555,7 @@ fn route_icon_widget() -> impl Widget