Merge pull request #762 from zacaj/feature/nowPlaying-album-year

Fix #741: add album year to now playing
This commit is contained in:
Drew Weymouth
2025-11-26 14:21:57 -05:00
committed by GitHub
24 changed files with 100 additions and 47 deletions
+13
View File
@@ -2,6 +2,7 @@ package widgets
import (
"image"
"strconv"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
@@ -20,6 +21,7 @@ type LargeNowPlayingCard struct {
CaptionedImage
DisableRating bool
ShowAlbumYear bool
isRadio bool
trackName *widget.RichText
@@ -30,6 +32,8 @@ type LargeNowPlayingCard struct {
ratingFavoriteContainer *fyne.Container
cover *ImagePlaceholder
albumYear string
OnArtistNameTapped func(artistID string)
OnAlbumNameTapped func()
OnRadioURLTapped func(url string)
@@ -72,6 +76,7 @@ func NewLargeNowPlayingCard() *LargeNowPlayingCard {
n.trackName.Truncation = fyne.TextTruncateEllipsis
n.albumName.SizeName = myTheme.SizeNameSubSubHeadingText
n.albumName.OnTapped = n.onAlbumNameTapped
n.albumName.SuffixParenthesized = true
n.artistName.OnTapped = n.onArtistNameTapped
n.artistName.SizeName = myTheme.SizeNameSubSubHeadingText
@@ -125,6 +130,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 +149,13 @@ func (n *LargeNowPlayingCard) Update(item mediaprovider.MediaItem) {
n.cover.PlaceholderIcon = myTheme.TracksIcon
n.ratingFavoriteContainer.Hidden = false
n.isRadio = false
n.albumYear = strconv.Itoa(tr.Year)
} 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.albumYear = ""
}
n.Refresh()
@@ -163,5 +171,10 @@ func (n *LargeNowPlayingCard) Refresh() {
} else {
n.rating.Enable()
}
if n.ShowAlbumYear {
n.albumName.Suffix = n.albumYear
} else {
n.albumName.Suffix = ""
}
n.BaseWidget.Refresh()
}
+12 -4
View File
@@ -14,10 +14,12 @@ type MultiHyperlink struct {
Segments []MultiHyperlinkSegment
// Suffix string that is appended (with · separator)
// only if there is enough room
// Suffix string that is appended (with · separator, or parenthesized
// if SuffixParenthesized is true) only if there is enough room
Suffix string
SuffixParenthesized bool
OnMouseIn func(*desktop.MouseEvent)
OnMouseOut func()
OnTapped func(string)
@@ -139,12 +141,18 @@ func (c *MultiHyperlink) layoutObjects() {
i += 1
c.content.Objects = c.objects[:2*i-1]
if i == len(c.Segments) && c.Suffix != "" {
var suffixText string
if c.SuffixParenthesized {
suffixText = "\u2009(" + c.Suffix + ")"
} else {
suffixText = "· " + c.Suffix
}
if c.suffixLabel == nil {
c.suffixLabel = ttwidget.NewRichTextWithText("· " + c.Suffix)
c.suffixLabel = ttwidget.NewRichTextWithText(suffixText)
c.suffixLabel.OnMouseIn = c.callOnMouseIn
c.suffixLabel.OnMouseOut = c.callOnMouseOut
} else {
c.suffixLabel.Segments[0].(*widget.TextSegment).Text = "· " + c.Suffix
c.suffixLabel.Segments[0].(*widget.TextSegment).Text = suffixText
}
sizeName := c.sizeName()
if c.SuffixSizeName != "" {
+27 -14
View File
@@ -2,6 +2,7 @@ package widgets
import (
"image"
"strconv"
"fyne.io/fyne/v2/lang"
@@ -15,7 +16,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
@@ -24,17 +24,20 @@ type NowPlayingCard struct {
widget.BaseWidget
DisableRating bool
ShowAlbumYear bool
trackName *OptionHyperlink
artistName *MultiHyperlink
albumName *ttwidget.Hyperlink
albumName *MultiHyperlink
cover *ImagePlaceholder
menu *widget.PopUpMenu
ratingMenu *fyne.MenuItem
albumYear string
OnTrackNameTapped func()
OnArtistNameTapped func(artistID string)
OnAlbumNameTapped func()
OnAlbumNameTapped func(albumID string)
OnCoverTapped func()
OnSetRating func(rating int)
OnSetFavorite func(favorite bool)
@@ -47,7 +50,7 @@ func NewNowPlayingCard() *NowPlayingCard {
n := &NowPlayingCard{
trackName: NewOptionHyperlink(),
artistName: NewMultiHyperlink(),
albumName: ttwidget.NewHyperlink("", nil),
albumName: NewMultiHyperlink(),
}
n.ExtendBaseWidget(n)
n.cover = NewImagePlaceholder(myTheme.TracksIcon, 85)
@@ -56,7 +59,8 @@ func NewNowPlayingCard() *NowPlayingCard {
n.cover.Hidden = true
n.trackName.Hidden = true
n.albumName.Hidden = true
n.albumName.Truncation = fyne.TextTruncateEllipsis
n.albumName.SuffixParenthesized = true
n.albumName.SuffixSizeName = myTheme.SizeNameSubText
n.trackName.SetTextStyle(fyne.TextStyle{Bold: true})
n.trackName.OnShowMenu = n.showMenu
n.albumName.OnTapped = n.onAlbumNameTapped
@@ -71,9 +75,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 +142,28 @@ 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.albumYear = ""
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})
n.albumYear = strconv.Itoa(tr.Year)
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()
}
@@ -167,6 +171,15 @@ func (n *NowPlayingCard) SetImage(cover image.Image) {
n.cover.SetImage(cover, true)
}
func (n *NowPlayingCard) Refresh() {
if n.ShowAlbumYear {
n.albumName.Suffix = n.albumYear
} else {
n.albumName.Suffix = ""
}
n.BaseWidget.Refresh()
}
func (n *NowPlayingCard) showMenu(btnPos fyne.Position) {
if n.menu == nil {
n.ratingMenu = util.NewRatingSubmenu(n.onSetRating)
+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", " ")