reuse grid view across several pages
This commit is contained in:
@@ -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,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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ type WidgetType int
|
|||||||
const (
|
const (
|
||||||
WidgetTypeAlbumPageHeader WidgetType = iota
|
WidgetTypeAlbumPageHeader WidgetType = iota
|
||||||
WidgetTypeArtistPageHeader
|
WidgetTypeArtistPageHeader
|
||||||
|
WidgetTypeGridView
|
||||||
WidgetTypePlaylistPageHeader
|
WidgetTypePlaylistPageHeader
|
||||||
WidgetTypeTracklist
|
WidgetTypeTracklist
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user