From a458f14327495f3d30607fa27147eec58e2ff484 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 2 Mar 2024 17:10:32 -0800 Subject: [PATCH] don't crash in fullscreen page when stopping (next track = nil) --- sharedutil/sharedutil.go | 7 +++++++ ui/browsing/fullscreenpage.go | 9 +++++++-- ui/widgets/largenowplayingcard.go | 22 +++++++++++++--------- ui/widgets/playqueuelist.go | 8 +++++--- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/sharedutil/sharedutil.go b/sharedutil/sharedutil.go index d05a909..cce0323 100644 --- a/sharedutil/sharedutil.go +++ b/sharedutil/sharedutil.go @@ -102,6 +102,13 @@ func TrackIDOrEmptyStr(track *mediaprovider.Track) string { return track.ID } +func AlbumIDOrEmptyStr(track *mediaprovider.Track) string { + if track == nil { + return "" + } + return track.ID +} + func TracksToIDs(tracks []*mediaprovider.Track) []string { return MapSlice(tracks, func(tr *mediaprovider.Track) string { return tr.ID diff --git a/ui/browsing/fullscreenpage.go b/ui/browsing/fullscreenpage.go index b652653..1e4e5d1 100644 --- a/ui/browsing/fullscreenpage.go +++ b/ui/browsing/fullscreenpage.go @@ -110,9 +110,15 @@ func (a *FullscreenPage) OnSongChange(song, lastScrobbledIfAny *mediaprovider.Tr if a.imageLoadCancel != nil { a.imageLoadCancel() } - a.albumID = song.AlbumID a.nowPlayingID = sharedutil.TrackIDOrEmptyStr(song) + a.queueList.SetNowPlaying(a.nowPlayingID) + + a.albumID = sharedutil.AlbumIDOrEmptyStr(song) a.card.Update(song) + if song == nil { + a.card.SetCoverImage(nil) + return + } a.imageLoadCancel = a.im.GetFullSizeCoverArtAsync(song.CoverArtID, func(img image.Image, err error) { if err != nil { log.Printf("error loading cover art: %v\n", err) @@ -120,7 +126,6 @@ func (a *FullscreenPage) OnSongChange(song, lastScrobbledIfAny *mediaprovider.Tr a.card.SetCoverImage(img) } }) - a.queueList.SetNowPlaying(song.ID) } func (a *FullscreenPage) Reload() { diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index abfb9e9..743a19b 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -63,8 +63,6 @@ func NewLargeNowPlayingCard() *LargeNowPlayingCard { n.trackName.Segments[0].(*widget.TextSegment).Style.SizeName = theme.SizeNameSubHeadingText n.trackName.Truncation = fyne.TextTruncateEllipsis - n.trackName.Hidden = true - n.albumName.Hidden = true n.albumName.Truncation = fyne.TextTruncateEllipsis n.trackName.Truncation = fyne.TextTruncateEllipsis n.albumName.OnTapped = n.onAlbumNameTapped @@ -100,13 +98,19 @@ func (n *LargeNowPlayingCard) onSetRating(rating int) { } func (n *LargeNowPlayingCard) Update(track *mediaprovider.Track) { - n.trackName.Segments[0].(*widget.TextSegment).Text = track.Name - n.trackName.Hidden = track.Name == "" - n.artistName.BuildSegments(track.ArtistNames, track.ArtistIDs) - n.albumName.Text = track.Album - n.albumName.Hidden = track.Album == "" - n.rating.Rating = track.Rating - n.favorite.Favorite = track.Favorite + if track != nil { + n.trackName.Segments[0].(*widget.TextSegment).Text = track.Name + n.artistName.BuildSegments(track.ArtistNames, track.ArtistIDs) + n.albumName.Text = track.Album + n.rating.Rating = track.Rating + n.favorite.Favorite = track.Favorite + } else { + n.trackName.Segments[0].(*widget.TextSegment).Text = "" + n.artistName.BuildSegments([]string{}, []string{}) + n.albumName.Text = "" + n.rating.Rating = 0 + n.favorite.Favorite = false + } n.Refresh() } diff --git a/ui/widgets/playqueuelist.go b/ui/widgets/playqueuelist.go index 062ab57..41eee8d 100644 --- a/ui/widgets/playqueuelist.go +++ b/ui/widgets/playqueuelist.go @@ -9,6 +9,7 @@ import ( "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/driver/desktop" + "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/dweymouth/supersonic/backend" @@ -19,7 +20,7 @@ import ( "github.com/dweymouth/supersonic/ui/util" ) -const thumbnailSize = 60 +const thumbnailSize = 52 type PlayQueueList struct { widget.BaseWidget @@ -41,7 +42,8 @@ func NewPlayQueueList(im *backend.ImageManager) *PlayQueueList { p.ExtendBaseWidget(p) // #, Cover, Title/Artist, Time - p.colLayout = layouts.NewColumnsLayout([]float32{40, thumbnailSize, -1, 60}) + coverWidth := NewPlayQueueListRow(p, im, layout.NewSpacer()).cover.MinSize().Width + p.colLayout = layouts.NewColumnsLayout([]float32{40, coverWidth, -1, 60}) playIconResource := theme.NewThemedResource(theme.MediaPlayIcon()) playIconResource.ColorName = theme.ColorNamePrimary @@ -215,7 +217,7 @@ func NewPlayQueueListRow(playQueueList *PlayQueueList, im *backend.ImageManager, p.Content = container.New(playQueueList.colLayout, container.NewCenter(p.num), - p.cover, + container.NewPadded(p.cover), container.New(&layouts.VboxCustomPadding{ExtraPad: -15}, p.title, p.artist), container.NewCenter(p.time),