Fix #741: add album year to now playing

This commit is contained in:
zacaj
2025-11-23 19:14:40 +00:00
parent a884795a78
commit 9fdb62ab56
9 changed files with 59 additions and 31 deletions
+12 -1
View File
@@ -2,6 +2,7 @@ package widgets
import (
"image"
"strconv"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
@@ -9,6 +10,7 @@ import (
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"github.com/dweymouth/supersonic/backend"
"github.com/dweymouth/supersonic/backend/mediaprovider"
myTheme "github.com/dweymouth/supersonic/ui/theme"
"github.com/dweymouth/supersonic/ui/util"
@@ -29,6 +31,7 @@ type LargeNowPlayingCard struct {
favorite *FavoriteIcon
ratingFavoriteContainer *fyne.Container
cover *ImagePlaceholder
cfg *backend.Config
OnArtistNameTapped func(artistID string)
OnAlbumNameTapped func()
@@ -37,7 +40,7 @@ type LargeNowPlayingCard struct {
OnSetFavorite func(favorite bool)
}
func NewLargeNowPlayingCard() *LargeNowPlayingCard {
func NewLargeNowPlayingCard(cfg *backend.Config) *LargeNowPlayingCard {
n := &LargeNowPlayingCard{
trackName: widget.NewRichTextWithText(""),
artistName: NewMultiHyperlink(),
@@ -45,6 +48,7 @@ func NewLargeNowPlayingCard() *LargeNowPlayingCard {
rating: NewStarRating(),
favorite: NewFavoriteIcon(),
cover: NewImagePlaceholder(myTheme.TracksIcon, 300),
cfg: cfg,
}
n.ExtendBaseWidget(n)
n.rating.StarSize = theme.IconInlineSize() + theme.InnerPadding()/2
@@ -125,6 +129,7 @@ func (n *LargeNowPlayingCard) Update(item mediaprovider.MediaItem) {
n.trackName.Segments[0].(*widget.TextSegment).Text = ""
n.artistName.BuildSegments([]string{}, []string{})
n.albumName.BuildSegments([]string{}, []string{})
n.albumName.Suffix = ""
n.rating.Rating = 0
n.favorite.Favorite = false
n.ratingFavoriteContainer.Hidden = true
@@ -143,11 +148,17 @@ func (n *LargeNowPlayingCard) Update(item mediaprovider.MediaItem) {
n.cover.PlaceholderIcon = myTheme.TracksIcon
n.ratingFavoriteContainer.Hidden = false
n.isRadio = false
if y := tr.Year; y != 0 && n.cfg.AlbumsPage.ShowYears {
n.albumName.Suffix = strconv.Itoa(tr.Year)
} else {
n.albumName.Suffix = ""
}
} else if rd, ok := item.(*mediaprovider.RadioStation); ok {
n.artistName.BuildSegments([]string{rd.HomePageURL}, []string{rd.HomePageURL})
n.ratingFavoriteContainer.Hidden = true
n.cover.PlaceholderIcon = myTheme.RadioIcon
n.isRadio = true
n.albumName.Suffix = ""
}
n.Refresh()
+21 -15
View File
@@ -2,9 +2,11 @@ package widgets
import (
"image"
"strconv"
"fyne.io/fyne/v2/lang"
"github.com/dweymouth/supersonic/backend"
"github.com/dweymouth/supersonic/backend/mediaprovider"
myTheme "github.com/dweymouth/supersonic/ui/theme"
"github.com/dweymouth/supersonic/ui/util"
@@ -15,7 +17,6 @@ import (
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
ttwidget "github.com/dweymouth/fyne-tooltip/widget"
)
// Shows the current album art, track name, artist name, and album name
@@ -27,14 +28,15 @@ type NowPlayingCard struct {
trackName *OptionHyperlink
artistName *MultiHyperlink
albumName *ttwidget.Hyperlink
albumName *MultiHyperlink
cover *ImagePlaceholder
menu *widget.PopUpMenu
ratingMenu *fyne.MenuItem
cfg *backend.Config
OnTrackNameTapped func()
OnArtistNameTapped func(artistID string)
OnAlbumNameTapped func()
OnAlbumNameTapped func(albumID string)
OnCoverTapped func()
OnSetRating func(rating int)
OnSetFavorite func(favorite bool)
@@ -43,11 +45,12 @@ type NowPlayingCard struct {
OnShare func()
}
func NewNowPlayingCard() *NowPlayingCard {
func NewNowPlayingCard(cfg *backend.Config) *NowPlayingCard {
n := &NowPlayingCard{
trackName: NewOptionHyperlink(),
artistName: NewMultiHyperlink(),
albumName: ttwidget.NewHyperlink("", nil),
albumName: NewMultiHyperlink(),
cfg: cfg,
}
n.ExtendBaseWidget(n)
n.cover = NewImagePlaceholder(myTheme.TracksIcon, 85)
@@ -56,7 +59,6 @@ func NewNowPlayingCard() *NowPlayingCard {
n.cover.Hidden = true
n.trackName.Hidden = true
n.albumName.Hidden = true
n.albumName.Truncation = fyne.TextTruncateEllipsis
n.trackName.SetTextStyle(fyne.TextStyle{Bold: true})
n.trackName.OnShowMenu = n.showMenu
n.albumName.OnTapped = n.onAlbumNameTapped
@@ -71,9 +73,9 @@ func (n *NowPlayingCard) MinSize() fyne.Size {
return fyne.NewSize(n.BaseWidget.MinSize().Width, 85)
}
func (n *NowPlayingCard) onAlbumNameTapped() {
func (n *NowPlayingCard) onAlbumNameTapped(albumID string) {
if n.OnAlbumNameTapped != nil {
n.OnAlbumNameTapped()
n.OnAlbumNameTapped(albumID)
}
}
@@ -138,28 +140,32 @@ func (n *NowPlayingCard) Update(track mediaprovider.MediaItem) {
if track == nil {
n.trackName.SetTextAndToolTip("")
n.artistName.BuildSegments([]string{}, []string{})
n.albumName.SetText("")
n.albumName.SetToolTip("")
n.albumName.BuildSegments([]string{}, []string{})
n.albumName.Suffix = ""
n.cover.Hidden = true
} else {
n.cover.Hidden = false
n.trackName.SetTextAndToolTip(track.Metadata().Name)
if tr, ok := track.(*mediaprovider.Track); ok {
n.artistName.BuildSegments(tr.ArtistNames, tr.ArtistIDs)
n.albumName.SetText(tr.Album)
n.albumName.SetToolTip(tr.Album)
n.albumName.BuildSegments([]string{tr.Album}, []string{tr.AlbumID})
if y := tr.Year; y != 0 && n.cfg.AlbumsPage.ShowYears {
n.albumName.Suffix = strconv.Itoa(tr.Year)
} else {
n.albumName.Suffix = ""
}
n.cover.PlaceholderIcon = myTheme.TracksIcon
} else {
n.artistName.BuildSegments([]string{}, []string{})
n.albumName.SetText("")
n.albumName.SetToolTip("")
n.albumName.BuildSegments([]string{}, []string{})
n.albumName.Suffix = ""
n.cover.PlaceholderIcon = myTheme.RadioIcon
}
}
n.trackName.Hidden = n.trackName.Text() == ""
n.trackName.SetMenuBtnEnabled(n.cover.PlaceholderIcon != myTheme.RadioIcon)
n.artistName.Hidden = len(n.artistName.Segments) == 0
n.albumName.Hidden = n.albumName.Text == ""
n.albumName.Hidden = len(n.albumName.Segments) == 0
n.Refresh()
}
+5 -1
View File
@@ -457,7 +457,11 @@ func (t *tracklistRowBase) doUpdate(tm *util.TrackListModel, rowNum int) {
t.composer.BuildSegments(tr.ComposerNames, tr.ComposerIDs)
t.genre.BuildSegments(tr.Genres, tr.Genres)
t.dur.Text = util.SecondsToMMSS(tr.Duration.Seconds())
t.year.Text = strconv.Itoa(tr.Year)
if tr.Year != 0 {
t.year.Text = strconv.Itoa(tr.Year)
} else {
t.year.Text = ""
}
t.plays.Text = strconv.Itoa(int(tr.PlayCount))
t.lastPlayed.Text = util.LastPlayedDisplayString(tr.LastPlayed)
t.comment.Text = strings.ReplaceAll(tr.Comment, "\n", " ")