From f1e5c554615fdded87bffc54290bce7dde2cb5f7 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 1 Mar 2024 09:21:10 -0800 Subject: [PATCH] more work on fullscreen page --- ui/browsing/fullscreenpage.go | 47 ++++++++++++++++++++++++------- ui/widgets/largenowplayingcard.go | 35 ++++++++++++++--------- 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/ui/browsing/fullscreenpage.go b/ui/browsing/fullscreenpage.go index bb28d01..cd6fab1 100644 --- a/ui/browsing/fullscreenpage.go +++ b/ui/browsing/fullscreenpage.go @@ -1,6 +1,10 @@ package browsing import ( + "context" + "image" + "log" + "github.com/dweymouth/supersonic/backend" "github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/sharedutil" @@ -20,10 +24,11 @@ type FullscreenPage struct { fullscreenPageState - queue []*mediaprovider.Track - - card *widgets.LargeNowPlayingCard - nowPlayingID string + queue []*mediaprovider.Track + imageLoadCancel context.CancelFunc + card *widgets.LargeNowPlayingCard + nowPlayingID string + albumID string } type fullscreenPageState struct { @@ -42,28 +47,39 @@ func NewFullscreenPage( canRate bool, ) *FullscreenPage { a := &FullscreenPage{fullscreenPageState: fullscreenPageState{ - contr: contr, pool: pool, pm: pm, canRate: canRate, + contr: contr, pool: pool, im: im, pm: pm, canRate: canRate, }} a.ExtendBaseWidget(a) a.card = widgets.NewLargeNowPlayingCard() + a.card.OnAlbumNameTapped = func() { contr.NavigateTo(controller.AlbumRoute(a.albumID)) } + a.card.OnArtistNameTapped = func(artistID string) { contr.NavigateTo(controller.ArtistRoute(artistID)) } a.Reload() return a } func (a *FullscreenPage) CreateRenderer() fyne.WidgetRenderer { + paddedLayout := &layouts.PercentPadLayout{ + LeftRightObjectPercent: .8, + TopBottomObjectPercent: .8, + } container := container.NewGridWithColumns(2, - container.New(&layouts.PercentPadLayout{ - LeftRightObjectPercent: .8, - TopBottomObjectPercent: .8, - }, a.card), - layout.NewSpacer(), + container.New(paddedLayout, a.card), + container.New(paddedLayout, + util.AddHeaderBackground( + container.NewAppTabs( + container.NewTabItem("Up Next", layout.NewSpacer()), + container.NewTabItem("Lyrics", layout.NewSpacer()), + ))), ) return widget.NewSimpleRenderer(container) } func (a *FullscreenPage) Save() SavedPage { + if a.imageLoadCancel != nil { + a.imageLoadCancel() + } nps := a.fullscreenPageState return &nps } @@ -75,8 +91,19 @@ func (a *FullscreenPage) Route() controller.Route { var _ CanShowNowPlaying = (*FullscreenPage)(nil) func (a *FullscreenPage) OnSongChange(song, lastScrobbledIfAny *mediaprovider.Track) { + if a.imageLoadCancel != nil { + a.imageLoadCancel() + } + a.albumID = song.AlbumID a.nowPlayingID = sharedutil.TrackIDOrEmptyStr(song) a.card.Update(song.Name, song.ArtistNames, song.ArtistIDs, song.Album) + 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) + } else { + a.card.SetCoverImage(img) + } + }) } func (a *FullscreenPage) Reload() { diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index 768f2d6..b1a1bcb 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -5,9 +5,11 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/dweymouth/supersonic/ui/layouts" - "github.com/dweymouth/supersonic/ui/theme" + myTheme "github.com/dweymouth/supersonic/ui/theme" ) // Shows the current album art, track name, artist name, and album name @@ -17,12 +19,13 @@ type LargeNowPlayingCard struct { DisableRating bool - trackName *widget.Hyperlink + trackName *widget.RichText artistName *MultiHyperlink albumName *widget.Hyperlink + rating *StarRating + favorite *widget.Icon cover *ImagePlaceholder - OnTrackNameTapped func() OnArtistNameTapped func(artistID string) OnAlbumNameTapped func() OnShowCoverImage func() @@ -33,28 +36,38 @@ type LargeNowPlayingCard struct { func NewLargeNowPlayingCard() *LargeNowPlayingCard { n := &LargeNowPlayingCard{ - trackName: widget.NewHyperlink("", nil), + trackName: widget.NewRichTextWithText(""), artistName: NewMultiHyperlink(), albumName: widget.NewHyperlink("", nil), - cover: NewImagePlaceholder(theme.TracksIcon, 300), + rating: NewStarRating(), + favorite: widget.NewIcon(myTheme.NotFavoriteIcon), + cover: NewImagePlaceholder(myTheme.TracksIcon, 300), } n.ExtendBaseWidget(n) + n.rating.StarSize = theme.IconInlineSize() + theme.InnerPadding()/2 // set up the layout n.Content = n.cover n.Caption = container.New(&layouts.VboxCustomPadding{ExtraPad: -13}, n.trackName, n.albumName, n.artistName, + container.NewHBox( + layout.NewSpacer(), + n.favorite, + widget.NewLabel("ยท"), + n.rating, + layout.NewSpacer(), + ), ) + 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.trackName.TextStyle.Bold = true n.albumName.OnTapped = n.onAlbumNameTapped n.artistName.OnTapped = n.onArtistNameTapped - n.trackName.OnTapped = n.onTrackNameTapped return n } @@ -71,12 +84,6 @@ func (n *LargeNowPlayingCard) onArtistNameTapped(artistID string) { } } -func (n *LargeNowPlayingCard) onTrackNameTapped() { - if n.OnTrackNameTapped != nil { - n.OnTrackNameTapped() - } -} - func (n *LargeNowPlayingCard) onShowCoverImage(*fyne.PointEvent) { if n.OnShowCoverImage != nil { n.OnShowCoverImage() @@ -96,7 +103,7 @@ func (n *LargeNowPlayingCard) onSetRating(rating int) { } func (n *LargeNowPlayingCard) Update(track string, artists, artistIDs []string, album string) { - n.trackName.SetText(track) + n.trackName.Segments[0].(*widget.TextSegment).Text = track n.trackName.Hidden = track == "" n.artistName.BuildSegments(artists, artistIDs) n.albumName.SetText(album)