From 4730b7403906f4b3f211b4df1f8420dc2d1b4d9b Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 12 May 2023 09:22:49 -0700 Subject: [PATCH] add album filters to genre page --- ui/browsing/albumspage.go | 8 ++--- ui/browsing/genrepage.go | 58 +++++++++++++++++++-------------- ui/widgets/albumfilterbutton.go | 10 ++++-- 3 files changed, 46 insertions(+), 30 deletions(-) diff --git a/ui/browsing/albumspage.go b/ui/browsing/albumspage.go index f18b3cc..11e2c25 100644 --- a/ui/browsing/albumspage.go +++ b/ui/browsing/albumspage.go @@ -76,15 +76,15 @@ func NewAlbumsPage(cfg *backend.AlbumsPageConfig, contr *controller.Controller, iter := lm.AlbumsIter(backend.AlbumSortOrder(a.sortOrder.Selected), a.filter) a.grid = widgets.NewGridView(widgets.NewGridViewAlbumIterator(iter), im) contr.ConnectAlbumGridActions(a.grid) - a.createSearchAndFilter("") + a.createSearchAndFilter() a.createContainer(false) return a } -func (a *AlbumsPage) createSearchAndFilter(searchText string) { +func (a *AlbumsPage) createSearchAndFilter() { a.searcher = widgets.NewSearchEntry() - a.searcher.Text = searchText + a.searcher.Text = a.searchText a.searcher.OnSearched = a.OnSearched a.filterBtn = widgets.NewAlbumFilterButton(&a.filter) a.filterBtn.OnChanged = a.Reload @@ -129,7 +129,7 @@ func restoreAlbumsPage(saved *savedAlbumsPage) *AlbumsPage { if a.searchText != "" { a.searchGrid = widgets.NewGridViewFromState(saved.searchGridState) } - a.createSearchAndFilter(saved.searchText) + a.createSearchAndFilter() a.createContainer(saved.searchText != "") return a diff --git a/ui/browsing/genrepage.go b/ui/browsing/genrepage.go index e901113..f53de6e 100644 --- a/ui/browsing/genrepage.go +++ b/ui/browsing/genrepage.go @@ -27,6 +27,8 @@ type GenrePage struct { searchGrid *widgets.GridView searcher *widgets.SearchEntry searchText string + filter backend.AlbumFilter + filterBtn *widgets.AlbumFilterButton titleDisp *widget.RichText playRandom *widget.Button @@ -37,11 +39,12 @@ type GenrePage struct { func NewGenrePage(genre string, contr *controller.Controller, pm *backend.PlaybackManager, lm *backend.LibraryManager, im *backend.ImageManager) *GenrePage { g := &GenrePage{ - genre: genre, - contr: contr, - pm: pm, - lm: lm, - im: im, + genre: genre, + filter: backend.AlbumFilter{Genres: []string{genre}}, + contr: contr, + pm: pm, + lm: lm, + im: im, } g.ExtendBaseWidget(g) @@ -50,16 +53,24 @@ func NewGenrePage(genre string, contr *controller.Controller, pm *backend.Playba SizeName: theme.SizeNameHeadingText, } g.playRandom = widget.NewButtonWithIcon(" Play random", myTheme.ShuffleIcon, g.playRandomSongs) - iter := g.lm.GenreIter(g.genre, backend.AlbumFilter{}) + iter := g.lm.GenreIter(g.genre, g.filter) g.grid = widgets.NewGridView(widgets.NewGridViewAlbumIterator(iter), g.im) g.contr.ConnectAlbumGridActions(g.grid) - g.searcher = widgets.NewSearchEntry() - g.searcher.OnSearched = g.OnSearched + g.createSearchAndFilter() g.createContainer(false) return g } +func (g *GenrePage) createSearchAndFilter() { + g.searcher = widgets.NewSearchEntry() + g.searcher.Text = g.searchText + g.searcher.OnSearched = g.OnSearched + g.filterBtn = widgets.NewAlbumFilterButton(&g.filter) + g.filterBtn.GenreDisabled = true + g.filterBtn.OnChanged = g.Reload +} + func (g *GenrePage) createContainer(searchGrid bool) { searchVbox := container.NewVBox(layout.NewSpacer(), g.searcher, layout.NewSpacer()) gr := g.grid @@ -68,21 +79,21 @@ func (g *GenrePage) createContainer(searchGrid bool) { } playRandomVbox := container.NewVBox(layout.NewSpacer(), g.playRandom, layout.NewSpacer()) g.container = container.NewBorder( - container.NewHBox(util.NewHSpace(6), g.titleDisp, playRandomVbox, layout.NewSpacer(), searchVbox, util.NewHSpace(15)), - nil, - nil, - nil, - gr, + container.NewHBox(util.NewHSpace(6), + g.titleDisp, playRandomVbox, layout.NewSpacer(), container.NewCenter(g.filterBtn), searchVbox, util.NewHSpace(15)), + nil, nil, nil, gr, ) } func restoreGenrePage(saved *savedGenrePage) *GenrePage { g := &GenrePage{ - genre: saved.genre, - contr: saved.contr, - pm: saved.pm, - lm: saved.lm, - im: saved.im, + genre: saved.genre, + contr: saved.contr, + pm: saved.pm, + lm: saved.lm, + im: saved.im, + searchText: saved.searchText, + filter: saved.filter, } g.ExtendBaseWidget(g) @@ -92,10 +103,7 @@ func restoreGenrePage(saved *savedGenrePage) *GenrePage { } g.playRandom = widget.NewButtonWithIcon(" Play random", myTheme.ShuffleIcon, g.playRandomSongs) g.grid = widgets.NewGridViewFromState(saved.gridState) - g.searcher = widgets.NewSearchEntry() - g.searcher.OnSearched = g.OnSearched - g.searcher.Entry.Text = saved.searchText - g.searchText = saved.searchText + g.createSearchAndFilter() if g.searchText != "" { g.searchGrid = widgets.NewGridViewFromState(saved.searchGridState) } @@ -116,7 +124,7 @@ func (g *GenrePage) Reload() { if g.searchText != "" { g.doSearch(g.searchText) } else { - iter := g.lm.GenreIter(g.genre, backend.AlbumFilter{}) + iter := g.lm.GenreIter(g.genre, g.filter) g.grid.Reset(widgets.NewGridViewAlbumIterator(iter)) g.grid.Refresh() } @@ -125,6 +133,7 @@ func (g *GenrePage) Reload() { func (g *GenrePage) Save() SavedPage { sg := &savedGenrePage{ genre: g.genre, + filter: g.filter, searchText: g.searchText, contr: g.contr, pm: g.pm, @@ -158,7 +167,7 @@ func (g *GenrePage) OnSearched(query string) { } func (g *GenrePage) doSearch(query string) { - iter := g.lm.SearchIterWithFilter(query, backend.AlbumFilter{Genres: []string{g.genre}}) + iter := g.lm.SearchIterWithFilter(query, g.filter) if g.searchGrid == nil { g.searchGrid = widgets.NewGridView(widgets.NewGridViewAlbumIterator(iter), g.im) g.contr.ConnectAlbumGridActions(g.searchGrid) @@ -176,6 +185,7 @@ func (g *GenrePage) playRandomSongs() { type savedGenrePage struct { genre string searchText string + filter backend.AlbumFilter contr *controller.Controller pm *backend.PlaybackManager lm *backend.LibraryManager diff --git a/ui/widgets/albumfilterbutton.go b/ui/widgets/albumfilterbutton.go index 0d45e7e..e7d9e26 100644 --- a/ui/widgets/albumfilterbutton.go +++ b/ui/widgets/albumfilterbutton.go @@ -17,7 +17,8 @@ import ( type AlbumFilterButton struct { widget.Button - OnChanged func() + OnChanged func() + GenreDisabled bool filter *backend.AlbumFilter dialog *widget.PopUp @@ -36,7 +37,7 @@ func NewAlbumFilterButton(filter *backend.AlbumFilter) *AlbumFilterButton { } func (a *AlbumFilterButton) Refresh() { - if a.filter.IsEmpty() { + if a.filter.IsEmpty() || (a.GenreDisabled && a.filterEmptyExceptGenre()) { a.Importance = widget.MediumImportance } else { a.Importance = widget.HighImportance @@ -44,6 +45,11 @@ func (a *AlbumFilterButton) Refresh() { a.Button.Refresh() } +func (a *AlbumFilterButton) filterEmptyExceptGenre() bool { + return !a.filter.ExcludeFavorited && !a.filter.ExcludeUnfavorited && + a.filter.MinYear == 0 && a.filter.MaxYear == 0 +} + func (a *AlbumFilterButton) onFilterChanged() { a.Refresh() if a.OnChanged != nil {