reuse grid view for searching on albums page
This commit is contained in:
+31
-37
@@ -27,7 +27,8 @@ type AlbumsPage struct {
|
|||||||
im *backend.ImageManager
|
im *backend.ImageManager
|
||||||
mp mediaprovider.MediaProvider
|
mp mediaprovider.MediaProvider
|
||||||
grid *widgets.GridView
|
grid *widgets.GridView
|
||||||
searchGrid *widgets.GridView
|
gridState *widgets.GridViewState
|
||||||
|
searchGridState *widgets.GridViewState
|
||||||
searcher *widgets.SearchEntry
|
searcher *widgets.SearchEntry
|
||||||
filterBtn *widgets.AlbumFilterButton
|
filterBtn *widgets.AlbumFilterButton
|
||||||
searchText string
|
searchText string
|
||||||
@@ -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,19 +93,15 @@ 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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,6 +112,8 @@ func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage {
|
|||||||
pm: saved.pm,
|
pm: saved.pm,
|
||||||
mp: saved.mp,
|
mp: saved.mp,
|
||||||
im: saved.im,
|
im: saved.im,
|
||||||
|
gridState: saved.gridState,
|
||||||
|
searchGridState: saved.searchGridState,
|
||||||
searchText: saved.searchText,
|
searchText: saved.searchText,
|
||||||
filter: saved.filter,
|
filter: saved.filter,
|
||||||
}
|
}
|
||||||
@@ -127,28 +126,29 @@ 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 {
|
||||||
return controller.AlbumsRoute()
|
return controller.AlbumsRoute()
|
||||||
@@ -166,7 +166,6 @@ 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()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,34 +179,29 @@ func (a *AlbumsPage) Save() SavedPage {
|
|||||||
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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
+26
-7
@@ -72,6 +72,7 @@ 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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user