Merge pull request #762 from zacaj/feature/nowPlaying-album-year
Fix #741: add album year to now playing
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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 != "" {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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", " ")
|
||||
|
||||
Reference in New Issue
Block a user