favorite songs view auto-number and show now playing track
This commit is contained in:
@@ -20,18 +20,21 @@ import (
|
|||||||
type FavoritesPage struct {
|
type FavoritesPage struct {
|
||||||
widget.BaseWidget
|
widget.BaseWidget
|
||||||
|
|
||||||
contr controller.Controller
|
contr controller.Controller
|
||||||
pm *backend.PlaybackManager
|
pm *backend.PlaybackManager
|
||||||
im *backend.ImageManager
|
im *backend.ImageManager
|
||||||
sm *backend.ServerManager
|
sm *backend.ServerManager
|
||||||
lm *backend.LibraryManager
|
lm *backend.LibraryManager
|
||||||
nav func(Route)
|
nav func(Route)
|
||||||
|
|
||||||
|
searchText string
|
||||||
|
nowPlayingID string
|
||||||
|
|
||||||
grid *widgets.AlbumGrid
|
grid *widgets.AlbumGrid
|
||||||
searchGrid *widgets.AlbumGrid
|
searchGrid *widgets.AlbumGrid
|
||||||
artistListCtr *fyne.Container
|
artistListCtr *fyne.Container
|
||||||
tracklistCtr *fyne.Container
|
tracklistCtr *fyne.Container
|
||||||
searcher *widgets.Searcher
|
searcher *widgets.Searcher
|
||||||
searchText string
|
|
||||||
titleDisp *widget.RichText
|
titleDisp *widget.RichText
|
||||||
toggleBtns *widgets.ToggleButtonGroup
|
toggleBtns *widgets.ToggleButtonGroup
|
||||||
container *fyne.Container
|
container *fyne.Container
|
||||||
@@ -161,6 +164,18 @@ func (a *FavoritesPage) OnSearched(query string) {
|
|||||||
a.doSearchAlbums(query)
|
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) {
|
func (a *FavoritesPage) doSearchAlbums(query string) {
|
||||||
iter := a.lm.SearchIterWithFilter(query, func(al *subsonic.AlbumID3) bool {
|
iter := a.lm.SearchIterWithFilter(query, func(al *subsonic.AlbumID3) bool {
|
||||||
return al.Starred.After(time.Time{})
|
return al.Starred.After(time.Time{})
|
||||||
@@ -230,8 +245,10 @@ func (a *FavoritesPage) onShowFavoriteSongs() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
tracklist := widgets.NewTracklist(s.Song)
|
tracklist := widgets.NewTracklist(s.Song)
|
||||||
|
tracklist.AutoNumber = true
|
||||||
// TODO: get visible columns from config
|
// TODO: get visible columns from config
|
||||||
tracklist.SetVisibleColumns([]string{"Artist", "Album", "Plays"})
|
tracklist.SetVisibleColumns([]string{"Artist", "Album", "Plays"})
|
||||||
|
tracklist.SetNowPlaying(a.nowPlayingID)
|
||||||
a.contr.ConnectTracklistActions(tracklist)
|
a.contr.ConnectTracklistActions(tracklist)
|
||||||
a.tracklistCtr = container.New(
|
a.tracklistCtr = container.New(
|
||||||
&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 5, PadBottom: 15},
|
&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 5, PadBottom: 15},
|
||||||
|
|||||||
+26
-7
@@ -323,6 +323,7 @@ type TrackRow struct {
|
|||||||
// internal state
|
// internal state
|
||||||
tracklist *Tracklist
|
tracklist *Tracklist
|
||||||
trackIdx int
|
trackIdx int
|
||||||
|
trackNum int
|
||||||
trackID string
|
trackID string
|
||||||
isPlaying bool
|
isPlaying bool
|
||||||
isFavorite 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) {
|
func (t *TrackRow) Update(tr *subsonic.Child, isPlaying bool, rowNum int) {
|
||||||
if tr.ID != t.trackID || isPlaying != t.isPlaying || tr.PlayCount != t.playCount {
|
// Update info that can change if this row is bound to
|
||||||
t.isPlaying = isPlaying
|
// a new track (*subsonic.Child)
|
||||||
|
if tr.ID != t.trackID {
|
||||||
t.trackID = tr.ID
|
t.trackID = tr.ID
|
||||||
t.playCount = tr.PlayCount
|
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.name.Segments[0].(*widget.TextSegment).Text = tr.Title
|
||||||
t.artist.Segments[0].(*widget.TextSegment).Text = tr.Artist
|
t.artist.Segments[0].(*widget.TextSegment).Text = tr.Artist
|
||||||
t.album.Segments[0].(*widget.TextSegment).Text = tr.Album
|
t.album.Segments[0].(*widget.TextSegment).Text = tr.Album
|
||||||
t.dur.Segments[0].(*widget.TextSegment).Text = util.SecondsToTimeString(float64(tr.Duration))
|
t.dur.Segments[0].(*widget.TextSegment).Text = util.SecondsToTimeString(float64(tr.Duration))
|
||||||
t.year.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(tr.Year)
|
t.year.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(tr.Year)
|
||||||
|
|
||||||
t.plays.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(int(tr.PlayCount))
|
t.plays.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(int(tr.PlayCount))
|
||||||
t.bitrate.Segments[0].(*widget.TextSegment).Text = strconv.Itoa(tr.BitRate)
|
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.name.Segments[0].(*widget.TextSegment).Style.TextStyle.Bold = isPlaying
|
||||||
t.artist.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
|
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 {
|
if tr.Starred.IsZero() && t.isFavorite {
|
||||||
t.isFavorite = false
|
t.isFavorite = false
|
||||||
t.favorite.Objects[0].(*TappableIcon).Resource = res.ResHeartOutlineInvertPng
|
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
|
t.favorite.Objects[0].(*TappableIcon).Resource = res.ResHeartFilledInvertPng
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Show only columns configured to be visible
|
||||||
t.artist.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnArtist)]
|
t.artist.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnArtist)]
|
||||||
t.album.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnAlbum)]
|
t.album.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnAlbum)]
|
||||||
t.dur.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnTime)]
|
t.dur.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnTime)]
|
||||||
|
|||||||
Reference in New Issue
Block a user