add saving of tracklist sort in browsing history - but need to handle it Tracklist widget still
This commit is contained in:
@@ -34,6 +34,7 @@ type AlbumPage struct {
|
||||
|
||||
type albumPageState struct {
|
||||
albumID string
|
||||
sort widgets.TracklistSort
|
||||
cfg *backend.AlbumPageConfig
|
||||
mp mediaprovider.MediaProvider
|
||||
pm *backend.PlaybackManager
|
||||
@@ -48,6 +49,18 @@ func NewAlbumPage(
|
||||
mp mediaprovider.MediaProvider,
|
||||
im *backend.ImageManager,
|
||||
contr *controller.Controller,
|
||||
) *AlbumPage {
|
||||
return newAlbumPage(albumID, cfg, pm, mp, im, contr, widgets.TracklistSort{})
|
||||
}
|
||||
|
||||
func newAlbumPage(
|
||||
albumID string,
|
||||
cfg *backend.AlbumPageConfig,
|
||||
pm *backend.PlaybackManager,
|
||||
mp mediaprovider.MediaProvider,
|
||||
im *backend.ImageManager,
|
||||
contr *controller.Controller,
|
||||
sort widgets.TracklistSort,
|
||||
) *AlbumPage {
|
||||
a := &AlbumPage{
|
||||
albumPageState: albumPageState{
|
||||
@@ -63,6 +76,7 @@ func NewAlbumPage(
|
||||
a.header = NewAlbumPageHeader(a)
|
||||
a.tracklist = widgets.NewTracklist(nil)
|
||||
a.tracklist.SetVisibleColumns(a.cfg.TracklistColumns)
|
||||
a.tracklist.SetSorting(sort)
|
||||
a.tracklist.OnVisibleColumnsChanged = func(cols []string) {
|
||||
a.cfg.TracklistColumns = cols
|
||||
}
|
||||
@@ -82,6 +96,7 @@ func (a *AlbumPage) CreateRenderer() fyne.WidgetRenderer {
|
||||
|
||||
func (a *AlbumPage) Save() SavedPage {
|
||||
s := a.albumPageState
|
||||
s.sort = a.tracklist.Sorting()
|
||||
return &s
|
||||
}
|
||||
|
||||
@@ -262,5 +277,5 @@ func formatMiscLabelStr(a *mediaprovider.AlbumWithTracks) string {
|
||||
}
|
||||
|
||||
func (s *albumPageState) Restore() Page {
|
||||
return NewAlbumPage(s.albumID, s.cfg, s.pm, s.mp, s.im, s.contr)
|
||||
return newAlbumPage(s.albumID, s.cfg, s.pm, s.mp, s.im, s.contr, s.sort)
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ var _ fyne.Widget = (*ArtistPage)(nil)
|
||||
type artistPageState struct {
|
||||
artistID string
|
||||
activeView int
|
||||
trackSort widgets.TracklistSort
|
||||
|
||||
cfg *backend.ArtistPageConfig
|
||||
pm *backend.PlaybackManager
|
||||
@@ -54,10 +55,10 @@ func NewArtistPage(artistID string, cfg *backend.ArtistPageConfig, pm *backend.P
|
||||
if cfg.InitialView == "Top Tracks" {
|
||||
activeView = 1
|
||||
}
|
||||
return newArtistPage(artistID, cfg, pm, mp, im, contr, activeView)
|
||||
return newArtistPage(artistID, cfg, pm, mp, im, contr, activeView, widgets.TracklistSort{})
|
||||
}
|
||||
|
||||
func newArtistPage(artistID string, cfg *backend.ArtistPageConfig, pm *backend.PlaybackManager, mp mediaprovider.MediaProvider, im *backend.ImageManager, contr *controller.Controller, activeView int) *ArtistPage {
|
||||
func newArtistPage(artistID string, cfg *backend.ArtistPageConfig, pm *backend.PlaybackManager, mp mediaprovider.MediaProvider, im *backend.ImageManager, contr *controller.Controller, activeView int, sort widgets.TracklistSort) *ArtistPage {
|
||||
a := &ArtistPage{artistPageState: artistPageState{
|
||||
artistID: artistID,
|
||||
cfg: cfg,
|
||||
@@ -112,6 +113,9 @@ func (a *ArtistPage) Reload() {
|
||||
|
||||
func (a *ArtistPage) Save() SavedPage {
|
||||
s := a.artistPageState
|
||||
if a.tracklistCtr != nil {
|
||||
s.trackSort = a.tracklistCtr.Objects[0].(*widgets.Tracklist).Sorting()
|
||||
}
|
||||
return &s
|
||||
}
|
||||
|
||||
@@ -197,6 +201,7 @@ func (a *ArtistPage) showTopTracks() {
|
||||
tl := widgets.NewTracklist(ts)
|
||||
tl.AutoNumber = true
|
||||
tl.SetVisibleColumns(a.cfg.TracklistColumns)
|
||||
tl.SetSorting(a.trackSort)
|
||||
tl.OnVisibleColumnsChanged = func(cols []string) {
|
||||
a.cfg.TracklistColumns = cols
|
||||
}
|
||||
@@ -232,7 +237,7 @@ func (a *ArtistPage) CreateRenderer() fyne.WidgetRenderer {
|
||||
}
|
||||
|
||||
func (s *artistPageState) Restore() Page {
|
||||
return newArtistPage(s.artistID, s.cfg, s.pm, s.mp, s.im, s.contr, s.activeView)
|
||||
return newArtistPage(s.artistID, s.cfg, s.pm, s.mp, s.im, s.contr, s.activeView, s.trackSort)
|
||||
}
|
||||
|
||||
type ArtistPageHeader struct {
|
||||
|
||||
@@ -27,6 +27,7 @@ type FavoritesPage struct {
|
||||
im *backend.ImageManager
|
||||
mp mediaprovider.MediaProvider
|
||||
|
||||
trackSort widgets.TracklistSort
|
||||
filter mediaprovider.AlbumFilter
|
||||
searchText string
|
||||
nowPlayingID string
|
||||
@@ -102,6 +103,7 @@ func restoreFavoritesPage(saved *savedFavoritesPage) *FavoritesPage {
|
||||
im: saved.im,
|
||||
searchText: saved.searchText,
|
||||
filter: saved.filter,
|
||||
trackSort: saved.trackSort,
|
||||
}
|
||||
a.ExtendBaseWidget(a)
|
||||
a.createHeader(saved.activeToggleBtn)
|
||||
@@ -188,6 +190,9 @@ func (a *FavoritesPage) Save() SavedPage {
|
||||
if a.searchGrid != nil {
|
||||
sf.searchGridState = a.searchGrid.SaveToState()
|
||||
}
|
||||
if a.tracklistCtr != nil {
|
||||
sf.trackSort = a.tracklistCtr.Objects[0].(*widgets.Tracklist).Sorting()
|
||||
}
|
||||
return sf
|
||||
}
|
||||
|
||||
@@ -324,6 +329,7 @@ func (a *FavoritesPage) onShowFavoriteSongs() {
|
||||
tracklist := widgets.NewTracklist(fav.Tracks)
|
||||
tracklist.AutoNumber = true
|
||||
tracklist.SetVisibleColumns(a.cfg.TracklistColumns)
|
||||
tracklist.SetSorting(a.trackSort)
|
||||
tracklist.OnVisibleColumnsChanged = func(cols []string) {
|
||||
a.cfg.TracklistColumns = cols
|
||||
}
|
||||
@@ -358,6 +364,7 @@ type savedFavoritesPage struct {
|
||||
filter mediaprovider.AlbumFilter
|
||||
searchText string
|
||||
activeToggleBtn int
|
||||
trackSort widgets.TracklistSort
|
||||
}
|
||||
|
||||
func (s *savedFavoritesPage) Restore() Page {
|
||||
|
||||
@@ -39,6 +39,7 @@ type playlistPageState struct {
|
||||
sm *backend.ServerManager
|
||||
pm *backend.PlaybackManager
|
||||
im *backend.ImageManager
|
||||
trackSort widgets.TracklistSort
|
||||
}
|
||||
|
||||
func NewPlaylistPage(
|
||||
@@ -48,12 +49,25 @@ func NewPlaylistPage(
|
||||
sm *backend.ServerManager,
|
||||
pm *backend.PlaybackManager,
|
||||
im *backend.ImageManager,
|
||||
) *PlaylistPage {
|
||||
return newPlaylistPage(playlistID, conf, contr, sm, pm, im, widgets.TracklistSort{})
|
||||
}
|
||||
|
||||
func newPlaylistPage(
|
||||
playlistID string,
|
||||
conf *backend.PlaylistPageConfig,
|
||||
contr *controller.Controller,
|
||||
sm *backend.ServerManager,
|
||||
pm *backend.PlaybackManager,
|
||||
im *backend.ImageManager,
|
||||
trackSort widgets.TracklistSort,
|
||||
) *PlaylistPage {
|
||||
a := &PlaylistPage{playlistPageState: playlistPageState{playlistID: playlistID, conf: conf, contr: contr, sm: sm, pm: pm, im: im}}
|
||||
a.ExtendBaseWidget(a)
|
||||
a.header = NewPlaylistPageHeader(a)
|
||||
a.tracklist = widgets.NewTracklist(nil)
|
||||
a.tracklist.SetVisibleColumns(conf.TracklistColumns)
|
||||
a.tracklist.SetSorting(trackSort)
|
||||
a.tracklist.OnVisibleColumnsChanged = func(cols []string) {
|
||||
conf.TracklistColumns = cols
|
||||
}
|
||||
@@ -83,6 +97,7 @@ func (a *PlaylistPage) CreateRenderer() fyne.WidgetRenderer {
|
||||
|
||||
func (a *PlaylistPage) Save() SavedPage {
|
||||
p := a.playlistPageState
|
||||
p.trackSort = a.tracklist.Sorting()
|
||||
return &p
|
||||
}
|
||||
|
||||
@@ -284,5 +299,5 @@ func (a *PlaylistPageHeader) formatPlaylistTrackTimeStr(p *mediaprovider.Playlis
|
||||
}
|
||||
|
||||
func (s *playlistPageState) Restore() Page {
|
||||
return NewPlaylistPage(s.playlistID, s.conf, s.contr, s.sm, s.pm, s.im)
|
||||
return newPlaylistPage(s.playlistID, s.conf, s.contr, s.sm, s.pm, s.im, s.trackSort)
|
||||
}
|
||||
|
||||
+27
-16
@@ -42,6 +42,11 @@ var columns = []string{
|
||||
ColumnFavorite, ColumnRating, ColumnPlays, ColumnBitrate, ColumnSize, ColumnPath,
|
||||
}
|
||||
|
||||
type TracklistSort struct {
|
||||
SortOrder ColumnSort
|
||||
ColumnName string
|
||||
}
|
||||
|
||||
type Tracklist struct {
|
||||
widget.BaseWidget
|
||||
|
||||
@@ -80,6 +85,7 @@ type Tracklist struct {
|
||||
OnTrackShown func(tracknum int)
|
||||
|
||||
visibleColumns []bool
|
||||
sorting TracklistSort
|
||||
|
||||
tracksMutex sync.RWMutex
|
||||
tracks []*mediaprovider.Track
|
||||
@@ -103,7 +109,7 @@ func NewTracklist(tracks []*mediaprovider.Track) *Tracklist {
|
||||
t.colLayout = layouts.NewColumnsLayout([]float32{40, -1, -1, -1, 60, 60, 55, 100, 65, 75, 75, -1})
|
||||
t.buildHeader()
|
||||
t.hdr.OnColumnSortChanged = func(idx int, sort ColumnSort) {
|
||||
t.SortByColumn(colName(idx), sort)
|
||||
t.SetSorting(TracklistSort{ColumnName: colName(idx), SortOrder: sort})
|
||||
}
|
||||
t.hdr.OnColumnVisibilityChanged = t.setColumnVisible
|
||||
t.hdr.OnColumnVisibilityMenuShown = func(pop *widget.PopUp) {
|
||||
@@ -229,48 +235,53 @@ func (t *Tracklist) intSort(fieldFn func(*mediaprovider.Track) int64, sortOrder
|
||||
t.tracks = new
|
||||
}
|
||||
|
||||
func (t *Tracklist) SortByColumn(columnName string, sortOrder ColumnSort) {
|
||||
func (t *Tracklist) Sorting() TracklistSort {
|
||||
return t.sorting
|
||||
}
|
||||
|
||||
func (t *Tracklist) SetSorting(sorting TracklistSort) {
|
||||
t.sorting = sorting
|
||||
t.tracksMutex.Lock()
|
||||
if sortOrder == SortNone {
|
||||
if sorting.SortOrder == SortNone {
|
||||
t.tracks = t.tracksOrigOrder
|
||||
t.tracksMutex.Unlock()
|
||||
t.Refresh()
|
||||
return
|
||||
}
|
||||
switch columnName {
|
||||
switch sorting.ColumnName {
|
||||
case ColumnNum:
|
||||
if sortOrder == SortDescending {
|
||||
if sorting.SortOrder == SortDescending {
|
||||
t.tracks = sharedutil.Reversed(t.tracksOrigOrder)
|
||||
} else {
|
||||
t.tracks = t.tracksOrigOrder
|
||||
}
|
||||
case ColumnTitle:
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.Name }, sortOrder)
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.Name }, sorting.SortOrder)
|
||||
case ColumnArtist:
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.ArtistNames[0] }, sortOrder)
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.ArtistNames[0] }, sorting.SortOrder)
|
||||
case ColumnAlbum:
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.Album }, sortOrder)
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.Album }, sorting.SortOrder)
|
||||
case ColumnPath:
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.FilePath }, sortOrder)
|
||||
t.stringSort(func(tr *mediaprovider.Track) string { return tr.FilePath }, sorting.SortOrder)
|
||||
case ColumnRating:
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.Rating) }, sortOrder)
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.Rating) }, sorting.SortOrder)
|
||||
case ColumnTime:
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.Duration) }, sortOrder)
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.Duration) }, sorting.SortOrder)
|
||||
case ColumnYear:
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.Year) }, sortOrder)
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.Year) }, sorting.SortOrder)
|
||||
case ColumnSize:
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return tr.Size }, sortOrder)
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return tr.Size }, sorting.SortOrder)
|
||||
case ColumnPlays:
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.PlayCount) }, sortOrder)
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.PlayCount) }, sorting.SortOrder)
|
||||
case ColumnBitrate:
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.BitRate) }, sortOrder)
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 { return int64(tr.BitRate) }, sorting.SortOrder)
|
||||
case ColumnFavorite:
|
||||
t.intSort(func(tr *mediaprovider.Track) int64 {
|
||||
if tr.Favorite {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}, sortOrder)
|
||||
}, sorting.SortOrder)
|
||||
}
|
||||
t.tracksMutex.Unlock()
|
||||
t.Refresh()
|
||||
|
||||
Reference in New Issue
Block a user