save scroll position in artist page state

This commit is contained in:
Drew Weymouth
2025-07-06 15:51:20 -07:00
parent 02e7caec84
commit 2acd99b841
2 changed files with 48 additions and 14 deletions
+31 -9
View File
@@ -40,6 +40,9 @@ type artistPageState struct {
mp mediaprovider.MediaProvider mp mediaprovider.MediaProvider
im *backend.ImageManager im *backend.ImageManager
contr *controller.Controller contr *controller.Controller
gridScrollPos float32 // for album grid (or grouped releases)
listScrollPos float32 // for Top Tracks list
} }
type ArtistPage struct { type ArtistPage struct {
@@ -69,11 +72,7 @@ func NewArtistPage(artistID string, cfg *backend.ArtistPageConfig, pool *util.Wi
if cfg.InitialView == viewTopTracks { if cfg.InitialView == viewTopTracks {
activeView = 1 activeView = 1
} }
return newArtistPage(artistID, cfg, pool, pm, mp, im, contr, activeView, widgets.TracklistSort{}) return newArtistPage(artistPageState{
}
func newArtistPage(artistID string, cfg *backend.ArtistPageConfig, pool *util.WidgetPool, pm *backend.PlaybackManager, mp mediaprovider.MediaProvider, im *backend.ImageManager, contr *controller.Controller, activeView int, sort widgets.TracklistSort) *ArtistPage {
a := &ArtistPage{artistPageState: artistPageState{
artistID: artistID, artistID: artistID,
cfg: cfg, cfg: cfg,
pool: pool, pool: pool,
@@ -82,8 +81,11 @@ func newArtistPage(artistID string, cfg *backend.ArtistPageConfig, pool *util.Wi
im: im, im: im,
contr: contr, contr: contr,
activeView: activeView, activeView: activeView,
trackSort: sort, })
}} }
func newArtistPage(state artistPageState) *ArtistPage {
a := &ArtistPage{artistPageState: state}
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
if h := a.pool.Obtain(util.WidgetTypeArtistPageHeader); h != nil { if h := a.pool.Obtain(util.WidgetTypeArtistPageHeader); h != nil {
a.header = h.(*ArtistPageHeader) a.header = h.(*ArtistPageHeader)
@@ -92,7 +94,7 @@ func newArtistPage(artistID string, cfg *backend.ArtistPageConfig, pool *util.Wi
a.header = NewArtistPageHeader(a) a.header = NewArtistPageHeader(a)
} }
a.header.artistPage = a a.header.artistPage = a
if img, ok := im.GetCachedArtistImage(artistID); ok { if img, ok := state.im.GetCachedArtistImage(state.artistID); ok {
a.header.artistImage.SetImage(img, true /*tappable*/) a.header.artistImage.SetImage(img, true /*tappable*/)
} }
viewToggle := widgets.NewToggleText(0, []string{lang.L("Discography"), lang.L("Top Tracks")}) viewToggle := widgets.NewToggleText(0, []string{lang.L("Discography"), lang.L("Top Tracks")})
@@ -148,6 +150,7 @@ func (a *ArtistPage) Save() SavedPage {
s := a.artistPageState s := a.artistPageState
if a.tracklistCtr != nil { if a.tracklistCtr != nil {
tl := a.tracklistCtr.Objects[0].(*widgets.Tracklist) tl := a.tracklistCtr.Objects[0].(*widgets.Tracklist)
s.listScrollPos = tl.GetScrollOffset()
s.trackSort = tl.Sorting() s.trackSort = tl.Sorting()
tl.Clear() tl.Clear()
a.pool.Release(util.WidgetTypeTracklist, tl) a.pool.Release(util.WidgetTypeTracklist, tl)
@@ -155,10 +158,12 @@ func (a *ArtistPage) Save() SavedPage {
a.header.artistPage = nil a.header.artistPage = nil
a.pool.Release(util.WidgetTypeArtistPageHeader, a.header) a.pool.Release(util.WidgetTypeArtistPageHeader, a.header)
if a.albumGrid != nil { if a.albumGrid != nil {
s.gridScrollPos = a.albumGrid.GetScrollOffset()
a.albumGrid.Clear() a.albumGrid.Clear()
a.pool.Release(util.WidgetTypeGridView, a.albumGrid) a.pool.Release(util.WidgetTypeGridView, a.albumGrid)
} }
if a.groupedReleases != nil { if a.groupedReleases != nil {
s.gridScrollPos = a.groupedReleases.GetScrollOffset()
a.groupedReleases.Model = widgets.GroupedReleasesModel{} a.groupedReleases.Model = widgets.GroupedReleasesModel{}
a.pool.Release(util.WidgetTypeGroupedReleases, a.groupedReleases) a.pool.Release(util.WidgetTypeGroupedReleases, a.groupedReleases)
} }
@@ -181,6 +186,11 @@ var _ Scrollable = (*ArtistPage)(nil)
func (g *ArtistPage) Scroll(scrollAmt float32) { func (g *ArtistPage) Scroll(scrollAmt float32) {
if g.activeView == 0 && g.albumGrid != nil { if g.activeView == 0 && g.albumGrid != nil {
g.albumGrid.ScrollToOffset(g.albumGrid.GetScrollOffset() + scrollAmt) g.albumGrid.ScrollToOffset(g.albumGrid.GetScrollOffset() + scrollAmt)
} else if g.activeView == 0 && g.groupedReleases != nil {
g.groupedReleases.ScrollToOffset(g.groupedReleases.GetScrollOffset() + scrollAmt)
} else if g.activeView == 1 && g.tracklistCtr != nil {
tl := g.tracklistCtr.Objects[0].(*widgets.Tracklist)
tl.ScrollBy(scrollAmt)
} }
} }
@@ -326,6 +336,10 @@ func (a *ArtistPage) showAlbumGrid(reSort bool) {
a.groupedReleases = widgets.NewGroupedReleases(model, a.im) a.groupedReleases = widgets.NewGroupedReleases(model, a.im)
} }
a.contr.ConnectGroupedReleasesActions(a.groupedReleases) a.contr.ConnectGroupedReleasesActions(a.groupedReleases)
if a.gridScrollPos != 0 {
a.groupedReleases.ScrollToOffset(a.gridScrollPos)
a.gridScrollPos = 0
}
} else { } else {
model := a.getGridViewAlbumsModel() model := a.getGridViewAlbumsModel()
if g := a.pool.Obtain(util.WidgetTypeGridView); g != nil { if g := a.pool.Obtain(util.WidgetTypeGridView); g != nil {
@@ -336,6 +350,10 @@ func (a *ArtistPage) showAlbumGrid(reSort bool) {
a.albumGrid = widgets.NewFixedGridView(model, a.im, myTheme.AlbumIcon) a.albumGrid = widgets.NewFixedGridView(model, a.im, myTheme.AlbumIcon)
} }
a.contr.ConnectAlbumGridActions(a.albumGrid) a.contr.ConnectAlbumGridActions(a.albumGrid)
if a.gridScrollPos != 0 {
a.albumGrid.ScrollToOffset(a.gridScrollPos)
a.gridScrollPos = 0
}
} }
} else if reSort { } else if reSort {
if useGroupedReleases { if useGroupedReleases {
@@ -400,6 +418,10 @@ func (a *ArtistPage) showTopTracks() {
} }
tl.SetNowPlaying(a.nowPlayingID) tl.SetNowPlaying(a.nowPlayingID)
a.contr.ConnectTracklistActions(tl) a.contr.ConnectTracklistActions(tl)
if a.listScrollPos != 0 {
tl.ScrollToOffset(a.listScrollPos)
a.listScrollPos = 0
}
a.tracklistCtr = container.New( a.tracklistCtr = container.New(
&layout.CustomPaddedLayout{LeftPadding: 15, RightPadding: 15, BottomPadding: 10}, &layout.CustomPaddedLayout{LeftPadding: 15, RightPadding: 15, BottomPadding: 10},
tl) tl)
@@ -434,7 +456,7 @@ func (a *ArtistPage) CreateRenderer() fyne.WidgetRenderer {
} }
func (s *artistPageState) Restore() Page { func (s *artistPageState) Restore() Page {
return newArtistPage(s.artistID, s.cfg, s.pool, s.pm, s.mp, s.im, s.contr, s.activeView, s.trackSort) return newArtistPage(*s)
} }
const artistBioNotAvailableKey = "Artist biography not available." const artistBioNotAvailableKey = "Artist biography not available."
+17 -5
View File
@@ -46,6 +46,8 @@ type GroupedReleases struct {
cardPool sync.Pool cardPool sync.Pool
sections [4]groupedReleasesSection sections [4]groupedReleasesSection
container *container.Scroll
} }
type groupedReleasesSection struct { type groupedReleasesSection struct {
@@ -76,16 +78,26 @@ func NewGroupedReleases(model GroupedReleasesModel, fetch util.ImageFetcher) *Gr
g.sections[i].container = container.NewGridWrap(cardSize) g.sections[i].container = container.NewGridWrap(cardSize)
} }
return g
}
func (g *GroupedReleases) CreateRenderer() fyne.WidgetRenderer {
vbox := container.NewVBox() vbox := container.NewVBox()
for i := range g.sections { for i := range g.sections {
vbox.Add(g.sections[i].titleRow) vbox.Add(g.sections[i].titleRow)
vbox.Add(g.sections[i].container) vbox.Add(g.sections[i].container)
} }
return widget.NewSimpleRenderer(container.NewVScroll(vbox)) g.container = container.NewVScroll(vbox)
return g
}
func (g *GroupedReleases) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(g.container)
}
func (g *GroupedReleases) GetScrollOffset() float32 {
return g.container.Offset.Y
}
func (g *GroupedReleases) ScrollToOffset(offs float32) {
g.container.ScrollToOffset(fyne.NewPos(0, offs))
} }
func (g *GroupedReleases) Refresh() { func (g *GroupedReleases) Refresh() {