116 lines
2.8 KiB
Go
116 lines
2.8 KiB
Go
package widgets
|
|
|
|
import (
|
|
"image"
|
|
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/widget"
|
|
"github.com/dweymouth/supersonic/ui/theme"
|
|
)
|
|
|
|
// Shows the current album art, track name, artist name, and album name
|
|
// for the currently playing track. Placed into the left side of the BottomPanel.
|
|
type LargeNowPlayingCard struct {
|
|
widget.BaseWidget
|
|
|
|
DisableRating bool
|
|
|
|
trackName *widget.Hyperlink
|
|
artistName *MultiHyperlink
|
|
albumName *widget.Hyperlink
|
|
cover *ImagePlaceholder
|
|
|
|
OnTrackNameTapped func()
|
|
OnArtistNameTapped func(artistID string)
|
|
OnAlbumNameTapped func()
|
|
OnShowCoverImage func()
|
|
OnSetRating func(rating int)
|
|
OnSetFavorite func(favorite bool)
|
|
OnAddToPlaylist func()
|
|
}
|
|
|
|
func NewLargeNowPlayingCard() *LargeNowPlayingCard {
|
|
n := &LargeNowPlayingCard{
|
|
trackName: widget.NewHyperlink("", nil),
|
|
artistName: NewMultiHyperlink(),
|
|
albumName: widget.NewHyperlink("", nil),
|
|
}
|
|
n.ExtendBaseWidget(n)
|
|
n.cover = NewImagePlaceholder(theme.TracksIcon, 300)
|
|
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
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) MinSize() fyne.Size {
|
|
// prop up height for when cover image is hidden
|
|
return fyne.NewSize(n.BaseWidget.MinSize().Width, 85)
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) onAlbumNameTapped() {
|
|
if n.OnAlbumNameTapped != nil {
|
|
n.OnAlbumNameTapped()
|
|
}
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) onArtistNameTapped(artistID string) {
|
|
if n.OnArtistNameTapped != nil {
|
|
n.OnArtistNameTapped(artistID)
|
|
}
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) onTrackNameTapped() {
|
|
if n.OnTrackNameTapped != nil {
|
|
n.OnTrackNameTapped()
|
|
}
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) onShowCoverImage(*fyne.PointEvent) {
|
|
if n.OnShowCoverImage != nil {
|
|
n.OnShowCoverImage()
|
|
}
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) onSetFavorite(fav bool) {
|
|
if n.OnSetFavorite != nil {
|
|
n.OnSetFavorite(fav)
|
|
}
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) onSetRating(rating int) {
|
|
if n.OnSetRating != nil {
|
|
n.OnSetRating(rating)
|
|
}
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) CreateRenderer() fyne.WidgetRenderer {
|
|
vbox := container.NewVBox(
|
|
n.trackName,
|
|
n.albumName,
|
|
n.artistName,
|
|
)
|
|
c := container.NewBorder(nil, vbox, nil, nil, n.cover)
|
|
return widget.NewSimpleRenderer(c)
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) Update(track string, artists, artistIDs []string, album string) {
|
|
n.trackName.SetText(track)
|
|
n.trackName.Hidden = track == ""
|
|
n.artistName.BuildSegments(artists, artistIDs)
|
|
n.albumName.SetText(album)
|
|
n.albumName.Hidden = album == ""
|
|
n.Refresh()
|
|
}
|
|
|
|
func (n *LargeNowPlayingCard) SetCoverImage(im image.Image) {
|
|
n.cover.SetImage(im, false)
|
|
}
|