more work on fullscreen page

This commit is contained in:
Drew Weymouth
2024-03-01 16:59:04 -08:00
parent 9ed2d8502b
commit f1e5c55461
2 changed files with 58 additions and 24 deletions
+37 -10
View File
@@ -1,6 +1,10 @@
package browsing package browsing
import ( import (
"context"
"image"
"log"
"github.com/dweymouth/supersonic/backend" "github.com/dweymouth/supersonic/backend"
"github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/backend/mediaprovider"
"github.com/dweymouth/supersonic/sharedutil" "github.com/dweymouth/supersonic/sharedutil"
@@ -20,10 +24,11 @@ type FullscreenPage struct {
fullscreenPageState fullscreenPageState
queue []*mediaprovider.Track queue []*mediaprovider.Track
imageLoadCancel context.CancelFunc
card *widgets.LargeNowPlayingCard card *widgets.LargeNowPlayingCard
nowPlayingID string nowPlayingID string
albumID string
} }
type fullscreenPageState struct { type fullscreenPageState struct {
@@ -42,28 +47,39 @@ func NewFullscreenPage(
canRate bool, canRate bool,
) *FullscreenPage { ) *FullscreenPage {
a := &FullscreenPage{fullscreenPageState: fullscreenPageState{ 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.ExtendBaseWidget(a)
a.card = widgets.NewLargeNowPlayingCard() 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() a.Reload()
return a return a
} }
func (a *FullscreenPage) CreateRenderer() fyne.WidgetRenderer { func (a *FullscreenPage) CreateRenderer() fyne.WidgetRenderer {
paddedLayout := &layouts.PercentPadLayout{
LeftRightObjectPercent: .8,
TopBottomObjectPercent: .8,
}
container := container.NewGridWithColumns(2, container := container.NewGridWithColumns(2,
container.New(&layouts.PercentPadLayout{ container.New(paddedLayout, a.card),
LeftRightObjectPercent: .8, container.New(paddedLayout,
TopBottomObjectPercent: .8, util.AddHeaderBackground(
}, a.card), container.NewAppTabs(
layout.NewSpacer(), container.NewTabItem("Up Next", layout.NewSpacer()),
container.NewTabItem("Lyrics", layout.NewSpacer()),
))),
) )
return widget.NewSimpleRenderer(container) return widget.NewSimpleRenderer(container)
} }
func (a *FullscreenPage) Save() SavedPage { func (a *FullscreenPage) Save() SavedPage {
if a.imageLoadCancel != nil {
a.imageLoadCancel()
}
nps := a.fullscreenPageState nps := a.fullscreenPageState
return &nps return &nps
} }
@@ -75,8 +91,19 @@ func (a *FullscreenPage) Route() controller.Route {
var _ CanShowNowPlaying = (*FullscreenPage)(nil) var _ CanShowNowPlaying = (*FullscreenPage)(nil)
func (a *FullscreenPage) OnSongChange(song, lastScrobbledIfAny *mediaprovider.Track) { func (a *FullscreenPage) OnSongChange(song, lastScrobbledIfAny *mediaprovider.Track) {
if a.imageLoadCancel != nil {
a.imageLoadCancel()
}
a.albumID = song.AlbumID
a.nowPlayingID = sharedutil.TrackIDOrEmptyStr(song) a.nowPlayingID = sharedutil.TrackIDOrEmptyStr(song)
a.card.Update(song.Name, song.ArtistNames, song.ArtistIDs, song.Album) 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() { func (a *FullscreenPage) Reload() {
+21 -14
View File
@@ -5,9 +5,11 @@ import (
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/dweymouth/supersonic/ui/layouts" "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 // Shows the current album art, track name, artist name, and album name
@@ -17,12 +19,13 @@ type LargeNowPlayingCard struct {
DisableRating bool DisableRating bool
trackName *widget.Hyperlink trackName *widget.RichText
artistName *MultiHyperlink artistName *MultiHyperlink
albumName *widget.Hyperlink albumName *widget.Hyperlink
rating *StarRating
favorite *widget.Icon
cover *ImagePlaceholder cover *ImagePlaceholder
OnTrackNameTapped func()
OnArtistNameTapped func(artistID string) OnArtistNameTapped func(artistID string)
OnAlbumNameTapped func() OnAlbumNameTapped func()
OnShowCoverImage func() OnShowCoverImage func()
@@ -33,28 +36,38 @@ type LargeNowPlayingCard struct {
func NewLargeNowPlayingCard() *LargeNowPlayingCard { func NewLargeNowPlayingCard() *LargeNowPlayingCard {
n := &LargeNowPlayingCard{ n := &LargeNowPlayingCard{
trackName: widget.NewHyperlink("", nil), trackName: widget.NewRichTextWithText(""),
artistName: NewMultiHyperlink(), artistName: NewMultiHyperlink(),
albumName: widget.NewHyperlink("", nil), 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.ExtendBaseWidget(n)
n.rating.StarSize = theme.IconInlineSize() + theme.InnerPadding()/2
// set up the layout // set up the layout
n.Content = n.cover n.Content = n.cover
n.Caption = container.New(&layouts.VboxCustomPadding{ExtraPad: -13}, n.Caption = container.New(&layouts.VboxCustomPadding{ExtraPad: -13},
n.trackName, n.trackName,
n.albumName, n.albumName,
n.artistName, 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.trackName.Hidden = true
n.albumName.Hidden = true n.albumName.Hidden = true
n.albumName.Truncation = fyne.TextTruncateEllipsis n.albumName.Truncation = fyne.TextTruncateEllipsis
n.trackName.Truncation = fyne.TextTruncateEllipsis n.trackName.Truncation = fyne.TextTruncateEllipsis
n.trackName.TextStyle.Bold = true
n.albumName.OnTapped = n.onAlbumNameTapped n.albumName.OnTapped = n.onAlbumNameTapped
n.artistName.OnTapped = n.onArtistNameTapped n.artistName.OnTapped = n.onArtistNameTapped
n.trackName.OnTapped = n.onTrackNameTapped
return n 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) { func (n *LargeNowPlayingCard) onShowCoverImage(*fyne.PointEvent) {
if n.OnShowCoverImage != nil { if n.OnShowCoverImage != nil {
n.OnShowCoverImage() n.OnShowCoverImage()
@@ -96,7 +103,7 @@ func (n *LargeNowPlayingCard) onSetRating(rating int) {
} }
func (n *LargeNowPlayingCard) Update(track string, artists, artistIDs []string, album string) { 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.trackName.Hidden = track == ""
n.artistName.BuildSegments(artists, artistIDs) n.artistName.BuildSegments(artists, artistIDs)
n.albumName.SetText(album) n.albumName.SetText(album)