add search to tracks page
This commit is contained in:
@@ -14,10 +14,13 @@ func (l *LibraryManager) AllTracksIterator() TrackIterator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *LibraryManager) SearchTracksIterator(query string) TrackIterator {
|
func (l *LibraryManager) SearchTracksIterator(query string) TrackIterator {
|
||||||
return &searchTracksIterator{searchIterBase: searchIterBase{
|
return &searchTracksIterator{
|
||||||
|
searchIterBase: searchIterBase{
|
||||||
s: l.s.Server,
|
s: l.s.Server,
|
||||||
query: query,
|
query: query,
|
||||||
}}
|
},
|
||||||
|
trackIDset: make(map[string]bool),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type allTracksIterator struct {
|
type allTracksIterator struct {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"supersonic/res"
|
"supersonic/res"
|
||||||
"supersonic/ui/controller"
|
"supersonic/ui/controller"
|
||||||
"supersonic/ui/layouts"
|
"supersonic/ui/layouts"
|
||||||
|
"supersonic/ui/util"
|
||||||
"supersonic/ui/widgets"
|
"supersonic/ui/widgets"
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
@@ -19,13 +20,17 @@ type TracksPage struct {
|
|||||||
tracksPageState
|
tracksPageState
|
||||||
|
|
||||||
title *widget.RichText
|
title *widget.RichText
|
||||||
|
searcher *widgets.Searcher
|
||||||
tracklist *widgets.Tracklist
|
tracklist *widgets.Tracklist
|
||||||
loader widgets.TracklistLoader
|
loader widgets.TracklistLoader
|
||||||
|
searchTracklist *widgets.Tracklist
|
||||||
|
searchLoader widgets.TracklistLoader
|
||||||
playRandom *widget.Button
|
playRandom *widget.Button
|
||||||
container *fyne.Container
|
container *fyne.Container
|
||||||
}
|
}
|
||||||
|
|
||||||
type tracksPageState struct {
|
type tracksPageState struct {
|
||||||
|
searchText string
|
||||||
contr *controller.Controller
|
contr *controller.Controller
|
||||||
conf *backend.TracksPageConfig
|
conf *backend.TracksPageConfig
|
||||||
lm *backend.LibraryManager
|
lm *backend.LibraryManager
|
||||||
@@ -41,6 +46,8 @@ func NewTracksPage(contr *controller.Controller, conf *backend.TracksPageConfig,
|
|||||||
t.title = widget.NewRichTextWithText("All Tracks")
|
t.title = widget.NewRichTextWithText("All Tracks")
|
||||||
t.title.Segments[0].(*widget.TextSegment).Style.SizeName = widget.RichTextStyleHeading.SizeName
|
t.title.Segments[0].(*widget.TextSegment).Style.SizeName = widget.RichTextStyleHeading.SizeName
|
||||||
t.playRandom = widget.NewButtonWithIcon("Play random", res.ResShuffleInvertSvg, t.playRandomSongs)
|
t.playRandom = widget.NewButtonWithIcon("Play random", res.ResShuffleInvertSvg, t.playRandomSongs)
|
||||||
|
t.searcher = widgets.NewSearcher()
|
||||||
|
t.searcher.OnSearched = t.OnSearched
|
||||||
t.createContainer()
|
t.createContainer()
|
||||||
t.Reload()
|
t.Reload()
|
||||||
return t
|
return t
|
||||||
@@ -48,7 +55,8 @@ func NewTracksPage(contr *controller.Controller, conf *backend.TracksPageConfig,
|
|||||||
|
|
||||||
func (t *TracksPage) createContainer() {
|
func (t *TracksPage) createContainer() {
|
||||||
playRandomVbox := container.NewVBox(layout.NewSpacer(), t.playRandom, layout.NewSpacer())
|
playRandomVbox := container.NewVBox(layout.NewSpacer(), t.playRandom, layout.NewSpacer())
|
||||||
topRow := container.NewHBox(t.title, playRandomVbox, layout.NewSpacer()) //searchVbox, util.NewHSpace(15))
|
searchVbox := container.NewVBox(layout.NewSpacer(), t.searcher.Entry, layout.NewSpacer())
|
||||||
|
topRow := container.NewHBox(t.title, playRandomVbox, layout.NewSpacer(), searchVbox, util.NewHSpace(5))
|
||||||
t.container = container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 5, PadBottom: 15},
|
t.container = container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 5, PadBottom: 15},
|
||||||
container.NewBorder(topRow, nil, nil, nil, t.tracklist))
|
container.NewBorder(topRow, nil, nil, nil, t.tracklist))
|
||||||
}
|
}
|
||||||
@@ -64,6 +72,34 @@ func (t *TracksPage) Reload() {
|
|||||||
t.loader = widgets.NewTracklistLoader(t.tracklist, iter)
|
t.loader = widgets.NewTracklistLoader(t.tracklist, iter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TracksPage) OnSearched(query string) {
|
||||||
|
t.searchText = query
|
||||||
|
if query == "" {
|
||||||
|
t.container.Objects[0].(*fyne.Container).Objects[0] = t.tracklist
|
||||||
|
if t.searchTracklist != nil {
|
||||||
|
t.searchTracklist.Clear()
|
||||||
|
}
|
||||||
|
t.Refresh()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.doSearch(query)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TracksPage) doSearch(query string) {
|
||||||
|
if t.searchTracklist == nil {
|
||||||
|
t.searchTracklist = widgets.NewTracklist(nil)
|
||||||
|
t.searchTracklist.AutoNumber = true
|
||||||
|
t.searchTracklist.SetVisibleColumns(t.conf.TracklistColumns)
|
||||||
|
t.contr.ConnectTracklistActions(t.searchTracklist)
|
||||||
|
} else {
|
||||||
|
t.searchTracklist.Clear()
|
||||||
|
}
|
||||||
|
iter := t.lm.SearchTracksIterator(query)
|
||||||
|
t.searchLoader = widgets.NewTracklistLoader(t.searchTracklist, iter)
|
||||||
|
t.container.Objects[0].(*fyne.Container).Objects[0] = t.searchTracklist
|
||||||
|
t.Refresh()
|
||||||
|
}
|
||||||
|
|
||||||
func (t *TracksPage) CreateRenderer() fyne.WidgetRenderer {
|
func (t *TracksPage) CreateRenderer() fyne.WidgetRenderer {
|
||||||
return widget.NewSimpleRenderer(t.container)
|
return widget.NewSimpleRenderer(t.container)
|
||||||
}
|
}
|
||||||
@@ -74,7 +110,13 @@ func (t *TracksPage) Save() SavedPage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *tracksPageState) Restore() Page {
|
func (s *tracksPageState) Restore() Page {
|
||||||
return NewTracksPage(s.contr, s.conf, s.lm)
|
t := NewTracksPage(s.contr, s.conf, s.lm)
|
||||||
|
t.searchText = s.searchText
|
||||||
|
if t.searchText != "" {
|
||||||
|
t.searcher.Entry.Text = t.searchText
|
||||||
|
t.doSearch(t.searchText)
|
||||||
|
}
|
||||||
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TracksPage) playRandomSongs() {
|
func (t *TracksPage) playRandomSongs() {
|
||||||
|
|||||||
Reference in New Issue
Block a user