add a list with all the playlists and then filter by the search text
This commit is contained in:
@@ -347,6 +347,7 @@ func (m *Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) {
|
|||||||
min := sp.MinSize()
|
min := sp.MinSize()
|
||||||
height := fyne.Max(min.Height, fyne.Min(min.Height*1.5, m.MainWindow.Canvas().Size().Height*0.7))
|
height := fyne.Max(min.Height, fyne.Min(min.Height*1.5, m.MainWindow.Canvas().Size().Height*0.7))
|
||||||
pop.Resize(fyne.NewSize(min.Width, height))
|
pop.Resize(fyne.NewSize(min.Width, height))
|
||||||
|
sp.SearchDialog.Show()
|
||||||
pop.Show()
|
pop.Show()
|
||||||
m.MainWindow.Canvas().Focus(sp.GetSearchEntry())
|
m.MainWindow.Canvas().Focus(sp.GetSearchEntry())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ func NewQuickSearch(mp mediaprovider.MediaProvider, im util.ImageFetcher) *Quick
|
|||||||
"Quick Search",
|
"Quick Search",
|
||||||
q.onSearched,
|
q.onSearched,
|
||||||
q.onUpdateSearchResult,
|
q.onUpdateSearchResult,
|
||||||
|
nil,
|
||||||
)
|
)
|
||||||
q.SearchDialog = sd
|
q.SearchDialog = sd
|
||||||
return q
|
return q
|
||||||
|
|||||||
+38
-13
@@ -39,14 +39,16 @@ type SearchDialog struct {
|
|||||||
OnNavigateTo func(mediaprovider.ContentType, string, string)
|
OnNavigateTo func(mediaprovider.ContentType, string, string)
|
||||||
OnSearched func(string) []*mediaprovider.SearchResult
|
OnSearched func(string) []*mediaprovider.SearchResult
|
||||||
OnUpdateSearchResults func(*searchResult, *mediaprovider.SearchResult)
|
OnUpdateSearchResults func(*searchResult, *mediaprovider.SearchResult)
|
||||||
|
OnInit func() []*mediaprovider.SearchResult
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSearchDialog(im util.ImageFetcher, placeholderTitle string, onSearched func(string) []*mediaprovider.SearchResult, onUpdateSearchResult func(*searchResult, *mediaprovider.SearchResult)) *SearchDialog {
|
func NewSearchDialog(im util.ImageFetcher, placeholderTitle string, onSearched func(string) []*mediaprovider.SearchResult, onUpdateSearchResult func(*searchResult, *mediaprovider.SearchResult), onInit func() []*mediaprovider.SearchResult) *SearchDialog {
|
||||||
sd := &SearchDialog{
|
sd := &SearchDialog{
|
||||||
imgSource: im,
|
imgSource: im,
|
||||||
loadingDots: widgets.NewLoadingDots(),
|
loadingDots: widgets.NewLoadingDots(),
|
||||||
OnSearched: onSearched,
|
OnSearched: onSearched,
|
||||||
OnUpdateSearchResults: onUpdateSearchResult,
|
OnUpdateSearchResults: onUpdateSearchResult,
|
||||||
|
OnInit: onInit,
|
||||||
}
|
}
|
||||||
sd.ExtendBaseWidget(sd)
|
sd.ExtendBaseWidget(sd)
|
||||||
|
|
||||||
@@ -92,6 +94,11 @@ func NewSearchDialog(im util.ImageFetcher, placeholderTitle string, onSearched f
|
|||||||
return sd
|
return sd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sd *SearchDialog) Show() {
|
||||||
|
sd.onInit()
|
||||||
|
sd.BaseWidget.Show()
|
||||||
|
}
|
||||||
|
|
||||||
func (sd *SearchDialog) onDismiss() {
|
func (sd *SearchDialog) onDismiss() {
|
||||||
if sd.OnDismiss != nil {
|
if sd.OnDismiss != nil {
|
||||||
sd.OnDismiss()
|
sd.OnDismiss()
|
||||||
@@ -132,18 +139,7 @@ func (sd *SearchDialog) moveSelectionUp() {
|
|||||||
sd.list.Select(sd.selectedIndex)
|
sd.list.Select(sd.selectedIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sd *SearchDialog) onSearched(query string) {
|
func (sd *SearchDialog) setResults(results []*mediaprovider.SearchResult) {
|
||||||
sd.loadingDots.Start()
|
|
||||||
var results []*mediaprovider.SearchResult
|
|
||||||
if query != "" {
|
|
||||||
res := sd.OnSearched(query)
|
|
||||||
if len(res) == 0 {
|
|
||||||
log.Println("No results matched the query.")
|
|
||||||
} else {
|
|
||||||
results = res
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sd.loadingDots.Stop()
|
|
||||||
sd.resultsMutex.Lock()
|
sd.resultsMutex.Lock()
|
||||||
sd.searchResults = results
|
sd.searchResults = results
|
||||||
sd.resultsMutex.Unlock()
|
sd.resultsMutex.Unlock()
|
||||||
@@ -153,6 +149,35 @@ func (sd *SearchDialog) onSearched(query string) {
|
|||||||
sd.list.Select(0)
|
sd.list.Select(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sd *SearchDialog) onInit() {
|
||||||
|
if sd.OnInit == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sd.loadingDots.Start()
|
||||||
|
var results []*mediaprovider.SearchResult
|
||||||
|
res := sd.OnInit()
|
||||||
|
if len(res) == 0 {
|
||||||
|
log.Println("No results")
|
||||||
|
} else {
|
||||||
|
results = res
|
||||||
|
}
|
||||||
|
sd.loadingDots.Stop()
|
||||||
|
sd.setResults(results)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sd *SearchDialog) onSearched(query string) {
|
||||||
|
sd.loadingDots.Start()
|
||||||
|
var results []*mediaprovider.SearchResult
|
||||||
|
res := sd.OnSearched(query)
|
||||||
|
if len(res) == 0 {
|
||||||
|
log.Println("No results matched the query.")
|
||||||
|
} else {
|
||||||
|
results = res
|
||||||
|
}
|
||||||
|
sd.loadingDots.Stop()
|
||||||
|
sd.setResults(results)
|
||||||
|
}
|
||||||
|
|
||||||
func (sd *SearchDialog) CreateRenderer() fyne.WidgetRenderer {
|
func (sd *SearchDialog) CreateRenderer() fyne.WidgetRenderer {
|
||||||
return widget.NewSimpleRenderer(sd.content)
|
return widget.NewSimpleRenderer(sd.content)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ type SelectPlaylist struct {
|
|||||||
SearchDialog *SearchDialog
|
SearchDialog *SearchDialog
|
||||||
mp mediaprovider.MediaProvider
|
mp mediaprovider.MediaProvider
|
||||||
loggedInUser string
|
loggedInUser string
|
||||||
|
allPlaylists []*mediaprovider.Playlist
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSelectPlaylistDialog(mp mediaprovider.MediaProvider, im util.ImageFetcher, loggedInUser string) *SelectPlaylist {
|
func NewSelectPlaylistDialog(mp mediaprovider.MediaProvider, im util.ImageFetcher, loggedInUser string) *SelectPlaylist {
|
||||||
@@ -27,50 +28,69 @@ func NewSelectPlaylistDialog(mp mediaprovider.MediaProvider, im util.ImageFetche
|
|||||||
mp: mp,
|
mp: mp,
|
||||||
loggedInUser: loggedInUser,
|
loggedInUser: loggedInUser,
|
||||||
}
|
}
|
||||||
|
|
||||||
sd := NewSearchDialog(
|
sd := NewSearchDialog(
|
||||||
im,
|
im,
|
||||||
"Select playlist",
|
"Select playlist",
|
||||||
sp.onSearched,
|
sp.onSearched,
|
||||||
sp.onUpdateSearchResult,
|
sp.onUpdateSearchResult,
|
||||||
|
sp.onInit,
|
||||||
)
|
)
|
||||||
sp.SearchDialog = sd
|
sp.SearchDialog = sd
|
||||||
return sp
|
return sp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sp *SelectPlaylist) onInit() []*mediaprovider.SearchResult {
|
||||||
|
var results []*mediaprovider.SearchResult
|
||||||
|
playlists, err := sp.mp.GetPlaylists()
|
||||||
|
if err != nil {
|
||||||
|
// TODO: surface this error to user
|
||||||
|
log.Printf("error getting playlists: %s", err.Error())
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
sp.allPlaylists = sharedutil.FilterSlice(playlists, func(playlist *mediaprovider.Playlist) bool {
|
||||||
|
return playlist.Owner == sp.loggedInUser
|
||||||
|
})
|
||||||
|
for _, playlist := range sp.allPlaylists {
|
||||||
|
results = append(results, &mediaprovider.SearchResult{
|
||||||
|
Name: playlist.Name,
|
||||||
|
ID: playlist.ID,
|
||||||
|
CoverID: playlist.CoverArtID,
|
||||||
|
Type: mediaprovider.ContentTypePlaylist,
|
||||||
|
Size: playlist.TrackCount,
|
||||||
|
ArtistName: playlist.Name,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
func (sp *SelectPlaylist) onSearched(query string) []*mediaprovider.SearchResult {
|
func (sp *SelectPlaylist) onSearched(query string) []*mediaprovider.SearchResult {
|
||||||
var results []*mediaprovider.SearchResult
|
var results []*mediaprovider.SearchResult
|
||||||
if query != "" {
|
var filteredPlaylists []*mediaprovider.Playlist
|
||||||
var filteredPlaylists []*mediaprovider.Playlist
|
if query == "" {
|
||||||
if playlists, err := sp.mp.GetPlaylists(); err != nil {
|
filteredPlaylists = sp.allPlaylists
|
||||||
// TODO: surface this error to user
|
} else {
|
||||||
log.Printf("error getting playlists: %s", err.Error())
|
filteredPlaylists = sharedutil.FilterSlice(sp.allPlaylists, func(playlist *mediaprovider.Playlist) bool {
|
||||||
return results
|
return strings.Contains(
|
||||||
} else {
|
sanitize.Accents(strings.ToLower(playlist.Name)),
|
||||||
filteredPlaylists = sharedutil.FilterSlice(playlists, func(playlist *mediaprovider.Playlist) bool {
|
sanitize.Accents(strings.ToLower(query)),
|
||||||
return strings.Contains(
|
)
|
||||||
sanitize.Accents(strings.ToLower(playlist.Name)),
|
})
|
||||||
sanitize.Accents(strings.ToLower(query)),
|
|
||||||
) && playlist.Owner == sp.loggedInUser
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
results = append(results, &mediaprovider.SearchResult{
|
results = append(results, &mediaprovider.SearchResult{
|
||||||
Name: fmt.Sprintf("Create new playlist: %s", query),
|
Name: fmt.Sprintf("Create new playlist: %s", query),
|
||||||
Type: mediaprovider.ContentTypePlaylist,
|
Type: mediaprovider.ContentTypePlaylist,
|
||||||
Query: query,
|
Query: query,
|
||||||
})
|
})
|
||||||
for _, playlist := range filteredPlaylists {
|
}
|
||||||
results = append(results, &mediaprovider.SearchResult{
|
|
||||||
Name: playlist.Name,
|
|
||||||
ID: playlist.ID,
|
|
||||||
CoverID: playlist.CoverArtID,
|
|
||||||
Type: mediaprovider.ContentTypePlaylist,
|
|
||||||
Size: playlist.TrackCount,
|
|
||||||
ArtistName: playlist.Name,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for _, playlist := range filteredPlaylists {
|
||||||
|
results = append(results, &mediaprovider.SearchResult{
|
||||||
|
Name: playlist.Name,
|
||||||
|
ID: playlist.ID,
|
||||||
|
CoverID: playlist.CoverArtID,
|
||||||
|
Type: mediaprovider.ContentTypePlaylist,
|
||||||
|
Size: playlist.TrackCount,
|
||||||
|
ArtistName: playlist.Name,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return results
|
return results
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user