add search + iterative loading to favorites page

This commit is contained in:
Drew Weymouth
2023-01-26 17:47:21 -08:00
parent 816faf9134
commit b365c339e9
2 changed files with 96 additions and 33 deletions
+95 -32
View File
@@ -1,44 +1,86 @@
package browsing package browsing
import ( import (
"log"
"supersonic/backend" "supersonic/backend"
"supersonic/ui/widgets" "supersonic/ui/widgets"
"time"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/dweymouth/go-subsonic"
) )
type FavoritesPage struct { type FavoritesPage struct {
widget.BaseWidget widget.BaseWidget
im *backend.ImageManager im *backend.ImageManager
sm *backend.ServerManager sm *backend.ServerManager
nav func(Route) lm *backend.LibraryManager
grid *widgets.AlbumGrid nav func(Route)
titleDisp *widget.RichText grid *widgets.AlbumGrid
container *fyne.Container searchGrid *widgets.AlbumGrid
searcher *widgets.Searcher
searchText string
titleDisp *widget.RichText
container *fyne.Container
OnPlayAlbum func(string, int) OnPlayAlbum func(string, int)
} }
func NewFavoritesPage(sm *backend.ServerManager, im *backend.ImageManager, nav func(Route)) *FavoritesPage { func NewFavoritesPage(sm *backend.ServerManager, lm *backend.LibraryManager, im *backend.ImageManager, nav func(Route)) *FavoritesPage {
a := &FavoritesPage{ a := &FavoritesPage{
lm: lm,
sm: sm, sm: sm,
im: im, im: im,
nav: nav, nav: nav,
} }
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
a.createTitle()
iter := lm.StarredIter()
a.grid = widgets.NewAlbumGrid(iter, im, false)
a.grid.OnPlayAlbum = a.onPlayAlbum
a.grid.OnShowAlbumPage = a.onShowAlbumPage
a.grid.OnShowArtistPage = a.onShowArtistPage
a.searcher = widgets.NewSearcher()
a.searcher.OnSearched = a.OnSearched
a.createContainer()
return a
}
func (a *FavoritesPage) createTitle() {
a.titleDisp = widget.NewRichTextWithText("Favorites") a.titleDisp = widget.NewRichTextWithText("Favorites")
a.titleDisp.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ a.titleDisp.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{
SizeName: theme.SizeNameHeadingText, SizeName: theme.SizeNameHeadingText,
} }
}
func (a *FavoritesPage) createContainer() {
searchVbox := container.NewVBox(layout.NewSpacer(), a.searcher.Entry, layout.NewSpacer())
a.container = container.NewBorder( a.container = container.NewBorder(
container.NewHBox(widgets.NewHSpace(9), a.titleDisp), nil, nil, nil, layout.NewSpacer()) container.NewHBox(widgets.NewHSpace(9), a.titleDisp, layout.NewSpacer(), searchVbox, widgets.NewHSpace(15)),
a.loadAsync() nil, nil, nil, a.grid)
}
func restoreFavoritesPage(saved *savedFavoritesPage) *FavoritesPage {
a := &FavoritesPage{
lm: saved.lm,
sm: saved.sm,
im: saved.im,
nav: saved.nav,
}
a.ExtendBaseWidget(a)
a.createTitle()
a.grid = widgets.NewAlbumGridFromState(saved.gridState)
a.grid.OnPlayAlbum = a.onPlayAlbum
a.grid.OnShowAlbumPage = a.onShowAlbumPage
a.grid.OnShowArtistPage = a.onShowArtistPage
a.searcher = widgets.NewSearcher()
a.searcher.OnSearched = a.OnSearched
a.createContainer()
return a return a
} }
@@ -51,17 +93,48 @@ func (a *FavoritesPage) SetPlayAlbumCallback(cb func(string, int)) {
} }
func (a *FavoritesPage) Reload() { func (a *FavoritesPage) Reload() {
a.loadAsync() a.grid.Reset(a.lm.StarredIter())
} }
func (a *FavoritesPage) Save() SavedPage { func (a *FavoritesPage) Save() SavedPage {
return &savedFavoritesPage{ return &savedFavoritesPage{
sm: a.sm, sm: a.sm,
im: a.im, im: a.im,
nav: a.nav, lm: a.lm,
nav: a.nav,
gridState: a.grid.SaveToState(),
} }
} }
func (a *FavoritesPage) OnSearched(query string) {
a.searchText = query
if query == "" {
a.container.Objects[0] = a.grid
if a.searchGrid != nil {
a.searchGrid.Clear()
}
a.Refresh()
return
}
a.doSearch(query)
}
func (a *FavoritesPage) doSearch(query string) {
iter := a.lm.SearchIterWithFilter(query, func(al *subsonic.AlbumID3) bool {
return al.Starred.After(time.Time{})
})
if a.searchGrid == nil {
a.searchGrid = widgets.NewAlbumGrid(iter, a.im, false /*showYear*/)
a.searchGrid.OnPlayAlbum = a.onPlayAlbum
a.searchGrid.OnShowAlbumPage = a.onShowAlbumPage
a.searchGrid.OnShowArtistPage = a.onShowArtistPage
} else {
a.searchGrid.Reset(iter)
}
a.container.Objects[0] = a.searchGrid
a.Refresh()
}
func (a *FavoritesPage) onPlayAlbum(albumID string) { func (a *FavoritesPage) onPlayAlbum(albumID string) {
if a.OnPlayAlbum != nil { if a.OnPlayAlbum != nil {
a.OnPlayAlbum(albumID, 0) a.OnPlayAlbum(albumID, 0)
@@ -72,19 +145,8 @@ func (a *FavoritesPage) onShowAlbumPage(albumID string) {
a.nav(AlbumRoute(albumID)) a.nav(AlbumRoute(albumID))
} }
func (a *FavoritesPage) loadAsync() { func (a *FavoritesPage) onShowArtistPage(artistID string) {
go func() { a.nav(ArtistRoute(artistID))
starred, err := a.sm.Server.GetStarred2(nil)
if err != nil {
log.Printf("Failed to get favorites: %s", err.Error())
return
}
ag := widgets.NewFixedAlbumGrid(starred.Album, a.im, false /*showYear*/)
ag.OnPlayAlbum = a.onPlayAlbum
ag.OnShowAlbumPage = a.onShowAlbumPage
a.container.Objects[0] = ag
a.container.Refresh()
}()
} }
func (a *FavoritesPage) CreateRenderer() fyne.WidgetRenderer { func (a *FavoritesPage) CreateRenderer() fyne.WidgetRenderer {
@@ -93,12 +155,13 @@ func (a *FavoritesPage) CreateRenderer() fyne.WidgetRenderer {
} }
type savedFavoritesPage struct { type savedFavoritesPage struct {
artistID string sm *backend.ServerManager
sm *backend.ServerManager im *backend.ImageManager
im *backend.ImageManager lm *backend.LibraryManager
nav func(Route) gridState widgets.AlbumGridState
nav func(Route)
} }
func (s *savedFavoritesPage) Restore() Page { func (s *savedFavoritesPage) Restore() Page {
return NewFavoritesPage(s.sm, s.im, s.nav) return restoreFavoritesPage(s)
} }
+1 -1
View File
@@ -107,7 +107,7 @@ func (r Router) CreatePage(rte Route) Page {
case Artists: case Artists:
return NewArtistsGenresPage(false, r.App.ServerManager, r.OpenRoute) return NewArtistsGenresPage(false, r.App.ServerManager, r.OpenRoute)
case Favorites: case Favorites:
return NewFavoritesPage(r.App.ServerManager, r.App.ImageManager, r.OpenRoute) return NewFavoritesPage(r.App.ServerManager, r.App.LibraryManager, r.App.ImageManager, r.OpenRoute)
case Genre: case Genre:
return NewGenrePage(rte.Arg, r.App.LibraryManager, r.App.ImageManager, r.OpenRoute) return NewGenrePage(rte.Arg, r.App.LibraryManager, r.App.ImageManager, r.OpenRoute)
case Genres: case Genres: