begin work on adding search to albums page

This commit is contained in:
Drew Weymouth
2022-12-27 09:50:51 -08:00
parent d04a586cd6
commit fc858e1024
5 changed files with 180 additions and 12 deletions
+4 -3
View File
@@ -146,9 +146,10 @@ type searchIter struct {
func (l *LibraryManager) newSearchIter(query string) *searchIter { func (l *LibraryManager) newSearchIter(query string) *searchIter {
return &searchIter{ return &searchIter{
query: query, query: query,
l: l, l: l,
s: l.s.Server, s: l.s.Server,
albumIDset: make(map[string]bool),
} }
} }
+3
View File
@@ -2,6 +2,7 @@ package ui
import ( import (
"context" "context"
"fmt"
"image" "image"
"supersonic/backend" "supersonic/backend"
"supersonic/ui/widgets" "supersonic/ui/widgets"
@@ -84,7 +85,9 @@ func (ag *AlbumGrid) doUpdateAlbumCard(albumIdx int, ac *widgets.AlbumCard) {
return return
default: default:
if err == nil { if err == nil {
fmt.Println("setting image")
ac.Cover.SetImage(i) ac.Cover.SetImage(i)
ag.Refresh()
} }
} }
}(ctx) }(ctx)
+57
View File
@@ -0,0 +1,57 @@
package ui
import (
"log"
"supersonic/backend"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
var _ fyne.Widget = (*AlbumsPage)(nil)
type AlbumsPage struct {
widget.BaseWidget
im *backend.ImageManager
lm *backend.LibraryManager
grid *AlbumGrid
searchGrid *AlbumGrid
gridContainer *fyne.Container
OnPlayAlbum func(string)
}
func NewAlbumsPage(title string, lm *backend.LibraryManager, im *backend.ImageManager) *AlbumsPage {
a := &AlbumsPage{
lm: lm,
im: im,
}
a.ExtendBaseWidget(a)
a.grid = NewAlbumGrid(lm.RecentlyAddedIter(), im.GetAlbumThumbnail)
a.grid.OnPlayAlbum = func(id string) {
if a.OnPlayAlbum != nil {
a.OnPlayAlbum(id)
}
}
a.gridContainer = container.NewMax(a.grid)
return a
}
func (a *AlbumsPage) OnSearched(query string) {
if query == "" {
a.gridContainer.Objects[0] = a.grid
a.searchGrid = nil
a.Refresh()
return
}
log.Printf("searched %s", query)
a.searchGrid = NewAlbumGrid(a.lm.SearchIter(query), a.im.GetAlbumThumbnail)
a.gridContainer.Objects[0] = a.searchGrid
a.Refresh()
}
func (a *AlbumsPage) CreateRenderer() fyne.WidgetRenderer {
a.ExtendBaseWidget(a)
return widget.NewSimpleRenderer(a.gridContainer)
}
+104
View File
@@ -0,0 +1,104 @@
package ui
import (
"context"
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
type Page interface {
fyne.Widget
}
type Searchable interface {
OnSearched(string)
}
type BrowsingPane struct {
widget.BaseWidget
searchBar *searchField
searchTimer time.Timer
pendingSearch bool
cancelPendingSearch context.CancelFunc
curPage Page
container *fyne.Container
pageContaner *fyne.Container
}
type blankPage struct {
widget.Separator
}
type searchField struct {
widget.Entry
height float32
}
func NewSearchField() *searchField {
sf := &searchField{}
sf.ExtendBaseWidget(sf)
// this is a bit hacky
sf.height = widget.NewEntry().MinSize().Height
sf.PlaceHolder = "Search"
return sf
}
func (s *searchField) MinSize() fyne.Size {
return fyne.NewSize(200, s.height)
}
func NewBrowsingPane() *BrowsingPane {
b := &BrowsingPane{}
b.ExtendBaseWidget(b)
b.searchBar = NewSearchField()
b.searchBar.OnChanged = b.onSearchTextChanged
b.curPage = &blankPage{}
b.searchTimer = *time.NewTimer(0)
b.pageContaner = container.NewMax(b.curPage)
b.container = container.NewBorder(container.NewHBox(b.searchBar), nil, nil, nil, b.pageContaner)
return b
}
func (b *BrowsingPane) SetPage(p Page) {
if b.cancelPendingSearch != nil {
b.cancelPendingSearch()
b.cancelPendingSearch = nil
}
b.curPage = p
b.pageContaner.Objects[0] = p
b.Refresh()
}
func (b *BrowsingPane) onSearchTextChanged(text string) {
b.searchTimer.Reset(300 * time.Millisecond)
if s, ok := b.curPage.(Searchable); ok {
s.OnSearched(text)
}
if !b.pendingSearch {
/*
ctx, cancel := context.WithCancel(context.Background())
b.cancelPendingSearch = cancel
b.pendingSearch = true
go func(ctx context.Context) {
select {
case <-ctx.Done():
b.pendingSearch = false
case <-b.searchTimer.C:
if s, ok := b.curPage.(Searchable); ok {
s.OnSearched(b.searchBar.Text)
}
b.pendingSearch = false
}
}(ctx)
*/
}
}
func (b *BrowsingPane) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(b.container)
}
+12 -9
View File
@@ -6,7 +6,6 @@ import (
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/dweymouth/go-subsonic" "github.com/dweymouth/go-subsonic"
) )
@@ -14,18 +13,22 @@ import (
type MainWindow struct { type MainWindow struct {
Window fyne.Window Window fyne.Window
BottomPanel *BottomPanel BrowsingPane *BrowsingPane
BottomPanel *BottomPanel
container *fyne.Container
} }
func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindow { func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindow {
m := MainWindow{ m := MainWindow{
Window: fyneApp.NewWindow(appName), Window: fyneApp.NewWindow(appName),
BottomPanel: NewBottomPanel(app.Player), BrowsingPane: NewBrowsingPane(),
BottomPanel: NewBottomPanel(app.Player),
} }
m.BottomPanel.SetPlaybackManager(app.PlaybackManager) m.BottomPanel.SetPlaybackManager(app.PlaybackManager)
m.BottomPanel.ImageManager = app.ImageManager m.BottomPanel.ImageManager = app.ImageManager
c := container.NewBorder(nil, m.BottomPanel, nil, nil, &layout.Spacer{}) m.container = container.NewBorder(nil, m.BottomPanel, nil, nil, m.BrowsingPane)
m.Window.SetContent(c) m.Window.SetContent(m.container)
m.Window.Resize(fyne.NewSize(1000, 800)) m.Window.Resize(fyne.NewSize(1000, 800))
app.PlaybackManager.OnSongChange(func(song *subsonic.Child) { app.PlaybackManager.OnSongChange(func(song *subsonic.Child) {
if song == nil { if song == nil {
@@ -35,11 +38,11 @@ func NewMainWindow(fyneApp fyne.App, appName string, app *backend.App) MainWindo
m.Window.SetTitle(song.Title) m.Window.SetTitle(song.Title)
}) })
app.ServerManager.OnServerConnected(func() { app.ServerManager.OnServerConnected(func() {
ag := NewAlbumGrid(app.LibraryManager.RecentlyAddedIter(), app.ImageManager.GetAlbumThumbnail) ap := NewAlbumsPage("Albums", app.LibraryManager, app.ImageManager)
ag.OnPlayAlbum = func(albumID string) { ap.OnPlayAlbum = func(albumID string) {
_ = app.PlaybackManager.PlayAlbum(albumID) _ = app.PlaybackManager.PlayAlbum(albumID)
} }
m.Window.SetContent(container.NewBorder(nil, m.BottomPanel, nil, nil, ag)) m.BrowsingPane.SetPage(ap)
}) })
return m return m
} }