persist album page tracklist column visibility preference
This commit is contained in:
@@ -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"},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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:
|
||||
|
||||
+44
-17
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user