From 3074034e4452223d7f48c5ca72d514e56668c1c5 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 6 Jan 2023 15:29:49 -0800 Subject: [PATCH] move search bar to within albums page (right hand side) --- ui/browsing/albumspage.go | 6 +++- ui/browsing/browsingpane.go | 58 +--------------------------------- ui/widgets/searcher.go | 63 +++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 58 deletions(-) create mode 100644 ui/widgets/searcher.go diff --git a/ui/browsing/albumspage.go b/ui/browsing/albumspage.go index 13fafb4..0fab219 100644 --- a/ui/browsing/albumspage.go +++ b/ui/browsing/albumspage.go @@ -21,6 +21,7 @@ type AlbumsPage struct { nav func(Route) grid *widgets.AlbumGrid searchGrid *widgets.AlbumGrid + searcher *widgets.Searcher searchText string titleDisp *widget.RichText sortOrder *selectWidget @@ -70,8 +71,11 @@ func NewAlbumsPage(title string, sortOrder string, lm *backend.LibraryManager, i a.grid.OnPlayAlbum = a.onPlayAlbum a.grid.OnShowArtistPage = a.onShowArtistPage a.grid.OnShowAlbumPage = a.onShowAlbumPage + a.searcher = widgets.NewSearcher() + a.searcher.OnSearched = a.OnSearched + searchVbox := container.NewVBox(layout.NewSpacer(), a.searcher.Entry, layout.NewSpacer()) a.container = container.NewBorder( - container.NewHBox(widgets.NewHSpace(9), a.titleDisp, sortVbox), + container.NewHBox(widgets.NewHSpace(9), a.titleDisp, sortVbox, layout.NewSpacer(), searchVbox, widgets.NewHSpace(15)), nil, nil, nil, diff --git a/ui/browsing/browsingpane.go b/ui/browsing/browsingpane.go index d92e86b..fc8625e 100644 --- a/ui/browsing/browsingpane.go +++ b/ui/browsing/browsingpane.go @@ -3,9 +3,6 @@ package browsing import ( "image/color" "supersonic/backend" - "supersonic/ui/widgets" - "sync" - "time" "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" @@ -23,10 +20,6 @@ type Page interface { Route() Route } -type Searchable interface { - OnSearched(string) -} - type CanPlayAlbum interface { SetPlayAlbumCallback(func(albumID string, startingTrack int)) } @@ -52,11 +45,6 @@ type BrowsingPane struct { history []Page historyIdx int - searchBar *widgets.SearchEntry - pendingSearchLock sync.Mutex - pendingSearch bool - searchGoroutine bool - pageContainer *fyne.Container container *fyne.Container } @@ -64,8 +52,6 @@ type BrowsingPane struct { func NewBrowsingPane(app *backend.App) *BrowsingPane { b := &BrowsingPane{app: app} b.ExtendBaseWidget(b) - b.searchBar = widgets.NewSearchEntry() - b.searchBar.OnTextChanged = b.onSearchTextChanged b.home = widget.NewButtonWithIcon("", theme.HomeIcon(), b.goHome) b.back = widget.NewButtonWithIcon("", theme.NavigateBackIcon(), b.GoBack) b.forward = widget.NewButtonWithIcon("", theme.NavigateNextIcon(), b.GoForward) @@ -75,7 +61,7 @@ func NewBrowsingPane(app *backend.App) *BrowsingPane { canvas.NewRectangle(color.RGBA{R: 24, G: 24, B: 24, A: 255}), layout.NewSpacer()) b.container = container.NewBorder( - container.NewHBox(b.home, b.back, b.forward, b.reload, b.searchBar), + container.NewHBox(b.home, b.back, b.forward, b.reload), nil, nil, nil, b.pageContainer) return b } @@ -99,8 +85,6 @@ func (b *BrowsingPane) doSetPage(p Page) bool { if np, ok := p.(CanShowNowPlaying); ok { np.OnSongChange(b.app.PlaybackManager.NowPlaying()) } - _, s := p.(Searchable) - b.searchBar.Hidden = !s b.pageContainer.Objects[1] = p b.Refresh() return true @@ -147,46 +131,6 @@ func (b *BrowsingPane) Reload() { } } -func (b *BrowsingPane) onSearchTextChanged(text string) { - if text == "" { - b.sendSearch("") - return - } - b.pendingSearchLock.Lock() - defer b.pendingSearchLock.Unlock() - b.pendingSearch = true - if !b.searchGoroutine { - go b.waitAndSearch() - b.searchGoroutine = true - } -} - -func (b *BrowsingPane) waitAndSearch() { - t := time.NewTicker(200 * time.Millisecond) - var getReadyToSearch bool - var done bool - for !done { - <-t.C - b.pendingSearchLock.Lock() - if b.pendingSearch { - getReadyToSearch = true - b.pendingSearch = false - } else if getReadyToSearch { - b.sendSearch(b.searchBar.Text) - t.Stop() - b.searchGoroutine = false - done = true - } - b.pendingSearchLock.Unlock() - } -} - -func (b *BrowsingPane) sendSearch(query string) { - if s, ok := b.curPage.(Searchable); ok { - s.OnSearched(query) - } -} - func (b *BrowsingPane) CreateRenderer() fyne.WidgetRenderer { return widget.NewSimpleRenderer(b.container) } diff --git a/ui/widgets/searcher.go b/ui/widgets/searcher.go new file mode 100644 index 0000000..323b25b --- /dev/null +++ b/ui/widgets/searcher.go @@ -0,0 +1,63 @@ +package widgets + +import ( + "sync" + "time" +) + +type Searcher struct { + Entry *SearchEntry + OnSearched func(string) + + searchGoroutine bool + pendingSearch bool + pendingSearchLock sync.Mutex +} + +func NewSearcher() *Searcher { + s := &Searcher{ + Entry: NewSearchEntry(), + } + s.Entry.OnTextChanged = s.onSearchTextChanged + return s +} + +func (s *Searcher) onSearchTextChanged(text string) { + if text == "" { + s.sendSearch("") + return + } + s.pendingSearchLock.Lock() + defer s.pendingSearchLock.Unlock() + s.pendingSearch = true + if !s.searchGoroutine { + go s.waitAndSearch() + s.searchGoroutine = true + } +} + +func (s *Searcher) waitAndSearch() { + t := time.NewTicker(200 * time.Millisecond) + var getReadyToSearch bool + var done bool + for !done { + <-t.C + s.pendingSearchLock.Lock() + if s.pendingSearch { + getReadyToSearch = true + s.pendingSearch = false + } else if getReadyToSearch { + s.sendSearch(s.Entry.Text) + t.Stop() + s.searchGoroutine = false + done = true + } + s.pendingSearchLock.Unlock() + } +} + +func (s *Searcher) sendSearch(text string) { + if s.OnSearched != nil { + s.OnSearched(text) + } +}