diff --git a/ui/browsing/favoritespage.go b/ui/browsing/favoritespage.go index 64d8949..8124940 100644 --- a/ui/browsing/favoritespage.go +++ b/ui/browsing/favoritespage.go @@ -20,18 +20,21 @@ import ( type FavoritesPage struct { widget.BaseWidget - contr controller.Controller - pm *backend.PlaybackManager - im *backend.ImageManager - sm *backend.ServerManager - lm *backend.LibraryManager - nav func(Route) + contr controller.Controller + pm *backend.PlaybackManager + im *backend.ImageManager + sm *backend.ServerManager + lm *backend.LibraryManager + nav func(Route) + + searchText string + nowPlayingID string + grid *widgets.AlbumGrid searchGrid *widgets.AlbumGrid artistListCtr *fyne.Container tracklistCtr *fyne.Container searcher *widgets.Searcher - searchText string titleDisp *widget.RichText toggleBtns *widgets.ToggleButtonGroup container *fyne.Container @@ -161,6 +164,18 @@ func (a *FavoritesPage) OnSearched(query string) { a.doSearchAlbums(query) } +var _ CanShowNowPlaying = (*FavoritesPage)(nil) + +func (a *FavoritesPage) OnSongChange(song *subsonic.Child) { + a.nowPlayingID = "" + if song != nil { + a.nowPlayingID = song.ID + } + if a.tracklistCtr != nil { + a.tracklistCtr.Objects[0].(*widgets.Tracklist).SetNowPlaying(a.nowPlayingID) + } +} + func (a *FavoritesPage) doSearchAlbums(query string) { iter := a.lm.SearchIterWithFilter(query, func(al *subsonic.AlbumID3) bool { return al.Starred.After(time.Time{}) @@ -230,8 +245,10 @@ func (a *FavoritesPage) onShowFavoriteSongs() { return } tracklist := widgets.NewTracklist(s.Song) + tracklist.AutoNumber = true // TODO: get visible columns from config tracklist.SetVisibleColumns([]string{"Artist", "Album", "Plays"}) + tracklist.SetNowPlaying(a.nowPlayingID) a.contr.ConnectTracklistActions(tracklist) a.tracklistCtr = container.New( &layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 5, PadBottom: 15}, diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index b70b075..8f76c5a 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -323,6 +323,7 @@ type TrackRow struct { // internal state tracklist *Tracklist trackIdx int + trackNum int trackID string isPlaying bool isFavorite bool @@ -380,24 +381,40 @@ func NewTrackRow(tracklist *Tracklist, playingIcon fyne.CanvasObject) *TrackRow } func (t *TrackRow) Update(tr *subsonic.Child, isPlaying bool, rowNum int) { - if tr.ID != t.trackID || isPlaying != t.isPlaying || tr.PlayCount != t.playCount { - t.isPlaying = isPlaying + // Update info that can change if this row is bound to + // a new track (*subsonic.Child) + if tr.ID != t.trackID { t.trackID = tr.ID t.playCount = tr.PlayCount - if rowNum < 0 { - rowNum = tr.Track - } - t.num.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(rowNum) t.name.Segments[0].(*widget.TextSegment).Text = tr.Title t.artist.Segments[0].(*widget.TextSegment).Text = tr.Artist t.album.Segments[0].(*widget.TextSegment).Text = tr.Album t.dur.Segments[0].(*widget.TextSegment).Text = util.SecondsToTimeString(float64(tr.Duration)) t.year.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(tr.Year) - t.plays.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(int(tr.PlayCount)) t.bitrate.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(tr.BitRate) + } + // Update track num if needed + // (which can change based on bound *subsonic.Child or tracklist.AutoNumber) + if t.trackNum != rowNum { + if rowNum < 0 { + rowNum = tr.Track + } + t.trackNum = rowNum + t.num.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(rowNum) + } + + // Update play count if needed + if tr.PlayCount != t.playCount { + t.playCount = tr.PlayCount + t.plays.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(int(tr.PlayCount)) + } + + // Render whether track is playing or not + if isPlaying != t.isPlaying { + t.isPlaying = isPlaying t.name.Segments[0].(*widget.TextSegment).Style.TextStyle.Bold = isPlaying t.artist.Segments[0].(*widget.TextSegment).Style.TextStyle.Bold = isPlaying t.album.Segments[0].(*widget.TextSegment).Style.TextStyle.Bold = isPlaying @@ -413,6 +430,7 @@ func (t *TrackRow) Update(tr *subsonic.Child, isPlaying bool, rowNum int) { } } + // Render favorite column if tr.Starred.IsZero() && t.isFavorite { t.isFavorite = false t.favorite.Objects[0].(*TappableIcon).Resource = res.ResHeartOutlineInvertPng @@ -421,6 +439,7 @@ func (t *TrackRow) Update(tr *subsonic.Child, isPlaying bool, rowNum int) { t.favorite.Objects[0].(*TappableIcon).Resource = res.ResHeartFilledInvertPng } + // Show only columns configured to be visible t.artist.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnArtist)] t.album.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnAlbum)] t.dur.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnTime)]