reuse grid view across several pages

This commit is contained in:
Drew Weymouth
2023-07-09 14:14:23 -07:00
parent be41bdc72c
commit 203070328c
11 changed files with 116 additions and 30 deletions
+1 -1
View File
@@ -78,7 +78,7 @@ func newAlbumPage(
}, },
} }
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
if h := a.pool.Obtain(util.WidgetTypeAlbumPageHeader); h != nil { if h := pool.Obtain(util.WidgetTypeAlbumPageHeader); h != nil {
a.header = h.(*AlbumPageHeader) a.header = h.(*AlbumPageHeader)
a.header.Clear() a.header.Clear()
} else { } else {
+22 -4
View File
@@ -22,6 +22,7 @@ type AlbumsPage struct {
widget.BaseWidget widget.BaseWidget
cfg *backend.AlbumsPageConfig cfg *backend.AlbumsPageConfig
pool *util.WidgetPool
contr *controller.Controller contr *controller.Controller
pm *backend.PlaybackManager pm *backend.PlaybackManager
im *backend.ImageManager im *backend.ImageManager
@@ -57,8 +58,9 @@ func (s *selectWidget) MinSize() fyne.Size {
return fyne.NewSize(170, s.Select.MinSize().Height) return fyne.NewSize(170, s.Select.MinSize().Height)
} }
func NewAlbumsPage(cfg *backend.AlbumsPageConfig, contr *controller.Controller, pm *backend.PlaybackManager, mp mediaprovider.MediaProvider, im *backend.ImageManager) *AlbumsPage { func NewAlbumsPage(cfg *backend.AlbumsPageConfig, pool *util.WidgetPool, contr *controller.Controller, pm *backend.PlaybackManager, mp mediaprovider.MediaProvider, im *backend.ImageManager) *AlbumsPage {
a := &AlbumsPage{ a := &AlbumsPage{
pool: pool,
cfg: cfg, cfg: cfg,
contr: contr, contr: contr,
pm: pm, pm: pm,
@@ -77,7 +79,13 @@ func NewAlbumsPage(cfg *backend.AlbumsPageConfig, contr *controller.Controller,
} }
a.sortOrder.Selected = cfg.SortOrder a.sortOrder.Selected = cfg.SortOrder
iter := mp.IterateAlbums(a.sortOrder.Selected, a.filter) iter := mp.IterateAlbums(a.sortOrder.Selected, a.filter)
a.grid = widgets.NewGridView(widgets.NewGridViewAlbumIterator(iter), im, myTheme.AlbumIcon) if g := pool.Obtain(util.WidgetTypeGridView); g != nil {
a.grid = g.(*widgets.GridView)
a.grid.Placeholder = myTheme.AlbumIcon
a.grid.Reset(widgets.NewGridViewAlbumIterator(iter))
} else {
a.grid = widgets.NewGridView(widgets.NewGridViewAlbumIterator(iter), im, myTheme.AlbumIcon)
}
contr.ConnectAlbumGridActions(a.grid) contr.ConnectAlbumGridActions(a.grid)
a.createSearchAndFilter() a.createSearchAndFilter()
a.createContainer() a.createContainer()
@@ -108,6 +116,7 @@ func (a *AlbumsPage) createContainer() {
func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage { func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage {
a := &AlbumsPage{ a := &AlbumsPage{
cfg: saved.cfg, cfg: saved.cfg,
pool: saved.pool,
contr: saved.contr, contr: saved.contr,
pm: saved.pm, pm: saved.pm,
mp: saved.mp, mp: saved.mp,
@@ -126,11 +135,16 @@ 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
state := saved.gridState
if a.searchText != "" { if a.searchText != "" {
a.sortOrder.Disable() a.sortOrder.Disable()
a.grid = widgets.NewGridViewFromState(saved.searchGridState) state = saved.searchGridState
}
if g := a.pool.Obtain(util.WidgetTypeGridView); g != nil {
a.grid = g.(*widgets.GridView)
a.grid.ResetFromState(state)
} else { } else {
a.grid = widgets.NewGridViewFromState(saved.gridState) a.grid = widgets.NewGridViewFromState(state)
} }
a.createSearchAndFilter() a.createSearchAndFilter()
a.createContainer() a.createContainer()
@@ -172,6 +186,7 @@ func (a *AlbumsPage) Reload() {
func (a *AlbumsPage) Save() SavedPage { func (a *AlbumsPage) Save() SavedPage {
sa := &savedAlbumsPage{ sa := &savedAlbumsPage{
cfg: a.cfg, cfg: a.cfg,
pool: a.pool,
contr: a.contr, contr: a.contr,
pm: a.pm, pm: a.pm,
mp: a.mp, mp: a.mp,
@@ -187,6 +202,8 @@ func (a *AlbumsPage) Save() SavedPage {
} else { } else {
sa.searchGridState = a.grid.SaveToState() sa.searchGridState = a.grid.SaveToState()
} }
a.grid.Clear()
a.pool.Release(util.WidgetTypeGridView, a.grid)
return sa return sa
} }
@@ -213,6 +230,7 @@ type savedAlbumsPage struct {
searchText string searchText string
filter mediaprovider.AlbumFilter filter mediaprovider.AlbumFilter
cfg *backend.AlbumsPageConfig cfg *backend.AlbumsPageConfig
pool *util.WidgetPool
contr *controller.Controller contr *controller.Controller
pm *backend.PlaybackManager pm *backend.PlaybackManager
mp mediaprovider.MediaProvider mp mediaprovider.MediaProvider
+11 -1
View File
@@ -129,6 +129,10 @@ func (a *ArtistPage) Save() SavedPage {
a.pool.Release(util.WidgetTypeTracklist, tl) a.pool.Release(util.WidgetTypeTracklist, tl)
} }
a.pool.Release(util.WidgetTypeArtistPageHeader, a.header) a.pool.Release(util.WidgetTypeArtistPageHeader, a.header)
if a.albumGrid != nil {
a.albumGrid.Clear()
a.pool.Release(util.WidgetTypeGridView, a.albumGrid)
}
return &s return &s
} }
@@ -186,7 +190,13 @@ func (a *ArtistPage) showAlbumGrid() {
Secondary: strconv.Itoa(al.Year), Secondary: strconv.Itoa(al.Year),
} }
}) })
a.albumGrid = widgets.NewFixedGridView(model, a.im, myTheme.AlbumIcon) if g := a.pool.Obtain(util.WidgetTypeGridView); g != nil {
a.albumGrid = g.(*widgets.GridView)
a.albumGrid.Placeholder = myTheme.AlbumIcon
a.albumGrid.ResetFixed(model)
} else {
a.albumGrid = widgets.NewFixedGridView(model, a.im, myTheme.AlbumIcon)
}
a.contr.ConnectAlbumGridActions(a.albumGrid) a.contr.ConnectAlbumGridActions(a.albumGrid)
} }
a.container.Objects[0].(*fyne.Container).Objects[0] = a.albumGrid a.container.Objects[0].(*fyne.Container).Objects[0] = a.albumGrid
+17 -3
View File
@@ -23,6 +23,7 @@ type ArtistsPage struct {
widget.BaseWidget widget.BaseWidget
contr *controller.Controller contr *controller.Controller
pool *util.WidgetPool
im *backend.ImageManager im *backend.ImageManager
pm *backend.PlaybackManager pm *backend.PlaybackManager
mp mediaprovider.MediaProvider mp mediaprovider.MediaProvider
@@ -40,15 +41,17 @@ type ArtistsPage struct {
func NewArtistsPage( func NewArtistsPage(
contr *controller.Controller, contr *controller.Controller,
pool *util.WidgetPool,
pm *backend.PlaybackManager, pm *backend.PlaybackManager,
mp mediaprovider.MediaProvider, mp mediaprovider.MediaProvider,
im *backend.ImageManager, im *backend.ImageManager,
) *ArtistsPage { ) *ArtistsPage {
return newArtistsPage(contr, pm, mp, im, "", 0, 0) return newArtistsPage(contr, pool, pm, mp, im, "", 0, 0)
} }
func newArtistsPage( func newArtistsPage(
contr *controller.Controller, contr *controller.Controller,
pool *util.WidgetPool,
pm *backend.PlaybackManager, pm *backend.PlaybackManager,
mp mediaprovider.MediaProvider, mp mediaprovider.MediaProvider,
im *backend.ImageManager, im *backend.ImageManager,
@@ -58,6 +61,7 @@ func newArtistsPage(
) *ArtistsPage { ) *ArtistsPage {
a := &ArtistsPage{ a := &ArtistsPage{
contr: contr, contr: contr,
pool: pool,
pm: pm, pm: pm,
mp: mp, mp: mp,
im: im, im: im,
@@ -74,7 +78,13 @@ func newArtistsPage(
a.searcher = widgets.NewSearchEntry() a.searcher = widgets.NewSearchEntry()
a.searcher.OnSearched = func(query string) { a.onSearched(query, false /*firstLoad*/) } a.searcher.OnSearched = func(query string) { a.onSearched(query, false /*firstLoad*/) }
a.searcher.Entry.Text = searchText a.searcher.Entry.Text = searchText
a.grid = widgets.NewFixedGridView(nil, a.im, myTheme.ArtistIcon) if g := pool.Obtain(util.WidgetTypeGridView); g != nil {
a.grid = g.(*widgets.GridView)
a.grid.Placeholder = myTheme.ArtistIcon
a.grid.Clear()
} else {
a.grid = widgets.NewFixedGridView(nil, a.im, myTheme.ArtistIcon)
}
a.contr.ConnectArtistGridActions(a.grid) a.contr.ConnectArtistGridActions(a.grid)
searchVbox := container.NewVBox(layout.NewSpacer(), a.searcher, layout.NewSpacer()) searchVbox := container.NewVBox(layout.NewSpacer(), a.searcher, layout.NewSpacer())
@@ -158,6 +168,7 @@ func (a *ArtistsPage) Route() controller.Route {
func (a *ArtistsPage) Save() SavedPage { func (a *ArtistsPage) Save() SavedPage {
s := &savedArtistsPage{ s := &savedArtistsPage{
contr: a.contr, contr: a.contr,
pool: a.pool,
im: a.im, im: a.im,
pm: a.pm, pm: a.pm,
mp: a.mp, mp: a.mp,
@@ -169,11 +180,14 @@ func (a *ArtistsPage) Save() SavedPage {
} else { } else {
s.searchGridScrollPos = a.grid.GetScrollOffset() s.searchGridScrollPos = a.grid.GetScrollOffset()
} }
a.grid.Clear()
a.pool.Release(util.WidgetTypeGridView, a.grid)
return s return s
} }
type savedArtistsPage struct { type savedArtistsPage struct {
contr *controller.Controller contr *controller.Controller
pool *util.WidgetPool
im *backend.ImageManager im *backend.ImageManager
pm *backend.PlaybackManager pm *backend.PlaybackManager
mp mediaprovider.MediaProvider mp mediaprovider.MediaProvider
@@ -183,5 +197,5 @@ type savedArtistsPage struct {
} }
func (s *savedArtistsPage) Restore() Page { func (s *savedArtistsPage) Restore() Page {
return newArtistsPage(s.contr, s.pm, s.mp, s.im, s.searchText, s.fullGridScrollPos, s.searchGridScrollPos) return newArtistsPage(s.contr, s.pool, s.pm, s.mp, s.im, s.searchText, s.fullGridScrollPos, s.searchGridScrollPos)
} }
+24 -5
View File
@@ -20,6 +20,7 @@ type GenrePage struct {
widget.BaseWidget widget.BaseWidget
genre string genre string
pool *util.WidgetPool
contr *controller.Controller contr *controller.Controller
im *backend.ImageManager im *backend.ImageManager
pm *backend.PlaybackManager pm *backend.PlaybackManager
@@ -37,9 +38,10 @@ type GenrePage struct {
container *fyne.Container container *fyne.Container
} }
func NewGenrePage(genre string, contr *controller.Controller, pm *backend.PlaybackManager, mp mediaprovider.MediaProvider, im *backend.ImageManager) *GenrePage { func NewGenrePage(genre string, pool *util.WidgetPool, contr *controller.Controller, pm *backend.PlaybackManager, mp mediaprovider.MediaProvider, im *backend.ImageManager) *GenrePage {
g := &GenrePage{ g := &GenrePage{
genre: genre, genre: genre,
pool: pool,
filter: mediaprovider.AlbumFilter{Genres: []string{genre}}, filter: mediaprovider.AlbumFilter{Genres: []string{genre}},
contr: contr, contr: contr,
pm: pm, pm: pm,
@@ -53,8 +55,14 @@ func NewGenrePage(genre string, contr *controller.Controller, pm *backend.Playba
SizeName: theme.SizeNameHeadingText, SizeName: theme.SizeNameHeadingText,
} }
g.playRandom = widget.NewButtonWithIcon(" Play random", myTheme.ShuffleIcon, g.playRandomSongs) g.playRandom = widget.NewButtonWithIcon(" Play random", myTheme.ShuffleIcon, g.playRandomSongs)
iter := g.mp.IterateAlbums("", g.filter) iter := widgets.NewGridViewAlbumIterator(g.mp.IterateAlbums("", g.filter))
g.grid = widgets.NewGridView(widgets.NewGridViewAlbumIterator(iter), g.im, myTheme.AlbumIcon) if gv := pool.Obtain(util.WidgetTypeGridView); gv != nil {
g.grid = gv.(*widgets.GridView)
g.grid.Placeholder = myTheme.AlbumIcon
g.grid.Reset(iter)
} else {
g.grid = widgets.NewGridView(iter, g.im, myTheme.AlbumIcon)
}
g.contr.ConnectAlbumGridActions(g.grid) g.contr.ConnectAlbumGridActions(g.grid)
g.createSearchAndFilter() g.createSearchAndFilter()
g.createContainer() g.createContainer()
@@ -85,6 +93,7 @@ func (g *GenrePage) createContainer() {
func restoreGenrePage(saved *savedGenrePage) *GenrePage { func restoreGenrePage(saved *savedGenrePage) *GenrePage {
g := &GenrePage{ g := &GenrePage{
genre: saved.genre, genre: saved.genre,
pool: saved.pool,
contr: saved.contr, contr: saved.contr,
pm: saved.pm, pm: saved.pm,
mp: saved.mp, mp: saved.mp,
@@ -101,10 +110,16 @@ func restoreGenrePage(saved *savedGenrePage) *GenrePage {
SizeName: theme.SizeNameHeadingText, SizeName: theme.SizeNameHeadingText,
} }
g.playRandom = widget.NewButtonWithIcon(" Play random", myTheme.ShuffleIcon, g.playRandomSongs) g.playRandom = widget.NewButtonWithIcon(" Play random", myTheme.ShuffleIcon, g.playRandomSongs)
state := saved.gridState
if g.searchText != "" { if g.searchText != "" {
g.grid = widgets.NewGridViewFromState(saved.searchGridState) state = saved.searchGridState
}
if gv := g.pool.Obtain(util.WidgetTypeGridView); gv != nil {
g.grid = gv.(*widgets.GridView)
g.grid.Placeholder = myTheme.AlbumIcon
g.grid.ResetFromState(state)
} else { } else {
g.grid = widgets.NewGridViewFromState(saved.gridState) g.grid = widgets.NewGridViewFromState(state)
} }
g.createSearchAndFilter() g.createSearchAndFilter()
g.createContainer() g.createContainer()
@@ -132,6 +147,7 @@ func (g *GenrePage) Reload() {
func (g *GenrePage) Save() SavedPage { func (g *GenrePage) Save() SavedPage {
sg := &savedGenrePage{ sg := &savedGenrePage{
genre: g.genre, genre: g.genre,
pool: g.pool,
filter: g.filter, filter: g.filter,
searchText: g.searchText, searchText: g.searchText,
contr: g.contr, contr: g.contr,
@@ -146,6 +162,8 @@ func (g *GenrePage) Save() SavedPage {
} else { } else {
sg.gridState = g.grid.SaveToState() sg.gridState = g.grid.SaveToState()
} }
g.grid.Clear()
g.pool.Release(util.WidgetTypeGridView, g.grid)
return sg return sg
} }
@@ -179,6 +197,7 @@ func (g *GenrePage) playRandomSongs() {
type savedGenrePage struct { type savedGenrePage struct {
genre string genre string
searchText string searchText string
pool *util.WidgetPool
filter mediaprovider.AlbumFilter filter mediaprovider.AlbumFilter
contr *controller.Controller contr *controller.Controller
pm *backend.PlaybackManager pm *backend.PlaybackManager
+23 -6
View File
@@ -13,6 +13,7 @@ import (
"github.com/dweymouth/supersonic/ui/controller" "github.com/dweymouth/supersonic/ui/controller"
"github.com/dweymouth/supersonic/ui/layouts" "github.com/dweymouth/supersonic/ui/layouts"
myTheme "github.com/dweymouth/supersonic/ui/theme" myTheme "github.com/dweymouth/supersonic/ui/theme"
"github.com/dweymouth/supersonic/ui/util"
"github.com/dweymouth/supersonic/ui/widgets" "github.com/dweymouth/supersonic/ui/widgets"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
@@ -25,6 +26,7 @@ import (
type PlaylistsPage struct { type PlaylistsPage struct {
widget.BaseWidget widget.BaseWidget
pool *util.WidgetPool
cfg *backend.PlaylistsPageConfig cfg *backend.PlaylistsPageConfig
contr *controller.Controller contr *controller.Controller
mp mediaprovider.MediaProvider mp mediaprovider.MediaProvider
@@ -39,16 +41,17 @@ type PlaylistsPage struct {
gridView *widgets.GridView gridView *widgets.GridView
} }
func NewPlaylistsPage(contr *controller.Controller, cfg *backend.PlaylistsPageConfig, mp mediaprovider.MediaProvider) *PlaylistsPage { func NewPlaylistsPage(contr *controller.Controller, pool *util.WidgetPool, cfg *backend.PlaylistsPageConfig, mp mediaprovider.MediaProvider) *PlaylistsPage {
activeView := 0 activeView := 0
if cfg.InitialView == "Grid" { if cfg.InitialView == "Grid" {
activeView = 1 activeView = 1
} }
return newPlaylistsPage(contr, cfg, mp, "", activeView) return newPlaylistsPage(contr, pool, cfg, mp, "", activeView)
} }
func newPlaylistsPage(contr *controller.Controller, cfg *backend.PlaylistsPageConfig, mp mediaprovider.MediaProvider, searchText string, activeView int) *PlaylistsPage { func newPlaylistsPage(contr *controller.Controller, pool *util.WidgetPool, cfg *backend.PlaylistsPageConfig, mp mediaprovider.MediaProvider, searchText string, activeView int) *PlaylistsPage {
a := &PlaylistsPage{ a := &PlaylistsPage{
pool: pool,
cfg: cfg, cfg: cfg,
mp: mp, mp: mp,
contr: contr, contr: contr,
@@ -95,7 +98,13 @@ func (a *PlaylistsPage) createListView() {
func (a *PlaylistsPage) createGridView(playlists []*mediaprovider.Playlist) { func (a *PlaylistsPage) createGridView(playlists []*mediaprovider.Playlist) {
model := createPlaylistGridViewModel(playlists) model := createPlaylistGridViewModel(playlists)
a.gridView = widgets.NewFixedGridView(model, a.contr.App.ImageManager, myTheme.PlaylistIcon) if g := a.pool.Obtain(util.WidgetTypeGridView); g != nil {
a.gridView = g.(*widgets.GridView)
a.gridView.Placeholder = myTheme.PlaylistIcon
a.gridView.ResetFixed(model)
} else {
a.gridView = widgets.NewFixedGridView(model, a.contr.App.ImageManager, myTheme.PlaylistIcon)
}
a.gridView.OnPlay = func(id string, shuffle bool) { a.gridView.OnPlay = func(id string, shuffle bool) {
go a.contr.App.PlaybackManager.PlayPlaylist(id, 0, shuffle) go a.contr.App.PlaybackManager.PlayPlaylist(id, 0, shuffle)
} }
@@ -103,6 +112,7 @@ func (a *PlaylistsPage) createGridView(playlists []*mediaprovider.Playlist) {
go a.contr.App.PlaybackManager.LoadPlaylist(id, true, false) go a.contr.App.PlaybackManager.LoadPlaylist(id, true, false)
} }
a.gridView.OnShowItemPage = a.showPlaylistPage a.gridView.OnShowItemPage = a.showPlaylistPage
a.gridView.OnShowSecondaryPage = nil
a.gridView.OnAddToPlaylist = func(id string) { a.gridView.OnAddToPlaylist = func(id string) {
go func() { go func() {
pl, err := a.contr.App.ServerManager.Server.GetPlaylist(id) pl, err := a.contr.App.ServerManager.Server.GetPlaylist(id)
@@ -221,17 +231,24 @@ func (a *PlaylistsPage) Reload() {
} }
func (a *PlaylistsPage) Save() SavedPage { func (a *PlaylistsPage) Save() SavedPage {
return &savedPlaylistsPage{ s := &savedPlaylistsPage{
contr: a.contr, contr: a.contr,
pool: a.pool,
cfg: a.cfg, cfg: a.cfg,
mp: a.mp, mp: a.mp,
searchText: a.searcher.Entry.Text, searchText: a.searcher.Entry.Text,
activeView: a.viewToggle.ActivatedButtonIndex(), activeView: a.viewToggle.ActivatedButtonIndex(),
} }
if a.gridView != nil {
a.gridView.Clear()
a.pool.Release(util.WidgetTypeGridView, a.gridView)
}
return s
} }
type savedPlaylistsPage struct { type savedPlaylistsPage struct {
contr *controller.Controller contr *controller.Controller
pool *util.WidgetPool
cfg *backend.PlaylistsPageConfig cfg *backend.PlaylistsPageConfig
mp mediaprovider.MediaProvider mp mediaprovider.MediaProvider
searchText string searchText string
@@ -239,7 +256,7 @@ type savedPlaylistsPage struct {
} }
func (s *savedPlaylistsPage) Restore() Page { func (s *savedPlaylistsPage) Restore() Page {
return newPlaylistsPage(s.contr, s.cfg, s.mp, s.searchText, s.activeView) return newPlaylistsPage(s.contr, s.pool, s.cfg, s.mp, s.searchText, s.activeView)
} }
func (a *PlaylistsPage) buildContainer(initialView fyne.CanvasObject) { func (a *PlaylistsPage) buildContainer(initialView fyne.CanvasObject) {
+4 -4
View File
@@ -33,15 +33,15 @@ func (r Router) CreatePage(rte controller.Route) Page {
case controller.Album: case controller.Album:
return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, &r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller) return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, &r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller)
case controller.Albums: case controller.Albums:
return NewAlbumsPage(&r.App.Config.AlbumsPage, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager) return NewAlbumsPage(&r.App.Config.AlbumsPage, &r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
case controller.Artist: case controller.Artist:
return NewArtistPage(rte.Arg, &r.App.Config.ArtistPage, &r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller) return NewArtistPage(rte.Arg, &r.App.Config.ArtistPage, &r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller)
case controller.Artists: case controller.Artists:
return NewArtistsPage(r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager) return NewArtistsPage(r.Controller, &r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
case controller.Favorites: case controller.Favorites:
return NewFavoritesPage(&r.App.Config.FavoritesPage, &r.widgetPool, r.Controller, r.App.ServerManager.Server, r.App.PlaybackManager, r.App.ImageManager) return NewFavoritesPage(&r.App.Config.FavoritesPage, &r.widgetPool, r.Controller, r.App.ServerManager.Server, r.App.PlaybackManager, r.App.ImageManager)
case controller.Genre: case controller.Genre:
return NewGenrePage(rte.Arg, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager) return NewGenrePage(rte.Arg, &r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
case controller.Genres: case controller.Genres:
return NewGenresPage(r.Controller, r.App.ServerManager.Server) return NewGenresPage(r.Controller, r.App.ServerManager.Server)
case controller.NowPlaying: case controller.NowPlaying:
@@ -49,7 +49,7 @@ func (r Router) CreatePage(rte controller.Route) Page {
case controller.Playlist: case controller.Playlist:
return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, &r.widgetPool, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager) return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, &r.widgetPool, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager)
case controller.Playlists: case controller.Playlists:
return NewPlaylistsPage(r.Controller, &r.App.Config.PlaylistsPage, r.App.ServerManager.Server) return NewPlaylistsPage(r.Controller, &r.widgetPool, &r.App.Config.PlaylistsPage, r.App.ServerManager.Server)
case controller.Tracks: case controller.Tracks:
return NewTracksPage(r.Controller, &r.App.Config.TracksPage, &r.widgetPool, r.App.ServerManager.Server) return NewTracksPage(r.Controller, &r.App.Config.TracksPage, &r.widgetPool, r.App.ServerManager.Server)
} }
+1
View File
@@ -11,6 +11,7 @@ type WidgetType int
const ( const (
WidgetTypeAlbumPageHeader WidgetType = iota WidgetTypeAlbumPageHeader WidgetType = iota
WidgetTypeArtistPageHeader WidgetTypeArtistPageHeader
WidgetTypeGridView
WidgetTypePlaylistPageHeader WidgetTypePlaylistPageHeader
WidgetTypeTracklist WidgetTypeTracklist
+5 -4
View File
@@ -82,7 +82,7 @@ type GridViewState struct {
items []GridViewItemModel items []GridViewItemModel
iter GridViewIterator iter GridViewIterator
imageFetcher ImageFetcher imageFetcher ImageFetcher
placeholder fyne.Resource Placeholder fyne.Resource
highestShown int highestShown int
done bool done bool
@@ -104,7 +104,7 @@ func NewFixedGridView(items []GridViewItemModel, fetch ImageFetcher, placeholder
items: items, items: items,
done: true, done: true,
imageFetcher: fetch, imageFetcher: fetch,
placeholder: placeholder, Placeholder: placeholder,
}, },
} }
g.ExtendBaseWidget(g) g.ExtendBaseWidget(g)
@@ -117,7 +117,7 @@ func NewGridView(iter GridViewIterator, fetch ImageFetcher, placeholder fyne.Res
GridViewState: GridViewState{ GridViewState: GridViewState{
iter: iter, iter: iter,
imageFetcher: fetch, imageFetcher: fetch,
placeholder: placeholder, Placeholder: placeholder,
}, },
} }
g.ExtendBaseWidget(g) g.ExtendBaseWidget(g)
@@ -213,7 +213,7 @@ func (g *GridView) createGridWrap() {
}, },
// create func // create func
func() fyne.CanvasObject { func() fyne.CanvasObject {
card := NewGridViewItem(g.placeholder) card := NewGridViewItem(g.Placeholder)
card.OnPlay = func(shuffle bool) { card.OnPlay = func(shuffle bool) {
if g.OnPlay != nil { if g.OnPlay != nil {
g.OnPlay(card.ItemID(), shuffle) g.OnPlay(card.ItemID(), shuffle)
@@ -266,6 +266,7 @@ func (g *GridView) doUpdateItemCard(itemIdx int, card *GridViewItem) {
item = g.items[itemIdx] item = g.items[itemIdx]
} }
g.stateMutex.RUnlock() g.stateMutex.RUnlock()
card.Cover.Im.CenterIcon = g.Placeholder
if card.PrevID == item.ID { if card.PrevID == item.ID {
// nothing to do // nothing to do
return return
+4
View File
@@ -191,6 +191,10 @@ func (g *GridViewItem) Update(model GridViewItemModel) {
g.Cover.playbtn.Hidden = true g.Cover.playbtn.Hidden = true
} }
func (g *GridViewItem) Refresh() {
g.BaseWidget.Refresh()
}
func (g *GridViewItem) ItemID() string { func (g *GridViewItem) ItemID() string {
return g.itemID return g.itemID
} }
+4 -2
View File
@@ -15,7 +15,8 @@ import (
// a placeholder with a rectangular border frame // a placeholder with a rectangular border frame
// and an icon positioned in the center of the frame. // and an icon positioned in the center of the frame.
type ImagePlaceholder struct { type ImagePlaceholder struct {
ScaleMode canvas.ImageScale ScaleMode canvas.ImageScale
CenterIcon fyne.Resource
widget.BaseWidget widget.BaseWidget
content *fyne.Container content *fyne.Container
@@ -30,7 +31,7 @@ type ImagePlaceholder struct {
} }
func NewImagePlaceholder(centerIcon fyne.Resource, minSize float32) *ImagePlaceholder { func NewImagePlaceholder(centerIcon fyne.Resource, minSize float32) *ImagePlaceholder {
i := &ImagePlaceholder{minSize: minSize} i := &ImagePlaceholder{minSize: minSize, CenterIcon: centerIcon}
i.ExtendBaseWidget(i) i.ExtendBaseWidget(i)
i.iconImage = canvas.NewImageFromResource(centerIcon) i.iconImage = canvas.NewImageFromResource(centerIcon)
i.iconImage.FillMode = canvas.ImageFillContain i.iconImage.FillMode = canvas.ImageFillContain
@@ -86,6 +87,7 @@ func (i *ImagePlaceholder) MinSize() fyne.Size {
func (i *ImagePlaceholder) Refresh() { func (i *ImagePlaceholder) Refresh() {
i.border.Hidden = i.HaveImage() i.border.Hidden = i.HaveImage()
i.iconImage.Resource = i.CenterIcon
i.iconImage.Hidden = i.HaveImage() i.iconImage.Hidden = i.HaveImage()
i.imageDisp.Hidden = !i.HaveImage() i.imageDisp.Hidden = !i.HaveImage()
i.imageDisp.ScaleMode = i.ScaleMode i.imageDisp.ScaleMode = i.ScaleMode