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