persist album page tracklist column visibility preference

This commit is contained in:
Drew Weymouth
2023-02-18 21:04:56 -08:00
parent afe37609ea
commit 85e79921da
6 changed files with 64 additions and 23 deletions
+8
View File
@@ -20,9 +20,14 @@ type AppConfig struct {
WindowHeight int WindowHeight int
} }
type AlbumPageConfig struct {
TracklistColumns []string
}
type Config struct { type Config struct {
Application AppConfig Application AppConfig
Servers []*ServerConfig Servers []*ServerConfig
AlbumPage AlbumPageConfig
} }
func DefaultConfig() *Config { func DefaultConfig() *Config {
@@ -31,6 +36,9 @@ func DefaultConfig() *Config {
WindowWidth: 1000, WindowWidth: 1000,
WindowHeight: 800, WindowHeight: 800,
}, },
AlbumPage: AlbumPageConfig{
TracklistColumns: []string{"Artist", "Time", "Plays"},
},
} }
} }
+9 -3
View File
@@ -31,6 +31,7 @@ type AlbumPage struct {
type albumPageState struct { type albumPageState struct {
albumID string albumID string
cfg *backend.AlbumPageConfig
lm *backend.LibraryManager lm *backend.LibraryManager
pm *backend.PlaybackManager pm *backend.PlaybackManager
im *backend.ImageManager im *backend.ImageManager
@@ -41,6 +42,7 @@ type albumPageState struct {
func NewAlbumPage( func NewAlbumPage(
albumID string, albumID string,
cfg *backend.AlbumPageConfig,
sm *backend.ServerManager, sm *backend.ServerManager,
pm *backend.PlaybackManager, pm *backend.PlaybackManager,
lm *backend.LibraryManager, lm *backend.LibraryManager,
@@ -51,6 +53,7 @@ func NewAlbumPage(
a := &AlbumPage{ a := &AlbumPage{
albumPageState: albumPageState{ albumPageState: albumPageState{
albumID: albumID, albumID: albumID,
cfg: cfg,
sm: sm, sm: sm,
pm: pm, pm: pm,
lm: lm, lm: lm,
@@ -62,8 +65,7 @@ func NewAlbumPage(
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
a.header = NewAlbumPageHeader(a) a.header = NewAlbumPageHeader(a)
a.tracklist = widgets.NewTracklist(nil) a.tracklist = widgets.NewTracklist(nil)
a.tracklist.SetVisibleColumns([]widgets.TracklistColumn{ a.tracklist.SetVisibleColumns(a.cfg.TracklistColumns)
widgets.ColumnArtist, widgets.ColumnTime, widgets.ColumnPlays})
// connect tracklist actions // connect tracklist actions
a.tracklist.OnPlayTrackAt = a.onPlayTrackAt a.tracklist.OnPlayTrackAt = a.onPlayTrackAt
a.tracklist.OnAddToQueue = func(tracks []*subsonic.Child) { a.pm.LoadTracks(tracks, true, false) } 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 { 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 s := a.albumPageState
return &s return &s
} }
@@ -254,5 +260,5 @@ func formatMiscLabelStr(a *subsonic.AlbumID3) string {
} }
func (s *albumPageState) Restore() Page { 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)
} }
+1 -1
View File
@@ -39,7 +39,7 @@ func NewNowPlayingPage(
a := &NowPlayingPage{nowPlayingPageState: nowPlayingPageState{contr: contr, sm: sm, pm: pm, nav: nav}} a := &NowPlayingPage{nowPlayingPageState: nowPlayingPageState{contr: contr, sm: sm, pm: pm, nav: nav}}
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
a.tracklist = widgets.NewTracklist(nil) a.tracklist = widgets.NewTracklist(nil)
a.tracklist.SetVisibleColumns([]widgets.TracklistColumn{ a.tracklist.SetVisibleColumns([]string{
widgets.ColumnArtist, widgets.ColumnAlbum, widgets.ColumnTime}) widgets.ColumnArtist, widgets.ColumnAlbum, widgets.ColumnTime})
a.tracklist.AutoNumber = true a.tracklist.AutoNumber = true
a.tracklist.DisablePlaybackMenu = true a.tracklist.DisablePlaybackMenu = true
+1 -1
View File
@@ -49,7 +49,7 @@ func NewPlaylistPage(
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
a.header = NewPlaylistPageHeader(a) a.header = NewPlaylistPageHeader(a)
a.tracklist = widgets.NewTracklist(nil) a.tracklist = widgets.NewTracklist(nil)
a.tracklist.SetVisibleColumns([]widgets.TracklistColumn{ a.tracklist.SetVisibleColumns([]string{
widgets.ColumnArtist, widgets.ColumnAlbum, widgets.ColumnTime, widgets.ColumnPlays}) widgets.ColumnArtist, widgets.ColumnAlbum, widgets.ColumnTime, widgets.ColumnPlays})
a.tracklist.AutoNumber = true a.tracklist.AutoNumber = true
a.tracklist.AuxiliaryMenuItems = []*fyne.MenuItem{ a.tracklist.AuxiliaryMenuItems = []*fyne.MenuItem{
+1 -1
View File
@@ -87,7 +87,7 @@ func NewRouter(app *backend.App, controller controller.Controller, nav Navigatio
func (r Router) CreatePage(rte Route) Page { func (r Router) CreatePage(rte Route) Page {
switch rte.Page { switch rte.Page {
case Album: 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: case Albums:
return NewAlbumsPage("Albums", rte.Arg, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, r.OpenRoute) return NewAlbumsPage("Albums", rte.Arg, r.App.PlaybackManager, r.App.LibraryManager, r.App.ImageManager, r.OpenRoute)
case Artist: case Artist:
+44 -17
View File
@@ -18,14 +18,12 @@ import (
"github.com/dweymouth/go-subsonic/subsonic" "github.com/dweymouth/go-subsonic/subsonic"
) )
type TracklistColumn string
const ( const (
ColumnArtist TracklistColumn = "Artist" ColumnArtist = "Artist"
ColumnAlbum TracklistColumn = "Album" ColumnAlbum = "Album"
ColumnTime TracklistColumn = "Time" ColumnTime = "Time"
ColumnPlays TracklistColumn = "Plays" ColumnPlays = "Plays"
ColumnBitrate TracklistColumn = "Bitrate" ColumnBitrate = "Bitrate"
) )
type Tracklist struct { type Tracklist struct {
@@ -98,7 +96,7 @@ func (t *Tracklist) buildHeader() {
t.colLayout) t.colLayout)
} }
func (t *Tracklist) SetVisibleColumns(cols []TracklistColumn) { func (t *Tracklist) SetVisibleColumns(cols []string) {
t.visibleColumns[0] = true t.visibleColumns[0] = true
t.visibleColumns[1] = true t.visibleColumns[1] = true
for i := 2; i < len(t.visibleColumns); i++ { for i := 2; i < len(t.visibleColumns); i++ {
@@ -106,11 +104,21 @@ func (t *Tracklist) SetVisibleColumns(cols []TracklistColumn) {
t.hdr.SetColumnVisible(i, false) t.hdr.SetColumnVisible(i, false)
} }
for _, col := range cols { for _, col := range cols {
t.visibleColumns[col.ColNumber()] = true t.visibleColumns[ColNumber(col)] = true
t.hdr.SetColumnVisible(col.ColNumber(), 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) { func (t *Tracklist) setColumnVisible(colNum int, vis bool) {
if colNum >= len(t.visibleColumns) { if colNum >= len(t.visibleColumns) {
log.Printf("error: Tracklist.SetColumnVisible: column index %d out of range", colNum) 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() return t.selectionMgr.GetSelection()
} }
func (c TracklistColumn) ColNumber() int { func ColNumber(colName string) int {
// built-in columns # and Title are always visible // built-in columns # and Title are always visible
switch c { switch colName {
case ColumnArtist: case ColumnArtist:
return 2 return 2
case ColumnAlbum: case ColumnAlbum:
@@ -261,10 +269,29 @@ func (c TracklistColumn) ColNumber() int {
case ColumnBitrate: case ColumnBitrate:
return 6 return 6
default: default:
log.Printf("error: Tracklist: invalid column name %s", colName)
return -100 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 { type TrackRow struct {
widget.BaseWidget 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.artist.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnArtist)]
t.album.Hidden = !t.tracklist.visibleColumns[ColumnAlbum.ColNumber()] t.album.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnAlbum)]
t.dur.Hidden = !t.tracklist.visibleColumns[ColumnTime.ColNumber()] t.dur.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnTime)]
t.plays.Hidden = !t.tracklist.visibleColumns[ColumnPlays.ColNumber()] t.plays.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnPlays)]
t.bitrate.Hidden = !t.tracklist.visibleColumns[ColumnBitrate.ColNumber()] t.bitrate.Hidden = !t.tracklist.visibleColumns[ColNumber(ColumnBitrate)]
t.Refresh() t.Refresh()
} }