diff --git a/ui/dialogs/quicksearch.go b/ui/dialogs/quicksearch.go index 0c5d5c6..b3eedde 100644 --- a/ui/dialogs/quicksearch.go +++ b/ui/dialogs/quicksearch.go @@ -1,12 +1,9 @@ package dialogs import ( - "fmt" "log" "fyne.io/fyne/v2" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" "github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/ui/util" ) @@ -26,7 +23,6 @@ func NewQuickSearch(mp mediaprovider.MediaProvider, im util.ImageFetcher) *Quick im, "Quick Search", q.onSearched, - q.onUpdateSearchResult, nil, ) q.SearchDialog = sd @@ -45,53 +41,6 @@ func (q *QuickSearch) onSearched(query string) []*mediaprovider.SearchResult { return results } -func (q *QuickSearch) onUpdateSearchResult(sr *searchResult, result *mediaprovider.SearchResult) { - - maybePluralize := func(s string, size int) string { - if size != 1 { - return s + "s" - } - return s - } - - var secondaryText string - switch result.Type { - case mediaprovider.ContentTypeAlbum: - secondaryText = result.ArtistName - case mediaprovider.ContentTypeArtist: - secondaryText = fmt.Sprintf("%d %s", result.Size, maybePluralize("album", result.Size)) - case mediaprovider.ContentTypeTrack: - secondaryText = result.ArtistName - case mediaprovider.ContentTypePlaylist: - secondaryText = fmt.Sprintf("%d %s", result.Size, maybePluralize("track", result.Size)) - case mediaprovider.ContentTypeGenre: - if result.Size > 0 { - secondaryText = fmt.Sprintf("%d %s", result.Size, maybePluralize("album", result.Size)) - } else { - secondaryText = "" - } - } - sr.secondary.Segments = []widget.RichTextSegment{ - &widget.TextSegment{ - Text: result.Type.String(), - Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, TextStyle: fyne.TextStyle{Bold: true}, Inline: true}, - }, - } - if secondaryText != "" { - sr.secondary.Segments = append(sr.secondary.Segments, - &widget.TextSegment{ - Text: " · ", - Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, Inline: true}, - }, - &widget.TextSegment{ - Text: secondaryText, - Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, Inline: true}, - }, - ) - } - sr.secondary.Refresh() -} - func (q *QuickSearch) SetOnDismiss(onDismiss func()) { q.SearchDialog.OnDismiss = onDismiss } diff --git a/ui/dialogs/searchdialog.go b/ui/dialogs/searchdialog.go index 9677268..d142eba 100644 --- a/ui/dialogs/searchdialog.go +++ b/ui/dialogs/searchdialog.go @@ -1,6 +1,7 @@ package dialogs import ( + "fmt" "image" "log" "sync" @@ -36,21 +37,19 @@ type SearchDialog struct { placeholderTitle string content *fyne.Container - OnDismiss func() - OnNavigateTo func(mediaprovider.ContentType, string, string) - OnSearched func(string) []*mediaprovider.SearchResult - OnUpdateSearchResults func(*searchResult, *mediaprovider.SearchResult) - OnInit func() ([]*mediaprovider.SearchResult, *widget.Check) + OnDismiss func() + OnNavigateTo func(mediaprovider.ContentType, string, string) + OnSearched func(string) []*mediaprovider.SearchResult + OnInit func() ([]*mediaprovider.SearchResult, *widget.Check) } -func NewSearchDialog(im util.ImageFetcher, placeholderTitle string, onSearched func(string) []*mediaprovider.SearchResult, onUpdateSearchResult func(*searchResult, *mediaprovider.SearchResult), onInit func() ([]*mediaprovider.SearchResult, *widget.Check)) *SearchDialog { +func NewSearchDialog(im util.ImageFetcher, placeholderTitle string, onSearched func(string) []*mediaprovider.SearchResult, onInit func() ([]*mediaprovider.SearchResult, *widget.Check)) *SearchDialog { sd := &SearchDialog{ - imgSource: im, - loadingDots: widgets.NewLoadingDots(), - OnSearched: onSearched, - OnUpdateSearchResults: onUpdateSearchResult, - OnInit: onInit, - placeholderTitle: placeholderTitle, + imgSource: im, + loadingDots: widgets.NewLoadingDots(), + OnSearched: onSearched, + OnInit: onInit, + placeholderTitle: placeholderTitle, } sd.ExtendBaseWidget(sd) @@ -79,7 +78,7 @@ func NewSearchDialog(im util.ImageFetcher, placeholderTitle string, onSearched f sd.resultsMutex.RUnlock() sr := co.(*searchResult) sr.index = lii - sd.update(sr, result) + sr.Update(result) }, ) return sd @@ -203,22 +202,6 @@ func (sd *SearchDialog) MinSize() fyne.Size { return fyne.NewSize(400, 350) } -func (sd *SearchDialog) update(sr *searchResult, result *mediaprovider.SearchResult) { - if result == nil { - return - } - if sr.contentType == result.Type && sr.id == result.ID && result.ID != "" { - return // nothing to do - } - sr.id = result.ID - sr.contentType = result.Type - sr.image.CenterIcon = placeholderIconForContentType(result.Type) - sr.imageLoader.Load(result.CoverID) - sr.title.SetText(result.Name) - - sd.OnUpdateSearchResults(sr, result) -} - func placeholderIconForContentType(c mediaprovider.ContentType) fyne.Resource { switch c { case mediaprovider.ContentTypeAlbum: @@ -274,6 +257,64 @@ func newSearchResult(parent *SearchDialog) *searchResult { return qs } +func (s *searchResult) Update(result *mediaprovider.SearchResult) { + if result == nil { + return + } + if s.contentType == result.Type && s.id == result.ID { + return // nothing to do + } + s.id = result.ID + s.contentType = result.Type + s.image.CenterIcon = placeholderIconForContentType(result.Type) + s.imageLoader.Load(result.CoverID) + s.title.SetText(result.Name) + + maybePluralize := func(s string, size int) string { + if size != 1 { + return s + "s" + } + return s + } + var secondaryText string + switch result.Type { + case mediaprovider.ContentTypeAlbum: + secondaryText = result.ArtistName + case mediaprovider.ContentTypeArtist: + secondaryText = fmt.Sprintf("%d %s", result.Size, maybePluralize("album", result.Size)) + case mediaprovider.ContentTypeTrack: + secondaryText = result.ArtistName + case mediaprovider.ContentTypePlaylist: + secondaryText = fmt.Sprintf("%d %s", result.Size, maybePluralize("track", result.Size)) + case mediaprovider.ContentTypeGenre: + if result.Size > 0 { + secondaryText = fmt.Sprintf("%d %s", result.Size, maybePluralize("album", result.Size)) + } else { + secondaryText = "" + } + } + s.secondary.Segments = []widget.RichTextSegment{ + &widget.TextSegment{ + Text: result.Type.String(), + Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, TextStyle: fyne.TextStyle{Bold: true}, Inline: true}, + }, + } + if secondaryText != "" { + s.secondary.Segments = append(s.secondary.Segments, + &widget.TextSegment{ + Text: " · ", + Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, Inline: true}, + }, + &widget.TextSegment{ + Text: secondaryText, + Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, Inline: true}, + }, + ) + } + + s.secondary.Refresh() +} + func (q *searchResult) Tapped(_ *fyne.PointEvent) { q.parent.onSelected(q.index) } diff --git a/ui/dialogs/selectplaylist.go b/ui/dialogs/selectplaylist.go index 9136d48..12c412c 100644 --- a/ui/dialogs/selectplaylist.go +++ b/ui/dialogs/selectplaylist.go @@ -7,7 +7,6 @@ import ( "strings" "fyne.io/fyne/v2" - "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/deluan/sanitize" "github.com/dweymouth/supersonic/backend/mediaprovider" @@ -34,7 +33,6 @@ func NewSelectPlaylistDialog(mp mediaprovider.MediaProvider, im util.ImageFetche im, "Select playlist", sp.onSearched, - sp.onUpdateSearchResult, sp.onInit, ) sp.SearchDialog = sd @@ -100,41 +98,6 @@ func (sp *SelectPlaylist) onSearched(query string) []*mediaprovider.SearchResult return results } -func (sp *SelectPlaylist) onUpdateSearchResult(sr *searchResult, result *mediaprovider.SearchResult) { - if result.ID == "" { - sr.secondary.Segments = []widget.RichTextSegment{} - sr.secondary.Refresh() - return - } - - maybePluralize := func(s string, size int) string { - if size != 1 { - return s + "s" - } - return s - } - secondaryText := fmt.Sprintf("%d %s", result.Size, maybePluralize("track", result.Size)) - sr.secondary.Segments = []widget.RichTextSegment{ - &widget.TextSegment{ - Text: result.Type.String(), - Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, TextStyle: fyne.TextStyle{Bold: true}, Inline: true}, - }, - } - if secondaryText != "" { - sr.secondary.Segments = append(sr.secondary.Segments, - &widget.TextSegment{ - Text: " · ", - Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, Inline: true}, - }, - &widget.TextSegment{ - Text: secondaryText, - Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, Inline: true}, - }, - ) - } - sr.secondary.Refresh() -} - func (sp *SelectPlaylist) SetOnDismiss(onDismiss func()) { sp.SearchDialog.OnDismiss = onDismiss }