reuse grid view for searching on albums page

This commit is contained in:
Drew Weymouth
2023-07-08 15:18:37 -07:00
parent 83b6d48560
commit 1c771b0832
4 changed files with 90 additions and 78 deletions
+59 -65
View File
@@ -21,20 +21,21 @@ var _ fyne.Widget = (*AlbumsPage)(nil)
type AlbumsPage struct {
widget.BaseWidget
cfg *backend.AlbumsPageConfig
contr *controller.Controller
pm *backend.PlaybackManager
im *backend.ImageManager
mp mediaprovider.MediaProvider
grid *widgets.GridView
searchGrid *widgets.GridView
searcher *widgets.SearchEntry
filterBtn *widgets.AlbumFilterButton
searchText string
filter mediaprovider.AlbumFilter
titleDisp *widget.RichText
sortOrder *selectWidget
container *fyne.Container
cfg *backend.AlbumsPageConfig
contr *controller.Controller
pm *backend.PlaybackManager
im *backend.ImageManager
mp mediaprovider.MediaProvider
grid *widgets.GridView
gridState *widgets.GridViewState
searchGridState *widgets.GridViewState
searcher *widgets.SearchEntry
filterBtn *widgets.AlbumFilterButton
searchText string
filter mediaprovider.AlbumFilter
titleDisp *widget.RichText
sortOrder *selectWidget
container *fyne.Container
}
type selectWidget struct {
@@ -79,7 +80,7 @@ func NewAlbumsPage(cfg *backend.AlbumsPageConfig, contr *controller.Controller,
a.grid = widgets.NewGridView(widgets.NewGridViewAlbumIterator(iter), im, myTheme.AlbumIcon)
contr.ConnectAlbumGridActions(a.grid)
a.createSearchAndFilter()
a.createContainer(false)
a.createContainer()
return a
}
@@ -92,31 +93,29 @@ func (a *AlbumsPage) createSearchAndFilter() {
a.filterBtn.OnChanged = a.Reload
}
func (a *AlbumsPage) createContainer(searchgrid bool) {
func (a *AlbumsPage) createContainer() {
searchVbox := container.NewVBox(layout.NewSpacer(), a.searcher, layout.NewSpacer())
sortVbox := container.NewVBox(layout.NewSpacer(), a.sortOrder, layout.NewSpacer())
g := a.grid
if searchgrid {
g = a.searchGrid
}
a.container = container.NewBorder(
container.NewHBox(util.NewHSpace(6), a.titleDisp, sortVbox, layout.NewSpacer(), container.NewCenter(a.filterBtn), searchVbox, util.NewHSpace(12)),
nil,
nil,
nil,
g,
a.grid,
)
}
func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage {
a := &AlbumsPage{
cfg: saved.cfg,
contr: saved.contr,
pm: saved.pm,
mp: saved.mp,
im: saved.im,
searchText: saved.searchText,
filter: saved.filter,
cfg: saved.cfg,
contr: saved.contr,
pm: saved.pm,
mp: saved.mp,
im: saved.im,
gridState: saved.gridState,
searchGridState: saved.searchGridState,
searchText: saved.searchText,
filter: saved.filter,
}
a.ExtendBaseWidget(a)
@@ -127,27 +126,28 @@ func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage {
a.sortOrder = NewSelect(a.mp.AlbumSortOrders(), nil)
a.sortOrder.Selected = saved.sortOrder
a.sortOrder.OnChanged = a.onSortOrderChanged
a.grid = widgets.NewGridViewFromState(saved.gridState)
if a.searchText != "" {
a.searchGrid = widgets.NewGridViewFromState(saved.searchGridState)
a.sortOrder.Disable()
a.grid = widgets.NewGridViewFromState(saved.searchGridState)
} else {
a.grid = widgets.NewGridViewFromState(saved.gridState)
}
a.createSearchAndFilter()
a.createContainer(saved.searchText != "")
a.createContainer()
return a
}
func (a *AlbumsPage) 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.sortOrder.Enable()
a.grid.ResetFromState(a.gridState)
a.searchGridState = nil
} else {
a.sortOrder.Disable()
a.doSearch(query)
}
a.doSearch(query)
a.searchText = query
}
func (a *AlbumsPage) Route() controller.Route {
@@ -166,48 +166,42 @@ func (a *AlbumsPage) Reload() {
} else {
iter := a.mp.IterateAlbums(a.sortOrder.Selected, a.filter)
a.grid.Reset(widgets.NewGridViewAlbumIterator(iter))
a.grid.Refresh()
}
}
func (a *AlbumsPage) Save() SavedPage {
sa := &savedAlbumsPage{
cfg: a.cfg,
contr: a.contr,
pm: a.pm,
mp: a.mp,
im: a.im,
searchText: a.searchText,
filter: a.filter,
sortOrder: a.sortOrder.Selected,
gridState: a.grid.SaveToState(),
cfg: a.cfg,
contr: a.contr,
pm: a.pm,
mp: a.mp,
im: a.im,
searchText: a.searchText,
filter: a.filter,
sortOrder: a.sortOrder.Selected,
gridState: a.gridState,
searchGridState: a.searchGridState,
}
if a.searchGrid != nil {
sa.searchGridState = a.searchGrid.SaveToState()
if a.searchText == "" {
sa.gridState = a.grid.SaveToState()
} else {
sa.searchGridState = a.grid.SaveToState()
}
return sa
}
func (a *AlbumsPage) doSearch(query string) {
iter := widgets.NewGridViewAlbumIterator(a.mp.SearchAlbums(query, a.filter))
if a.searchGrid == nil {
a.searchGrid = widgets.NewGridView(iter, a.im, myTheme.AlbumIcon)
a.contr.ConnectAlbumGridActions(a.searchGrid)
} else {
a.searchGrid.Reset(iter)
if a.searchText == "" {
a.gridState = a.grid.SaveToState()
}
a.container.Objects[0] = a.searchGrid
a.Refresh()
iter := widgets.NewGridViewAlbumIterator(a.mp.SearchAlbums(query, a.filter))
a.grid.Reset(iter)
}
func (a *AlbumsPage) onSortOrderChanged(order string) {
a.cfg.SortOrder = a.sortOrder.Selected
iter := a.mp.IterateAlbums(order, a.filter)
a.grid.Reset(widgets.NewGridViewAlbumIterator(iter))
if a.searchText == "" {
a.container.Objects[0] = a.grid
a.Refresh()
}
}
func (a *AlbumsPage) CreateRenderer() fyne.WidgetRenderer {
@@ -224,8 +218,8 @@ type savedAlbumsPage struct {
mp mediaprovider.MediaProvider
im *backend.ImageManager
sortOrder string
gridState widgets.GridViewState
searchGridState widgets.GridViewState
gridState *widgets.GridViewState
searchGridState *widgets.GridViewState
}
func (s *savedAlbumsPage) Restore() Page {
+2 -2
View File
@@ -383,8 +383,8 @@ type savedFavoritesPage struct {
pm *backend.PlaybackManager
mp mediaprovider.MediaProvider
im *backend.ImageManager
gridState widgets.GridViewState
searchGridState widgets.GridViewState
gridState *widgets.GridViewState
searchGridState *widgets.GridViewState
filter mediaprovider.AlbumFilter
searchText string
activeToggleBtn int
+2 -3
View File
@@ -126,7 +126,6 @@ func (g *GenrePage) Reload() {
} else {
iter := g.mp.IterateAlbums("", g.filter)
g.grid.Reset(widgets.NewGridViewAlbumIterator(iter))
g.grid.Refresh()
}
}
@@ -190,8 +189,8 @@ type savedGenrePage struct {
pm *backend.PlaybackManager
mp mediaprovider.MediaProvider
im *backend.ImageManager
gridState widgets.GridViewState
searchGridState widgets.GridViewState
gridState *widgets.GridViewState
searchGridState *widgets.GridViewState
}
func (s *savedGenrePage) Restore() Page {
+27 -8
View File
@@ -71,7 +71,8 @@ func NewGridViewAlbumIterator(iter mediaprovider.AlbumIterator) GridViewIterator
type GridView struct {
widget.BaseWidget
stateMutex sync.RWMutex
stateMutex sync.RWMutex
fetchCancel context.CancelFunc
GridViewState
grid *xwidget.GridWrap
@@ -83,7 +84,6 @@ type GridViewState struct {
imageFetcher ImageFetcher
placeholder fyne.Resource
highestShown int
fetchCancel context.CancelFunc
done bool
OnPlay func(id string, shuffle bool)
@@ -128,16 +128,16 @@ func NewGridView(iter GridViewIterator, fetch ImageFetcher, placeholder fyne.Res
return g
}
func (g *GridView) SaveToState() GridViewState {
func (g *GridView) SaveToState() *GridViewState {
g.stateMutex.RLock()
s := g.GridViewState
g.stateMutex.RUnlock()
s.scrollPos = g.grid.GetScrollOffset()
return s
return &s
}
func NewGridViewFromState(state GridViewState) *GridView {
g := &GridView{GridViewState: state}
func NewGridViewFromState(state *GridViewState) *GridView {
g := &GridView{GridViewState: *state}
g.ExtendBaseWidget(g)
g.createGridWrap()
g.Refresh() // needed to initialize the widget
@@ -146,6 +146,10 @@ func NewGridViewFromState(state GridViewState) *GridView {
}
func (g *GridView) Clear() {
if g.fetchCancel != nil {
g.fetchCancel()
g.fetchCancel = nil
}
g.stateMutex.Lock()
defer g.stateMutex.Unlock()
g.items = nil
@@ -164,6 +168,20 @@ func (g *GridView) Reset(iter GridViewIterator) {
g.iter = iter
g.stateMutex.Unlock()
g.fetchMoreItems(36)
g.Refresh()
}
func (g *GridView) ResetFromState(state *GridViewState) {
if g.fetchCancel != nil {
g.fetchCancel()
g.fetchCancel = nil
}
g.stateMutex.Lock()
g.GridViewState = *state
g.stateMutex.Unlock()
g.grid.Refresh()
g.grid.ScrollToOffset(state.scrollPos)
g.grid.Refresh()
}
func (g *GridView) ResetFixed(items []GridViewItemModel) {
@@ -177,6 +195,7 @@ func (g *GridView) ResetFixed(items []GridViewItemModel) {
g.highestShown = 0
g.iter = nil
g.stateMutex.Unlock()
g.Refresh()
}
func (g *GridView) GetScrollOffset() float32 {
@@ -222,7 +241,7 @@ func (g *GridView) createGridWrap() {
}
card.OnDownload = func() {
if g.OnDownload != nil {
g.OnDownload(card.itemID)
g.OnDownload(card.ItemID())
}
}
return card
@@ -324,7 +343,7 @@ func (g *GridView) fetchMoreItems(count int) {
}
n += len(items)
if len(items) > 0 {
g.Refresh()
g.grid.Refresh()
}
}
}