From 84e1f01a68dc05b2dac8621f3ce45a567d1c4ae2 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sun, 21 May 2023 21:16:22 -0700 Subject: [PATCH] add saving of tracklist sort in browsing history - but need to handle it Tracklist widget still --- ui/browsing/albumpage.go | 17 +++++++++++++- ui/browsing/artistpage.go | 11 ++++++--- ui/browsing/favoritespage.go | 7 ++++++ ui/browsing/playlistpage.go | 17 +++++++++++++- ui/widgets/tracklist.go | 43 ++++++++++++++++++++++-------------- 5 files changed, 74 insertions(+), 21 deletions(-) diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index 8135342..4faf619 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -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) } diff --git a/ui/browsing/artistpage.go b/ui/browsing/artistpage.go index e1a4c95..5cd5e20 100644 --- a/ui/browsing/artistpage.go +++ b/ui/browsing/artistpage.go @@ -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 { diff --git a/ui/browsing/favoritespage.go b/ui/browsing/favoritespage.go index 1201fe4..7acab39 100644 --- a/ui/browsing/favoritespage.go +++ b/ui/browsing/favoritespage.go @@ -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 { diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index 42420d4..b18dca8 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -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) } diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index 603fdde..3f27130 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -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()