add a list with all the playlists and then filter by the search text

This commit is contained in:
natilou
2024-05-18 12:04:18 -03:00
parent 9a587eee98
commit 1b53695589
4 changed files with 86 additions and 39 deletions
+1
View File
@@ -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())
} }
+1
View File
@@ -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
View File
@@ -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)
} }
+46 -26
View File
@@ -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
} }