more work on fullscreen page
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user