From 85e79921da767c785a53825fe79904ba01193f17 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 18 Feb 2023 21:04:56 -0800 Subject: [PATCH] persist album page tracklist column visibility preference --- backend/config.go | 8 +++++ ui/browsing/albumpage.go | 12 +++++-- ui/browsing/nowplayingpage.go | 2 +- ui/browsing/playlistpage.go | 2 +- ui/browsing/router.go | 2 +- ui/widgets/tracklist.go | 61 +++++++++++++++++++++++++---------- 6 files changed, 64 insertions(+), 23 deletions(-) diff --git a/backend/config.go b/backend/config.go index b636019..2696fa1 100644 --- a/backend/config.go +++ b/backend/config.go @@ -20,9 +20,14 @@ type AppConfig struct { WindowHeight int } +type AlbumPageConfig struct { + TracklistColumns []string +} + type Config struct { Application AppConfig Servers []*ServerConfig + AlbumPage AlbumPageConfig } func DefaultConfig() *Config { @@ -31,6 +36,9 @@ func DefaultConfig() *Config { WindowWidth: 1000, WindowHeight: 800, }, + AlbumPage: AlbumPageConfig{ + TracklistColumns: []string{"Artist", "Time", "Plays"}, + }, } } diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index e37e979..c5a58f9 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -31,6 +31,7 @@ type AlbumPage struct { type albumPageState struct { albumID string + cfg *backend.AlbumPageConfig lm *backend.LibraryManager pm *backend.PlaybackManager im *backend.ImageManager @@ -41,6 +42,7 @@ type albumPageState struct { func NewAlbumPage( albumID string, + cfg *backend.AlbumPageConfig, sm *backend.ServerManager, pm *backend.PlaybackManager, lm *backend.LibraryManager, @@ -51,6 +53,7 @@ func NewAlbumPage( a := &AlbumPage{ albumPageState: albumPageState{ albumID: albumID, + cfg: cfg, sm: sm, pm: pm, lm: lm, @@ -62,8 +65,7 @@ func NewAlbumPage( a.ExtendBaseWidget(a) a.header = NewAlbumPageHeader(a) a.tracklist = widgets.NewTracklist(nil) - a.tracklist.SetVisibleColumns([]widgets.TracklistColumn{ - widgets.ColumnArtist, widgets.ColumnTime, widgets.ColumnPlays}) + a.tracklist.SetVisibleColumns(a.cfg.TracklistColumns) // connect tracklist actions a.tracklist.OnPlayTrackAt = a.onPlayTrackAt a.tracklist.OnAddToQueue = func(tracks []*subsonic.Child) { a.pm.LoadTracks(tracks, true, false) } @@ -86,6 +88,10 @@ func (a *AlbumPage) CreateRenderer() fyne.WidgetRenderer { } func (a *AlbumPage) Save() SavedPage { + // TODO: find a better place to update the tracklist columns preference + // If user changes columns but doesn't navigate to another page, + // we won't be persisting the change + a.cfg.TracklistColumns = a.tracklist.VisibleColumns() s := a.albumPageState return &s } @@ -254,5 +260,5 @@ func formatMiscLabelStr(a *subsonic.AlbumID3) string { } func (s *albumPageState) Restore() Page { - return NewAlbumPage(s.albumID, s.sm, s.pm, s.lm, s.im, s.contr, s.nav) + return NewAlbumPage(s.albumID, s.cfg, s.sm, s.pm, s.lm, s.im, s.contr, s.nav) } diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index 6fc93e7..68fa924 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -39,7 +39,7 @@ func NewNowPlayingPage( a := &NowPlayingPage{nowPlayingPageState: nowPlayingPageState{contr: contr, sm: sm, pm: pm, nav: nav}} a.ExtendBaseWidget(a) a.tracklist = widgets.NewTracklist(nil) - a.tracklist.SetVisibleColumns([]widgets.TracklistColumn{ + a.tracklist.SetVisibleColumns([]string{ widgets.ColumnArtist, widgets.ColumnAlbum, widgets.ColumnTime}) a.tracklist.AutoNumber = true a.tracklist.DisablePlaybackMenu = true diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index 1a70ea6..31a63c2 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -49,7 +49,7 @@ func NewPlaylistPage( a.ExtendBaseWidget(a) a.header = NewPlaylistPageHeader(a) a.tracklist = widgets.NewTracklist(nil) - a.tracklist.SetVisibleColumns([]widgets.TracklistColumn{ + a.tracklist.SetVisibleColumns([]string{ widgets.ColumnArtist, widgets.ColumnAlbum, widgets.ColumnTime, widgets.ColumnPlays}) a.tracklist.AutoNumber = true a.tracklist.AuxiliaryMenuItems = []*fyne.MenuItem{ diff --git a/ui/browsing/router.go b/ui/browsing/router.go index 0146a99..e5138e2 100644 --- a/ui/browsing/router.go +++ b/ui/browsing/router.go @@ -87,7 +87,7 @@ func NewRouter(app *backend.App, controller controller.Controller, nav Navigatio func (r Router) CreatePage(rte Route) Page { switch rte.Page { case Album: - return NewAlbumPage(rte.Arg, r.App.ServerManager, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, r.Controller, r.OpenRoute) + return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.App.ServerManager, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, r.Controller, r.OpenRoute) case Albums: return NewAlbumsPage("Albums", rte.Arg, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, r.OpenRoute) case Artist: diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index 7a22888..7a293ed 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -18,14 +18,12 @@ import ( "github.com/dweymouth/go-subsonic/subsonic" ) -type TracklistColumn string - const ( - ColumnArtist TracklistColumn = "Artist" - ColumnAlbum TracklistColumn = "Album" - ColumnTime TracklistColumn = "Time" - ColumnPlays TracklistColumn = "Plays" - ColumnBitrate TracklistColumn = "Bitrate" + ColumnArtist = "Artist" + ColumnAlbum = "Album" + ColumnTime = "Time" + ColumnPlays = "Plays" + ColumnBitrate = "Bitrate" ) type Tracklist struct { @@ -98,7 +96,7 @@ func (t *Tracklist) buildHeader() { t.colLayout) } -func (t *Tracklist) SetVisibleColumns(cols []TracklistColumn) { +func (t *Tracklist) SetVisibleColumns(cols []string) { t.visibleColumns[0] = true t.visibleColumns[1] = true for i := 2; i < len(t.visibleColumns); i++ { @@ -106,11 +104,21 @@ func (t *Tracklist) SetVisibleColumns(cols []TracklistColumn) { t.hdr.SetColumnVisible(i, false) } for _, col := range cols { - t.visibleColumns[col.ColNumber()] = true - t.hdr.SetColumnVisible(col.ColNumber(), true) + t.visibleColumns[ColNumber(col)] = true + t.hdr.SetColumnVisible(ColNumber(col), true) } } +func (t *Tracklist) VisibleColumns() []string { + var cols []string + for i := 2; i < len(t.visibleColumns); i++ { + if t.visibleColumns[i] { + cols = append(cols, string(colName(i))) + } + } + return cols +} + func (t *Tracklist) setColumnVisible(colNum int, vis bool) { if colNum >= len(t.visibleColumns) { log.Printf("error: Tracklist.SetColumnVisible: column index %d out of range", colNum) @@ -247,9 +255,9 @@ func (t *Tracklist) SelectedTrackIndexes() []int { return t.selectionMgr.GetSelection() } -func (c TracklistColumn) ColNumber() int { +func ColNumber(colName string) int { // built-in columns # and Title are always visible - switch c { + switch colName { case ColumnArtist: return 2 case ColumnAlbum: @@ -261,10 +269,29 @@ func (c TracklistColumn) ColNumber() int { case ColumnBitrate: return 6 default: + log.Printf("error: Tracklist: invalid column name %s", colName) return -100 } } +func colName(i int) string { + // built-in columns # and Title are always visible + switch i { + case 2: + return ColumnArtist + case 3: + return ColumnAlbum + case 4: + return ColumnTime + case 5: + return ColumnPlays + case 6: + return ColumnBitrate + default: + return "" + } +} + type TrackRow struct { widget.BaseWidget @@ -350,11 +377,11 @@ func (t *TrackRow) Update(tr *subsonic.Child, isPlaying bool, rowNum int) { } } - t.artist.Hidden = !t.tracklist.visibleColumns[ColumnArtist.ColNumber()] - t.album.Hidden = !t.tracklist.visibleColumns[ColumnAlbum.ColNumber()] - t.dur.Hidden = !t.tracklist.visibleColumns[ColumnTime.ColNumber()] - t.plays.Hidden = !t.tracklist.visibleColumns[ColumnPlays.ColNumber()] - t.bitrate.Hidden = !t.tracklist.visibleColumns[ColumnBitrate.ColNumber()] + t.artist.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnArtist)] + t.album.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnAlbum)] + t.dur.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnTime)] + t.plays.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnPlays)] + t.bitrate.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnBitrate)] t.Refresh() }