From 9fdb62ab56f81bedb977bda24f8ba29a1dffc200 Mon Sep 17 00:00:00 2001 From: zacaj Date: Sun, 23 Nov 2025 16:51:18 +0000 Subject: [PATCH 1/5] Fix #741: add album year to now playing --- res/translations/en.json | 1 + ui/bottompanel.go | 12 +++++------ ui/browsing/nowplayingpage.go | 10 ++++++--- ui/browsing/router.go | 2 +- ui/dialogs/settingsdialog.go | 2 +- ui/mainwindow.go | 8 +++++-- ui/widgets/largenowplayingcard.go | 13 ++++++++++- ui/widgets/nowplayingcard.go | 36 ++++++++++++++++++------------- ui/widgets/tracklistrow.go | 6 +++++- 9 files changed, 59 insertions(+), 31 deletions(-) diff --git a/res/translations/en.json b/res/translations/en.json index 02bed42..1f4cf37 100644 --- a/res/translations/en.json +++ b/res/translations/en.json @@ -210,6 +210,7 @@ "Show notification on track change": "Show notification on track change", "Show play queue": "Show play queue", "Show year in album grid cards": "Show year in album grid cards", + "Show year in with album name": "Show year in with album name", "Shuffle": "Shuffle", "Shuffled": "Shuffled", "Shuffle albums": "Shuffle albums", diff --git a/ui/bottompanel.go b/ui/bottompanel.go index ce0a2ba..b9b784f 100644 --- a/ui/bottompanel.go +++ b/ui/bottompanel.go @@ -28,7 +28,7 @@ type BottomPanel struct { var _ fyne.Widget = (*BottomPanel)(nil) -func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr *controller.Controller, useWaveformSeekbar bool) *BottomPanel { +func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr *controller.Controller, cfg *backend.Config) *BottomPanel { bp := &BottomPanel{} bp.ExtendBaseWidget(bp) @@ -46,7 +46,7 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr pm.OnPlaying(util.FyneDoFunc(func() { bp.Controls.SetPlaying(true) })) pm.OnStopped(util.FyneDoFunc(func() { bp.Controls.SetPlaying(false) })) - bp.NowPlaying = widgets.NewNowPlayingCard() + bp.NowPlaying = widgets.NewNowPlayingCard(cfg) bp.NowPlaying.OnCoverTapped = func() { contr.NavigateTo(controller.NowPlayingRoute()) } @@ -65,10 +65,8 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr contr.DoAddTracksToPlaylistWorkflow([]string{tr.ID}) } } - bp.NowPlaying.OnAlbumNameTapped = func() { - if tr, ok := pm.NowPlaying().(*mediaprovider.Track); ok { - contr.NavigateTo(controller.AlbumRoute(tr.AlbumID)) - } + bp.NowPlaying.OnAlbumNameTapped = func(albumID string) { + contr.NavigateTo(controller.AlbumRoute(albumID)) } bp.NowPlaying.OnArtistNameTapped = func(artistID string) { contr.NavigateTo(controller.ArtistRoute(artistID)) @@ -86,7 +84,7 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr contr.ShowShareDialog(tr.ID) } } - bp.Controls = widgets.NewPlayerControls(useWaveformSeekbar) + bp.Controls = widgets.NewPlayerControls(cfg.Playback.UseWaveformSeekbar) bp.Controls.OnPlayPause(func() { pm.PlayPause() }) diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index 48fe285..f68c724 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -79,6 +79,7 @@ type nowPlayingPageState struct { mp mediaprovider.MediaProvider canRate bool canShare bool + cfg *backend.Config } func NewNowPlayingPage( @@ -92,9 +93,10 @@ func NewNowPlayingPage( mp mediaprovider.MediaProvider, canRate bool, canShare bool, + cfg *backend.Config, ) *NowPlayingPage { state := nowPlayingPageState{ - conf: conf, contr: contr, pool: pool, sm: sm, lm: lm, im: im, pm: pm, mp: mp, canRate: canRate, canShare: canShare, + conf: conf, contr: contr, pool: pool, sm: sm, lm: lm, im: im, pm: pm, mp: mp, canRate: canRate, canShare: canShare, cfg: cfg, } if page, ok := pool.Obtain(util.WidgetTypeNowPlayingPage).(*NowPlayingPage); ok && page != nil { page.nowPlayingPageState = state @@ -109,7 +111,7 @@ func NewNowPlayingPage( pm.OnPlaying(doFmtStatus) pm.OnStopped(doFmtStatus) - a.card = widgets.NewLargeNowPlayingCard() + a.card = widgets.NewLargeNowPlayingCard(cfg) a.card.OnAlbumNameTapped = func() { contr.NavigateTo(controller.AlbumRoute(a.nowPlaying.Metadata().AlbumID)) } @@ -474,7 +476,7 @@ func (a *NowPlayingPage) Reload() { } func (s *nowPlayingPageState) Restore() Page { - return NewNowPlayingPage(s.conf, s.contr, s.pool, s.sm, s.lm, s.im, s.pm, s.mp, s.canRate, s.canShare) + return NewNowPlayingPage(s.conf, s.contr, s.pool, s.sm, s.lm, s.im, s.pm, s.mp, s.canRate, s.canShare, s.cfg) } var _ CanShowPlayTime = (*NowPlayingPage)(nil) @@ -527,6 +529,8 @@ func (a *NowPlayingPage) Refresh() { } } a.BaseWidget.Refresh() + + a.card.Update(a.nowPlaying) } func (a *NowPlayingPage) saveSelectedTab(tabNum int) { diff --git a/ui/browsing/router.go b/ui/browsing/router.go index c127aa8..0530e7c 100644 --- a/ui/browsing/router.go +++ b/ui/browsing/router.go @@ -50,7 +50,7 @@ func (r Router) CreatePage(rte controller.Route) Page { case controller.Genres: return NewGenresPage(r.Controller, r.App.ServerManager.Server) case controller.NowPlaying: - return NewNowPlayingPage(&r.App.Config.NowPlayingConfig, r.Controller, r.widgetPool, r.App.ServerManager, r.App.LyricsManager, r.App.ImageManager, r.App.PlaybackManager, r.App.ServerManager.Server, canRate, canShare) + return NewNowPlayingPage(&r.App.Config.NowPlayingConfig, r.Controller, r.widgetPool, r.App.ServerManager, r.App.LyricsManager, r.App.ImageManager, r.App.PlaybackManager, r.App.ServerManager.Server, canRate, canShare, r.App.Config) case controller.Playlist: return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, r.widgetPool, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager) case controller.Playlists: diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index a45419f..0470e73 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -184,7 +184,7 @@ func (s *SettingsDialog) createGeneralTab(canSaveQueueToServer bool) *container. trackNotif := widget.NewCheckWithData(lang.L("Show notification on track change"), binding.BindBool(&s.config.Application.ShowTrackChangeNotification)) - albumGridYears := widget.NewCheck(lang.L("Show year in album grid cards"), func(b bool) { + albumGridYears := widget.NewCheck(lang.L("Show year in with album name"), func(b bool) { s.config.AlbumsPage.ShowYears = b s.config.FavoritesPage.ShowAlbumYears = b if s.OnPageNeedsRefresh != nil { diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 9e580a5..18ed1cd 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -85,7 +85,11 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, m.Controller.NavHandler = m.Router.NavigateTo m.Controller.ReloadFunc = m.BrowsingPane.Reload m.Controller.CurPageFunc = m.BrowsingPane.CurrentPage - m.Controller.RefreshPageFunc = m.BrowsingPane.RefreshPage + m.Controller.RefreshPageFunc = func() { + m.BrowsingPane.RefreshPage() + + m.BottomPanel.onSongChange(app.PlaybackManager.NowPlaying(), nil) + } m.Controller.SelectAllPageFunc = m.BrowsingPane.SelectAll m.Controller.UnselectAllPageFunc = m.BrowsingPane.UnselectAll m.Controller.ToastProvider = m.ToastOverlay @@ -102,7 +106,7 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, )) } - m.BottomPanel = NewBottomPanel(app.PlaybackManager, app.ImageManager, m.Controller, m.Controller.App.Config.Playback.UseWaveformSeekbar) + m.BottomPanel = NewBottomPanel(app.PlaybackManager, app.ImageManager, m.Controller, app.Config) app.PlaybackManager.OnSongChange(func(item mediaprovider.MediaItem, _ *mediaprovider.Track) { fyne.Do(func() { m.UpdateOnTrackChange(item) }) }) diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index 4935d84..9e2acef 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -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() diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index 5618b06..674f541 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -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() } diff --git a/ui/widgets/tracklistrow.go b/ui/widgets/tracklistrow.go index e4dd0be..c2d3515 100644 --- a/ui/widgets/tracklistrow.go +++ b/ui/widgets/tracklistrow.go @@ -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", " ") From 6dca8e1abe0a1a60a4ccc59036f4d750b32ec791 Mon Sep 17 00:00:00 2001 From: zacaj Date: Tue, 25 Nov 2025 15:35:50 +0000 Subject: [PATCH 2/5] improve album year setting name --- res/translations/en.json | 2 +- ui/dialogs/settingsdialog.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/translations/en.json b/res/translations/en.json index 1f4cf37..347efeb 100644 --- a/res/translations/en.json +++ b/res/translations/en.json @@ -210,7 +210,7 @@ "Show notification on track change": "Show notification on track change", "Show play queue": "Show play queue", "Show year in album grid cards": "Show year in album grid cards", - "Show year in with album name": "Show year in with album name", + "Show year in album grid and now playing": "Show year in album grid and now playing", "Shuffle": "Shuffle", "Shuffled": "Shuffled", "Shuffle albums": "Shuffle albums", diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index 0470e73..9edeb07 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -184,7 +184,7 @@ func (s *SettingsDialog) createGeneralTab(canSaveQueueToServer bool) *container. trackNotif := widget.NewCheckWithData(lang.L("Show notification on track change"), binding.BindBool(&s.config.Application.ShowTrackChangeNotification)) - albumGridYears := widget.NewCheck(lang.L("Show year in with album name"), func(b bool) { + albumGridYears := widget.NewCheck(lang.L("Show year in album grid and now playing"), func(b bool) { s.config.AlbumsPage.ShowYears = b s.config.FavoritesPage.ShowAlbumYears = b if s.OnPageNeedsRefresh != nil { From 6b8feff25b87d6c1f6d81ed2603b91cb9b9a8252 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 26 Nov 2025 11:01:22 -0800 Subject: [PATCH 3/5] use parenthesized year when inline with album name --- ui/widgets/largenowplayingcard.go | 1 + ui/widgets/multihyperlink.go | 16 ++++++++++++---- ui/widgets/nowplayingcard.go | 2 ++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index 9e2acef..ebe1177 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -76,6 +76,7 @@ func NewLargeNowPlayingCard(cfg *backend.Config) *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 diff --git a/ui/widgets/multihyperlink.go b/ui/widgets/multihyperlink.go index 0737d43..c80cf81 100644 --- a/ui/widgets/multihyperlink.go +++ b/ui/widgets/multihyperlink.go @@ -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 != "" { diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index 674f541..2ece9e2 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -59,6 +59,8 @@ func NewNowPlayingCard(cfg *backend.Config) *NowPlayingCard { n.cover.Hidden = true n.trackName.Hidden = true n.albumName.Hidden = true + 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 From 565d2d99a97a7bb1c6345b3f95027602ced1fc67 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 26 Nov 2025 11:15:25 -0800 Subject: [PATCH 4/5] minor refactor: use Refresh and widget property to toggle showing year --- ui/bottompanel.go | 12 ++++++++++-- ui/browsing/nowplayingpage.go | 4 +++- ui/mainwindow.go | 3 +-- ui/widgets/largenowplayingcard.go | 21 +++++++++++---------- ui/widgets/nowplayingcard.go | 25 +++++++++++++++---------- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/ui/bottompanel.go b/ui/bottompanel.go index b9b784f..01b413c 100644 --- a/ui/bottompanel.go +++ b/ui/bottompanel.go @@ -24,12 +24,14 @@ type BottomPanel struct { AuxControls *widgets.AuxControls container *fyne.Container + + cfg *backend.Config } var _ fyne.Widget = (*BottomPanel)(nil) func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr *controller.Controller, cfg *backend.Config) *BottomPanel { - bp := &BottomPanel{} + bp := &BottomPanel{cfg: cfg} bp.ExtendBaseWidget(bp) pm.OnSongChange(bp.onSongChange) @@ -46,7 +48,8 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr pm.OnPlaying(util.FyneDoFunc(func() { bp.Controls.SetPlaying(true) })) pm.OnStopped(util.FyneDoFunc(func() { bp.Controls.SetPlaying(false) })) - bp.NowPlaying = widgets.NewNowPlayingCard(cfg) + bp.NowPlaying = widgets.NewNowPlayingCard() + bp.NowPlaying.ShowAlbumYear = cfg.AlbumsPage.ShowYears bp.NowPlaying.OnCoverTapped = func() { contr.NavigateTo(controller.NowPlayingRoute()) } @@ -146,6 +149,11 @@ func (bp *BottomPanel) updateWaveformImg(img *backend.WaveformImage) { }) } +func (bp *BottomPanel) Refresh() { + bp.NowPlaying.ShowAlbumYear = bp.cfg.AlbumsPage.ShowYears + bp.BaseWidget.Refresh() +} + func (bp *BottomPanel) CreateRenderer() fyne.WidgetRenderer { bp.ExtendBaseWidget(bp) return widget.NewSimpleRenderer(bp.container) diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index f68c724..04eda39 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -111,7 +111,7 @@ func NewNowPlayingPage( pm.OnPlaying(doFmtStatus) pm.OnStopped(doFmtStatus) - a.card = widgets.NewLargeNowPlayingCard(cfg) + a.card = widgets.NewLargeNowPlayingCard() a.card.OnAlbumNameTapped = func() { contr.NavigateTo(controller.AlbumRoute(a.nowPlaying.Metadata().AlbumID)) } @@ -129,6 +129,7 @@ func NewNowPlayingPage( a.card.OnSetRating = func(rating int) { a.contr.SetTrackRatings([]string{a.nowPlayingID}, rating) } + a.card.ShowAlbumYear = cfg.AlbumsPage.ShowYears a.queueList = widgets.NewPlayQueueList(a.im, false) a.relatedList = widgets.NewPlayQueueList(a.im, true) @@ -530,6 +531,7 @@ func (a *NowPlayingPage) Refresh() { } a.BaseWidget.Refresh() + a.card.ShowAlbumYear = a.cfg.AlbumsPage.ShowYears a.card.Update(a.nowPlaying) } diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 18ed1cd..862be5b 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -87,8 +87,7 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, m.Controller.CurPageFunc = m.BrowsingPane.CurrentPage m.Controller.RefreshPageFunc = func() { m.BrowsingPane.RefreshPage() - - m.BottomPanel.onSongChange(app.PlaybackManager.NowPlaying(), nil) + m.BottomPanel.Refresh() } m.Controller.SelectAllPageFunc = m.BrowsingPane.SelectAll m.Controller.UnselectAllPageFunc = m.BrowsingPane.UnselectAll diff --git a/ui/widgets/largenowplayingcard.go b/ui/widgets/largenowplayingcard.go index ebe1177..8c5c4d6 100644 --- a/ui/widgets/largenowplayingcard.go +++ b/ui/widgets/largenowplayingcard.go @@ -10,7 +10,6 @@ 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" @@ -22,6 +21,7 @@ type LargeNowPlayingCard struct { CaptionedImage DisableRating bool + ShowAlbumYear bool isRadio bool trackName *widget.RichText @@ -31,7 +31,8 @@ type LargeNowPlayingCard struct { favorite *FavoriteIcon ratingFavoriteContainer *fyne.Container cover *ImagePlaceholder - cfg *backend.Config + + albumYear string OnArtistNameTapped func(artistID string) OnAlbumNameTapped func() @@ -40,7 +41,7 @@ type LargeNowPlayingCard struct { OnSetFavorite func(favorite bool) } -func NewLargeNowPlayingCard(cfg *backend.Config) *LargeNowPlayingCard { +func NewLargeNowPlayingCard() *LargeNowPlayingCard { n := &LargeNowPlayingCard{ trackName: widget.NewRichTextWithText(""), artistName: NewMultiHyperlink(), @@ -48,7 +49,6 @@ func NewLargeNowPlayingCard(cfg *backend.Config) *LargeNowPlayingCard { rating: NewStarRating(), favorite: NewFavoriteIcon(), cover: NewImagePlaceholder(myTheme.TracksIcon, 300), - cfg: cfg, } n.ExtendBaseWidget(n) n.rating.StarSize = theme.IconInlineSize() + theme.InnerPadding()/2 @@ -149,17 +149,13 @@ 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 = "" - } + 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.albumName.Suffix = "" + n.albumYear = "" } n.Refresh() @@ -175,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() } diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index 2ece9e2..3bc0689 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -6,7 +6,6 @@ import ( "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" @@ -25,6 +24,7 @@ type NowPlayingCard struct { widget.BaseWidget DisableRating bool + ShowAlbumYear bool trackName *OptionHyperlink artistName *MultiHyperlink @@ -32,7 +32,8 @@ type NowPlayingCard struct { cover *ImagePlaceholder menu *widget.PopUpMenu ratingMenu *fyne.MenuItem - cfg *backend.Config + + albumYear string OnTrackNameTapped func() OnArtistNameTapped func(artistID string) @@ -45,12 +46,11 @@ type NowPlayingCard struct { OnShare func() } -func NewNowPlayingCard(cfg *backend.Config) *NowPlayingCard { +func NewNowPlayingCard() *NowPlayingCard { n := &NowPlayingCard{ trackName: NewOptionHyperlink(), artistName: NewMultiHyperlink(), albumName: NewMultiHyperlink(), - cfg: cfg, } n.ExtendBaseWidget(n) n.cover = NewImagePlaceholder(myTheme.TracksIcon, 85) @@ -143,7 +143,7 @@ func (n *NowPlayingCard) Update(track mediaprovider.MediaItem) { n.trackName.SetTextAndToolTip("") n.artistName.BuildSegments([]string{}, []string{}) n.albumName.BuildSegments([]string{}, []string{}) - n.albumName.Suffix = "" + n.albumYear = "" n.cover.Hidden = true } else { n.cover.Hidden = false @@ -151,11 +151,7 @@ func (n *NowPlayingCard) Update(track mediaprovider.MediaItem) { if tr, ok := track.(*mediaprovider.Track); ok { n.artistName.BuildSegments(tr.ArtistNames, tr.ArtistIDs) 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.albumYear = strconv.Itoa(tr.Year) n.cover.PlaceholderIcon = myTheme.TracksIcon } else { n.artistName.BuildSegments([]string{}, []string{}) @@ -175,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) From d61a034afaa5ecda96b8b3bb161757a74c612a45 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 26 Nov 2025 11:20:27 -0800 Subject: [PATCH 5/5] update translation string key --- res/translations/de.json | 2 +- res/translations/en.json | 1 - res/translations/es.json | 2 +- res/translations/fr.json | 2 +- res/translations/it.json | 2 +- res/translations/ja.json | 2 +- res/translations/ko.json | 2 +- res/translations/nl.json | 2 +- res/translations/pl.json | 2 +- res/translations/pt_BR.json | 2 +- res/translations/ro.json | 2 +- res/translations/ru.json | 2 +- res/translations/zh.json | 2 +- res/translations/zhHans.json | 2 +- res/translations/zhHant.json | 2 +- 15 files changed, 14 insertions(+), 15 deletions(-) diff --git a/res/translations/de.json b/res/translations/de.json index b9e0ba2..fd16075 100644 --- a/res/translations/de.json +++ b/res/translations/de.json @@ -174,7 +174,7 @@ "Show info": "Info anzeigen", "Show notification on track change": "Benachrichtigung bei Titelwechsel anzeigen", "Show play queue": "Wiedergabeliste anzeigen", - "Show year in album grid cards": "Erscheinungsjahr in Alben-Übersicht anzeigen", + "Show year in album grid and now playing": "Erscheinungsjahr in Alben-Übersicht anzeigen", "Shuffle": "Zufallswiedergabe", "Shuffle albums": "Alben zufällig wiedergeben", "Shuffle tracks": "Titel zufällig wiedergeben", diff --git a/res/translations/en.json b/res/translations/en.json index 347efeb..352dff2 100644 --- a/res/translations/en.json +++ b/res/translations/en.json @@ -209,7 +209,6 @@ "Show info": "Show info", "Show notification on track change": "Show notification on track change", "Show play queue": "Show play queue", - "Show year in album grid cards": "Show year in album grid cards", "Show year in album grid and now playing": "Show year in album grid and now playing", "Shuffle": "Shuffle", "Shuffled": "Shuffled", diff --git a/res/translations/es.json b/res/translations/es.json index bb52125..ff2ad6e 100644 --- a/res/translations/es.json +++ b/res/translations/es.json @@ -182,7 +182,7 @@ "Show info": "Mostrar información", "Show notification on track change": "Mostrar notificación en cambio de pista", "Show play queue": "Mostrar cola de reproducción", - "Show year in album grid cards": "Mostrar año en tarjetas de cuadrícula de álbumes", + "Show year in album grid and now playing": "Mostrar año en tarjetas de cuadrícula de álbumes", "Shuffle": "Aleatorio", "Shuffle albums": "Aleatorio álbumes", "Shuffle tracks": "Aleatorio pistas", diff --git a/res/translations/fr.json b/res/translations/fr.json index 7dc1b94..02610a2 100644 --- a/res/translations/fr.json +++ b/res/translations/fr.json @@ -202,7 +202,7 @@ "Show info": "Afficher les informations", "Show notification on track change": "Afficher une notification à chaque changement de piste", "Show play queue": "Afficher la file d'attente", - "Show year in album grid cards": "Afficher les années sous les vignettes d'albums", + "Show year in album grid and now playing": "Afficher les années sous les vignettes d'albums", "Shuffle": "Mélanger", "Shuffled": "Mélangés", "Shuffle albums": "Mélanger les albums", diff --git a/res/translations/it.json b/res/translations/it.json index e6583ca..d9ac918 100644 --- a/res/translations/it.json +++ b/res/translations/it.json @@ -173,7 +173,7 @@ "Show info": "Mostra informazioni", "Show notification on track change": "Mostra notifica quando cambia la traccia", "Show play queue": "Mostra coda", - "Show year in album grid cards": "Mostra l'anno nella griglia degli album", + "Show year in album grid and now playing": "Mostra l'anno nella griglia degli album", "Shuffle": "Casuale", "Shuffle albums": "Album casuali", "Shuffle tracks": "Tracce casuali", diff --git a/res/translations/ja.json b/res/translations/ja.json index 6f9c21f..4a0c015 100644 --- a/res/translations/ja.json +++ b/res/translations/ja.json @@ -195,7 +195,7 @@ "Show info": "情報を表示", "Show notification on track change": "トラックの変更時に通知を表示する", "Show play queue": "再生キューを表示", - "Show year in album grid cards": "アルバムのグリッドカードに年を表示", + "Show year in album grid and now playing": "アルバムのグリッドカードに年を表示", "Shuffle": "シャッフル", "Shuffle albums": "アルバムをシャッフル", "Shuffle tracks": "トラックをシャッフル", diff --git a/res/translations/ko.json b/res/translations/ko.json index 4043aa1..a27226d 100644 --- a/res/translations/ko.json +++ b/res/translations/ko.json @@ -195,7 +195,7 @@ "Show info": "정보 표시", "Show notification on track change": "트랙 변경 시 알림 표시", "Show play queue": "대기열 표시", - "Show year in album grid cards": "앨범 그리드에서 연도를 표시", + "Show year in album grid and now playing": "앨범 그리드에서 연도를 표시", "Shuffle": "셔플", "Shuffle albums": "앨범 셔플하기", "Shuffle tracks": "트랙 셔플하기", diff --git a/res/translations/nl.json b/res/translations/nl.json index 20b2109..62d07cd 100644 --- a/res/translations/nl.json +++ b/res/translations/nl.json @@ -189,7 +189,7 @@ "Show info": "Toon info", "Show notification on track change": "Toon melding bij veranderen nummer", "Show play queue": "Toon afspeelwachtrij", - "Show year in album grid cards": "Geef jaar weer in album rooster", + "Show year in album grid and now playing": "Geef jaar weer in album rooster", "Shuffle": "Door mekaar smijten", "Shuffle albums": "Albums door mekaar smijten", "Shuffle tracks": "Nummers door mekaar smijten", diff --git a/res/translations/pl.json b/res/translations/pl.json index 26b299a..3cca007 100644 --- a/res/translations/pl.json +++ b/res/translations/pl.json @@ -185,7 +185,7 @@ "Show info": "Pokaż informacje", "Show notification on track change": "Pokaż powiadomienie o zmianie ścieżki", "Show play queue": "Pokaż kolejkę odtwarzania", - "Show year in album grid cards": "Pokaż rok w zakładce albumu", + "Show year in album grid and now playing": "Pokaż rok w zakładce albumu", "Shuffle": "Wymieszaj", "Shuffle albums": "Wymieszaj album", "Shuffle tracks": "Wymieszaj ścieżki", diff --git a/res/translations/pt_BR.json b/res/translations/pt_BR.json index 5247a52..7103ebd 100644 --- a/res/translations/pt_BR.json +++ b/res/translations/pt_BR.json @@ -191,7 +191,7 @@ "Show info": "Mostrar informações", "Show notification on track change": "Mostrar notificação ao mudar de faixa", "Show play queue": "Mostrar fila de reprodução", - "Show year in album grid cards": "Mostrar ano nos cartões da grade de álbuns", + "Show year in album grid and now playing": "Mostrar ano nos cartões da grade de álbuns", "Shuffle": "Aleatório", "Shuffle albums": "Álbuns em ordem aleatória", "Shuffle tracks": "Faixas em ordem aleatória", diff --git a/res/translations/ro.json b/res/translations/ro.json index 7f0f1f3..fa705c0 100644 --- a/res/translations/ro.json +++ b/res/translations/ro.json @@ -165,7 +165,7 @@ "Show": "Arată", "Show info": "Arată informații", "Show notification on track change": "Arată notificare la schimbarea melodiei", - "Show year in album grid cards": "Arată anul în gridul de albume", + "Show year in album grid and now playing": "Arată anul în gridul de albume", "Shuffle": "Amestecare", "Shuffle albums": "Amestecă albume", "Shuffle tracks": "Amestecă melodii", diff --git a/res/translations/ru.json b/res/translations/ru.json index 21203f0..a19f1b0 100644 --- a/res/translations/ru.json +++ b/res/translations/ru.json @@ -197,7 +197,7 @@ "Show info": "Информация", "Show notification on track change": "Уведомлять при смене композиции", "Show play queue": "Очередь воспроизведения", - "Show year in album grid cards": "Показывать год на карточках альбомов", + "Show year in album grid and now playing": "Показывать год на карточках альбомов", "Shuffle": "Вперемешку", "Shuffle albums": "Перемешать альбомы", "Shuffle tracks": "Перемешать композиции", diff --git a/res/translations/zh.json b/res/translations/zh.json index 3a51252..0e55bc8 100644 --- a/res/translations/zh.json +++ b/res/translations/zh.json @@ -195,7 +195,7 @@ "Show info": "显示信息", "Show notification on track change": "曲目更改时显示通知", "Show play queue": "显示播放队列", - "Show year in album grid cards": "在专辑网格卡中显示年份", + "Show year in album grid and now playing": "在专辑网格卡中显示年份", "Shuffle": "随机播放", "Shuffle albums": "随机播放专辑", "Shuffle tracks": "随机播放曲目", diff --git a/res/translations/zhHans.json b/res/translations/zhHans.json index 3a51252..0e55bc8 100644 --- a/res/translations/zhHans.json +++ b/res/translations/zhHans.json @@ -195,7 +195,7 @@ "Show info": "显示信息", "Show notification on track change": "曲目更改时显示通知", "Show play queue": "显示播放队列", - "Show year in album grid cards": "在专辑网格卡中显示年份", + "Show year in album grid and now playing": "在专辑网格卡中显示年份", "Shuffle": "随机播放", "Shuffle albums": "随机播放专辑", "Shuffle tracks": "随机播放曲目", diff --git a/res/translations/zhHant.json b/res/translations/zhHant.json index ba70d9f..26a8842 100644 --- a/res/translations/zhHant.json +++ b/res/translations/zhHant.json @@ -165,7 +165,7 @@ "Show": "顯示", "Show info": "顯示資訊", "Show notification on track change": "曲目更改時顯示通知", - "Show year in album grid cards": "在專輯網格卡中顯示年份", + "Show year in album grid and now playing": "在專輯網格卡中顯示年份", "Shuffle": "隨機播放", "Shuffle albums": "隨機播放專輯", "Shuffle tracks": "隨機播放曲目",