From 37928881c0f4b7cbc65e48f19c2412cfc6081671 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Thu, 2 Mar 2023 20:49:00 -0800 Subject: [PATCH] Albums page: remember last sort order --- backend/config.go | 8 ++++++++ sharedutil/sharedutil.go | 9 +++++++++ ui/browsing/albumspage.go | 28 ++++++++++++++++------------ ui/browsing/router.go | 2 +- ui/controller/routes.go | 6 ++---- ui/mainwindow.go | 4 ++-- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/backend/config.go b/backend/config.go index dbe0930..dd26556 100644 --- a/backend/config.go +++ b/backend/config.go @@ -24,6 +24,10 @@ type AlbumPageConfig struct { TracklistColumns []string } +type AlbumsPageConfig struct { + SortOrder string +} + type FavoritesPageConfig struct { InitialView string TracklistColumns []string @@ -45,6 +49,7 @@ type Config struct { Application AppConfig Servers []*ServerConfig AlbumPage AlbumPageConfig + AlbumsPage AlbumsPageConfig FavoritesPage FavoritesPageConfig NowPlayingPage NowPlayingPageConfig PlaylistPage PlaylistPageConfig @@ -60,6 +65,9 @@ func DefaultConfig() *Config { AlbumPage: AlbumPageConfig{ TracklistColumns: []string{"Artist", "Time", "Plays", "Favorite"}, }, + AlbumsPage: AlbumsPageConfig{ + SortOrder: string(AlbumSortRecentlyAdded), + }, FavoritesPage: FavoritesPageConfig{ TracklistColumns: []string{"Artist", "Album", "Time", "Plays"}, InitialView: "Albums", diff --git a/sharedutil/sharedutil.go b/sharedutil/sharedutil.go index 158aaa4..6966a23 100644 --- a/sharedutil/sharedutil.go +++ b/sharedutil/sharedutil.go @@ -2,6 +2,15 @@ package sharedutil import "github.com/dweymouth/go-subsonic/subsonic" +func StringSliceContains(slice []string, str string) bool { + for _, s := range slice { + if s == str { + return true + } + } + return false +} + func FindTrackByID(id string, tracks []*subsonic.Child) *subsonic.Child { for _, tr := range tracks { if id == tr.ID { diff --git a/ui/browsing/albumspage.go b/ui/browsing/albumspage.go index ac00a30..ae9ee5f 100644 --- a/ui/browsing/albumspage.go +++ b/ui/browsing/albumspage.go @@ -2,6 +2,7 @@ package browsing import ( "supersonic/backend" + "supersonic/sharedutil" "supersonic/ui/controller" "supersonic/ui/widgets" @@ -17,7 +18,7 @@ var _ fyne.Widget = (*AlbumsPage)(nil) type AlbumsPage struct { widget.BaseWidget - title string + cfg *backend.AlbumsPageConfig contr controller.Controller pm *backend.PlaybackManager im *backend.ImageManager @@ -52,9 +53,9 @@ func (s *selectWidget) MinSize() fyne.Size { return fyne.NewSize(170, s.height) } -func NewAlbumsPage(title string, sortOrder string, contr controller.Controller, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *AlbumsPage { +func NewAlbumsPage(cfg *backend.AlbumsPageConfig, contr controller.Controller, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *AlbumsPage { a := &AlbumsPage{ - title: title, + cfg: cfg, contr: contr, pm: pm, lm: lm, @@ -62,13 +63,15 @@ func NewAlbumsPage(title string, sortOrder string, contr controller.Controller, } a.ExtendBaseWidget(a) - a.titleDisp = widget.NewRichTextWithText(title) + a.titleDisp = widget.NewRichTextWithText("Albums") a.titleDisp.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ SizeName: theme.SizeNameHeadingText, } - a.sortOrder = NewSelect(backend.AlbumSortOrders, nil) - a.sortOrder.Selected = sortOrder - a.sortOrder.OnChanged = a.onSortOrderChanged + a.sortOrder = NewSelect(backend.AlbumSortOrders, a.onSortOrderChanged) + if !sharedutil.StringSliceContains(backend.AlbumSortOrders, cfg.SortOrder) { + cfg.SortOrder = string(backend.AlbumSortRecentlyAdded) + } + a.sortOrder.Selected = cfg.SortOrder iter := lm.AlbumsIter(backend.AlbumSortOrder(a.sortOrder.Selected)) a.grid = widgets.NewAlbumGrid(iter, im, false /*showYear*/) a.grid.OnPlayAlbum = a.onPlayAlbum @@ -99,7 +102,7 @@ func (a *AlbumsPage) createContainer(searchgrid bool) { func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage { a := &AlbumsPage{ - title: saved.title, + cfg: saved.cfg, contr: saved.contr, pm: saved.pm, lm: saved.lm, @@ -107,7 +110,7 @@ func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage { } a.ExtendBaseWidget(a) - a.titleDisp = widget.NewRichTextWithText(a.title) + a.titleDisp = widget.NewRichTextWithText("Albums") a.titleDisp.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ SizeName: theme.SizeNameHeadingText, } @@ -140,7 +143,7 @@ func (a *AlbumsPage) OnSearched(query string) { } func (a *AlbumsPage) Route() controller.Route { - return controller.AlbumsRoute(backend.AlbumSortOrder(a.sortOrder.Selected)) + return controller.AlbumsRoute() } var _ Searchable = (*AlbumsPage)(nil) @@ -160,7 +163,7 @@ func (a *AlbumsPage) Reload() { func (a *AlbumsPage) Save() SavedPage { sa := &savedAlbumsPage{ - title: a.title, + cfg: a.cfg, contr: a.contr, pm: a.pm, lm: a.lm, @@ -201,6 +204,7 @@ func (a *AlbumsPage) onShowAlbumPage(albumID string) { } func (a *AlbumsPage) onSortOrderChanged(order string) { + a.cfg.SortOrder = a.sortOrder.Selected a.grid.Reset(a.lm.AlbumsIter(backend.AlbumSortOrder(order))) if a.searchText == "" { a.container.Objects[0] = a.grid @@ -214,8 +218,8 @@ func (a *AlbumsPage) CreateRenderer() fyne.WidgetRenderer { } type savedAlbumsPage struct { - title string searchText string + cfg *backend.AlbumsPageConfig contr controller.Controller pm *backend.PlaybackManager lm *backend.LibraryManager diff --git a/ui/browsing/router.go b/ui/browsing/router.go index 706d707..59e8d4e 100644 --- a/ui/browsing/router.go +++ b/ui/browsing/router.go @@ -29,7 +29,7 @@ func (r Router) CreatePage(rte controller.Route) Page { case controller.Album: return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.App.ServerManager, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, *r.Controller) case controller.Albums: - return NewAlbumsPage("Albums", rte.Arg, *r.Controller, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) + return NewAlbumsPage(&r.App.Config.AlbumsPage, *r.Controller, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager) case controller.Artist: return NewArtistPage(rte.Arg, r.App.PlaybackManager, r.App.ServerManager, r.App.ImageManager, *r.Controller) case controller.Artists: diff --git a/ui/controller/routes.go b/ui/controller/routes.go index 78f73a9..d50a4df 100644 --- a/ui/controller/routes.go +++ b/ui/controller/routes.go @@ -1,7 +1,5 @@ package controller -import "supersonic/backend" - type PageName int const ( @@ -23,8 +21,8 @@ type Route struct { Arg string } -func AlbumsRoute(sortOrder backend.AlbumSortOrder) Route { - return Route{Page: Albums, Arg: string(sortOrder)} +func AlbumsRoute() Route { + return Route{Page: Albums} } func ArtistRoute(artistID string) Route { diff --git a/ui/mainwindow.go b/ui/mainwindow.go index 99475d8..1ce571d 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -43,7 +43,7 @@ type MainWindow struct { } var ( - HomePage = controller.AlbumsRoute(backend.AlbumSortRecentlyAdded) + HomePage = controller.AlbumsRoute() ) func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App, size fyne.Size) MainWindow { @@ -97,7 +97,7 @@ func (m *MainWindow) addNavigationButtons() { m.Router.NavigateTo(controller.FavoritesRoute()) }) m.BrowsingPane.AddNavigationButton(res.ResDiscInvertPng, func() { - m.Router.NavigateTo(controller.AlbumsRoute(backend.AlbumSortRecentlyAdded)) + m.Router.NavigateTo(controller.AlbumsRoute()) }) m.BrowsingPane.AddNavigationButton(res.ResPeopleInvertPng, func() { m.Router.NavigateTo(controller.ArtistsRoute())