save scroll position in artist page state
This commit is contained in:
@@ -40,6 +40,9 @@ type artistPageState struct {
|
||||
mp mediaprovider.MediaProvider
|
||||
im *backend.ImageManager
|
||||
contr *controller.Controller
|
||||
|
||||
gridScrollPos float32 // for album grid (or grouped releases)
|
||||
listScrollPos float32 // for Top Tracks list
|
||||
}
|
||||
|
||||
type ArtistPage struct {
|
||||
@@ -69,11 +72,7 @@ func NewArtistPage(artistID string, cfg *backend.ArtistPageConfig, pool *util.Wi
|
||||
if cfg.InitialView == viewTopTracks {
|
||||
activeView = 1
|
||||
}
|
||||
return newArtistPage(artistID, cfg, pool, pm, mp, im, contr, activeView, widgets.TracklistSort{})
|
||||
}
|
||||
|
||||
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{
|
||||
return newArtistPage(artistPageState{
|
||||
artistID: artistID,
|
||||
cfg: cfg,
|
||||
pool: pool,
|
||||
@@ -82,8 +81,11 @@ func newArtistPage(artistID string, cfg *backend.ArtistPageConfig, pool *util.Wi
|
||||
im: im,
|
||||
contr: contr,
|
||||
activeView: activeView,
|
||||
trackSort: sort,
|
||||
}}
|
||||
})
|
||||
}
|
||||
|
||||
func newArtistPage(state artistPageState) *ArtistPage {
|
||||
a := &ArtistPage{artistPageState: state}
|
||||
a.ExtendBaseWidget(a)
|
||||
if h := a.pool.Obtain(util.WidgetTypeArtistPageHeader); h != nil {
|
||||
a.header = h.(*ArtistPageHeader)
|
||||
@@ -92,7 +94,7 @@ func newArtistPage(artistID string, cfg *backend.ArtistPageConfig, pool *util.Wi
|
||||
a.header = NewArtistPageHeader(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*/)
|
||||
}
|
||||
viewToggle := widgets.NewToggleText(0, []string{lang.L("Discography"), lang.L("Top Tracks")})
|
||||
@@ -148,6 +150,7 @@ func (a *ArtistPage) Save() SavedPage {
|
||||
s := a.artistPageState
|
||||
if a.tracklistCtr != nil {
|
||||
tl := a.tracklistCtr.Objects[0].(*widgets.Tracklist)
|
||||
s.listScrollPos = tl.GetScrollOffset()
|
||||
s.trackSort = tl.Sorting()
|
||||
tl.Clear()
|
||||
a.pool.Release(util.WidgetTypeTracklist, tl)
|
||||
@@ -155,10 +158,12 @@ func (a *ArtistPage) Save() SavedPage {
|
||||
a.header.artistPage = nil
|
||||
a.pool.Release(util.WidgetTypeArtistPageHeader, a.header)
|
||||
if a.albumGrid != nil {
|
||||
s.gridScrollPos = a.albumGrid.GetScrollOffset()
|
||||
a.albumGrid.Clear()
|
||||
a.pool.Release(util.WidgetTypeGridView, a.albumGrid)
|
||||
}
|
||||
if a.groupedReleases != nil {
|
||||
s.gridScrollPos = a.groupedReleases.GetScrollOffset()
|
||||
a.groupedReleases.Model = widgets.GroupedReleasesModel{}
|
||||
a.pool.Release(util.WidgetTypeGroupedReleases, a.groupedReleases)
|
||||
}
|
||||
@@ -181,6 +186,11 @@ var _ Scrollable = (*ArtistPage)(nil)
|
||||
func (g *ArtistPage) Scroll(scrollAmt float32) {
|
||||
if g.activeView == 0 && g.albumGrid != nil {
|
||||
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.contr.ConnectGroupedReleasesActions(a.groupedReleases)
|
||||
if a.gridScrollPos != 0 {
|
||||
a.groupedReleases.ScrollToOffset(a.gridScrollPos)
|
||||
a.gridScrollPos = 0
|
||||
}
|
||||
} else {
|
||||
model := a.getGridViewAlbumsModel()
|
||||
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.contr.ConnectAlbumGridActions(a.albumGrid)
|
||||
if a.gridScrollPos != 0 {
|
||||
a.albumGrid.ScrollToOffset(a.gridScrollPos)
|
||||
a.gridScrollPos = 0
|
||||
}
|
||||
}
|
||||
} else if reSort {
|
||||
if useGroupedReleases {
|
||||
@@ -400,6 +418,10 @@ func (a *ArtistPage) showTopTracks() {
|
||||
}
|
||||
tl.SetNowPlaying(a.nowPlayingID)
|
||||
a.contr.ConnectTracklistActions(tl)
|
||||
if a.listScrollPos != 0 {
|
||||
tl.ScrollToOffset(a.listScrollPos)
|
||||
a.listScrollPos = 0
|
||||
}
|
||||
a.tracklistCtr = container.New(
|
||||
&layout.CustomPaddedLayout{LeftPadding: 15, RightPadding: 15, BottomPadding: 10},
|
||||
tl)
|
||||
@@ -434,7 +456,7 @@ func (a *ArtistPage) CreateRenderer() fyne.WidgetRenderer {
|
||||
}
|
||||
|
||||
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."
|
||||
|
||||
@@ -46,6 +46,8 @@ type GroupedReleases struct {
|
||||
cardPool sync.Pool
|
||||
|
||||
sections [4]groupedReleasesSection
|
||||
|
||||
container *container.Scroll
|
||||
}
|
||||
|
||||
type groupedReleasesSection struct {
|
||||
@@ -76,16 +78,26 @@ func NewGroupedReleases(model GroupedReleasesModel, fetch util.ImageFetcher) *Gr
|
||||
g.sections[i].container = container.NewGridWrap(cardSize)
|
||||
}
|
||||
|
||||
return g
|
||||
}
|
||||
|
||||
func (g *GroupedReleases) CreateRenderer() fyne.WidgetRenderer {
|
||||
vbox := container.NewVBox()
|
||||
for i := range g.sections {
|
||||
vbox.Add(g.sections[i].titleRow)
|
||||
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() {
|
||||
|
||||
Reference in New Issue
Block a user