From 1c771b083288b2a700d7adf3c8f7a5a2e87a9288 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 8 Jul 2023 15:18:37 -0700 Subject: [PATCH] reuse grid view for searching on albums page --- ui/browsing/albumspage.go | 124 +++++++++++++++++------------------ ui/browsing/favoritespage.go | 4 +- ui/browsing/genrepage.go | 5 +- ui/widgets/gridview.go | 35 +++++++--- 4 files changed, 90 insertions(+), 78 deletions(-) diff --git a/ui/browsing/albumspage.go b/ui/browsing/albumspage.go index 455594f..e859b65 100644 --- a/ui/browsing/albumspage.go +++ b/ui/browsing/albumspage.go @@ -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 { diff --git a/ui/browsing/favoritespage.go b/ui/browsing/favoritespage.go index 35b6808..ecab761 100644 --- a/ui/browsing/favoritespage.go +++ b/ui/browsing/favoritespage.go @@ -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 diff --git a/ui/browsing/genrepage.go b/ui/browsing/genrepage.go index 26304d6..4307238 100644 --- a/ui/browsing/genrepage.go +++ b/ui/browsing/genrepage.go @@ -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 { diff --git a/ui/widgets/gridview.go b/ui/widgets/gridview.go index 5161fe4..a0c957d 100644 --- a/ui/widgets/gridview.go +++ b/ui/widgets/gridview.go @@ -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() } } }