diff --git a/ui/bottompanel.go b/ui/bottompanel.go index cac85f3..f9abbd3 100644 --- a/ui/bottompanel.go +++ b/ui/bottompanel.go @@ -61,6 +61,9 @@ func NewBottomPanel(p *player.Player, contr *controller.Controller) *BottomPanel bp.NowPlaying.OnArtistNameTapped(func() { contr.NavigateTo(controller.ArtistRoute(bp.playbackManager.NowPlaying().ArtistID)) }) + bp.NowPlaying.OnTrackNameTapped(func() { + contr.NavigateTo(controller.NowPlayingRoute(bp.playbackManager.NowPlaying().ID)) + }) bp.Controls = widgets.NewPlayerControls() bp.Controls.OnPlayPause(func() { p.PlayPause() diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index 9c200c3..ed61f73 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -32,6 +32,7 @@ type nowPlayingPageState struct { } func NewNowPlayingPage( + highlightedTrackID string, contr *controller.Controller, conf *backend.NowPlayingPageConfig, sm *backend.ServerManager, @@ -56,7 +57,7 @@ func NewNowPlayingPage( a.title.Segments[0].(*widget.TextSegment).Style.SizeName = widget.RichTextStyleHeading.SizeName a.container = container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 5, PadBottom: 15}, container.NewBorder(a.title, nil, nil, nil, a.tracklist)) - a.load() + a.load(highlightedTrackID) return a } @@ -70,7 +71,7 @@ func (a *NowPlayingPage) Save() SavedPage { } func (a *NowPlayingPage) Route() controller.Route { - return controller.NowPlayingRoute() + return controller.NowPlayingRoute("") } func (a *NowPlayingPage) Tapped(*fyne.PointEvent) { @@ -92,7 +93,7 @@ func (a *NowPlayingPage) OnSongChange(song *subsonic.Child, lastScrobbledIfAny * } func (a *NowPlayingPage) Reload() { - a.load() + a.load("") } func (a *NowPlayingPage) onPlayTrackAt(tracknum int) { @@ -106,12 +107,15 @@ func (a *NowPlayingPage) onRemoveSelectedFromQueue() { } // does not make calls to server - can safely be run in UI callbacks -func (a *NowPlayingPage) load() { +func (a *NowPlayingPage) load(highlightedTrackID string) { queue := a.pm.GetPlayQueue() a.tracklist.Tracks = queue a.tracklist.SetNowPlaying(a.nowPlayingID) + if highlightedTrackID != "" { + a.tracklist.SelectAndScrollToTrack(highlightedTrackID) + } } func (s *nowPlayingPageState) Restore() Page { - return NewNowPlayingPage(s.contr, s.conf, s.sm, s.pm) + return NewNowPlayingPage("", s.contr, s.conf, s.sm, s.pm) } diff --git a/ui/browsing/router.go b/ui/browsing/router.go index 9facac0..c71a65c 100644 --- a/ui/browsing/router.go +++ b/ui/browsing/router.go @@ -41,7 +41,7 @@ func (r Router) CreatePage(rte controller.Route) Page { case controller.Genres: return NewArtistsGenresPage(true, r.Controller, r.App.ServerManager) case controller.NowPlaying: - return NewNowPlayingPage(r.Controller, &r.App.Config.NowPlayingPage, r.App.ServerManager, r.App.PlaybackManager) + return NewNowPlayingPage(rte.Arg, r.Controller, &r.App.Config.NowPlayingPage, r.App.ServerManager, r.App.PlaybackManager) case controller.Playlist: return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager) case controller.Playlists: diff --git a/ui/controller/routes.go b/ui/controller/routes.go index 62bfea3..927a862 100644 --- a/ui/controller/routes.go +++ b/ui/controller/routes.go @@ -61,6 +61,6 @@ func ArtistsRoute() Route { return Route{Page: Artists} } -func NowPlayingRoute() Route { - return Route{Page: NowPlaying} +func NowPlayingRoute(highlightedTrackID string) Route { + return Route{Page: NowPlaying, Arg: highlightedTrackID} } diff --git a/ui/mainwindow.go b/ui/mainwindow.go index e30e638..6a24241 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -179,7 +179,7 @@ func (m *MainWindow) ShowNewVersionDialog(appName, versionTag string) { func (m *MainWindow) addNavigationButtons() { m.BrowsingPane.AddNavigationButton(res.ResHeadphonesInvertPng, func() { - m.Router.NavigateTo(controller.NowPlayingRoute()) + m.Router.NavigateTo(controller.NowPlayingRoute("")) }) m.BrowsingPane.AddNavigationButton(res.ResHeartFilledInvertPng, func() { m.Router.NavigateTo(controller.FavoritesRoute()) diff --git a/ui/widgets/customhyperlink.go b/ui/widgets/customhyperlink.go index d85229f..9119813 100644 --- a/ui/widgets/customhyperlink.go +++ b/ui/widgets/customhyperlink.go @@ -90,6 +90,10 @@ func (c *CustomHyperlink) SetText(text string) { c.Refresh() } +func (c *CustomHyperlink) SetTextStyle(style fyne.TextStyle) { + c.h.TextStyle = style +} + func (c *CustomHyperlink) Resize(size fyne.Size) { c.h.MaxWidth = size.Width c.BaseWidget.Resize(size) diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index bb1de4c..e19ca46 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -15,7 +15,7 @@ import ( type NowPlayingCard struct { widget.BaseWidget - trackName *widget.Label + trackName *CustomHyperlink artistName *CustomHyperlink albumName *CustomHyperlink cover *TappableImage @@ -27,7 +27,7 @@ type NowPlayingCard struct { func NewNowPlayingCard() *NowPlayingCard { n := &NowPlayingCard{ - trackName: widget.NewLabel(""), + trackName: NewCustomHyperlink(), artistName: NewCustomHyperlink(), albumName: NewCustomHyperlink(), } @@ -35,8 +35,7 @@ func NewNowPlayingCard() *NowPlayingCard { n.cover = NewTappableImage(n.onShowCoverImage) n.artistName.Hidden = true n.albumName.Hidden = true - n.trackName.Wrapping = fyne.TextTruncate - n.trackName.TextStyle = fyne.TextStyle{Bold: true} + n.trackName.SetTextStyle(fyne.TextStyle{Bold: true}) n.cover.SetMinSize(fyne.NewSize(85, 85)) n.cover.FillMode = canvas.ImageFillContain @@ -59,7 +58,7 @@ func (n *NowPlayingCard) CreateRenderer() fyne.WidgetRenderer { } func (n *NowPlayingCard) Update(track, artist string, artistNavigable bool, album string, cover image.Image) { - n.trackName.Text = track + n.trackName.SetText(track) n.artistName.SetText(artist) n.artistName.Hidden = artist == "" n.artistName.Disabled = !artistNavigable @@ -76,3 +75,7 @@ func (n *NowPlayingCard) OnArtistNameTapped(f func()) { func (n *NowPlayingCard) OnAlbumNameTapped(f func()) { n.albumName.OnTapped = f } + +func (n *NowPlayingCard) OnTrackNameTapped(f func()) { + n.trackName.OnTapped = f +} diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index dce1779..af7b367 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -231,6 +231,22 @@ func (t *Tracklist) UnselectAll() { t.list.Refresh() } +func (t *Tracklist) SelectAndScrollToTrack(trackID string) { + t.tracksMutex.RLock() + idx := -1 + for i, tr := range t.Tracks { + if tr.ID == trackID { + idx = i + break + } + } + t.tracksMutex.RUnlock() + if idx >= 0 { + t.list.ScrollTo(idx) + t.selectionMgr.Select(idx) + } +} + func (t *Tracklist) CreateRenderer() fyne.WidgetRenderer { return widget.NewSimpleRenderer(t.container) }