From daf0440fbc1cf940471ece6210acd8118a3e036e Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 6 Feb 2026 08:27:52 -0800 Subject: [PATCH] extend searchdialog / SearchResult to properly support headphone profiles --- backend/mediaprovider/model.go | 12 +++++++++++- ui/dialogs/autoeqbrowser.go | 6 ++++-- ui/dialogs/searchdialog.go | 34 ++++++++++++++++++++++++---------- ui/theme/theme.go | 2 +- ui/toolbar.go | 2 +- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/backend/mediaprovider/model.go b/backend/mediaprovider/model.go index 238ccb4..596878e 100644 --- a/backend/mediaprovider/model.go +++ b/backend/mediaprovider/model.go @@ -1,6 +1,10 @@ package mediaprovider -import "time" +import ( + "time" + + "fyne.io/fyne/v2" +) // Bit field flag for the ReleaseTypes property type ReleaseType = int32 @@ -282,6 +286,7 @@ const ( ContentTypeTrack ContentTypeGenre ContentTypeRadioStation + ContentTypeOther ) func (c ContentType) String() string { @@ -298,6 +303,8 @@ func (c ContentType) String() string { return "Genre" case ContentTypeRadioStation: return "Radio station" + case ContentTypeOther: + return "Other" default: return "Unknown" } @@ -309,6 +316,9 @@ type SearchResult struct { CoverID string Type ContentType + // Optional icon to display instead of the default for this content type + Icon fyne.Resource + // for Album / Playlist: track count // Artist / Genre: album count // Track: length (seconds) diff --git a/ui/dialogs/autoeqbrowser.go b/ui/dialogs/autoeqbrowser.go index a473141..d5ae1d1 100644 --- a/ui/dialogs/autoeqbrowser.go +++ b/ui/dialogs/autoeqbrowser.go @@ -12,6 +12,7 @@ import ( "github.com/dweymouth/supersonic/backend" "github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/sharedutil" + "github.com/dweymouth/supersonic/ui/theme" "github.com/dweymouth/supersonic/ui/util" ) @@ -70,8 +71,9 @@ func (ab *AutoEQBrowser) profileToSearchResult(profile backend.AutoEQProfileMeta return &mediaprovider.SearchResult{ Name: profile.Name, - ID: profile.Path, // Store path as ID for retrieval - Type: mediaprovider.ContentTypeAlbum, // Use album icon (looks like headphones) + Icon: theme.HeadphonesIcon, // Use headphone icon for all profiles + ID: profile.Path, // Store path as ID for retrieval + Type: mediaprovider.ContentTypeOther, // Use "Other" content type for AutoEQ profiles ArtistName: subtitle, Size: 0, // Don't show track count } diff --git a/ui/dialogs/searchdialog.go b/ui/dialogs/searchdialog.go index faf2d4b..20e5689 100644 --- a/ui/dialogs/searchdialog.go +++ b/ui/dialogs/searchdialog.go @@ -272,7 +272,11 @@ func (s *searchResult) Update(result *mediaprovider.SearchResult) { } s.id = result.ID s.contentType = result.Type - s.image.PlaceholderIcon = placeholderIconForContentType(result.Type) + if result.Icon != nil { + s.image.PlaceholderIcon = result.Icon + } else { + s.image.PlaceholderIcon = placeholderIconForContentType(result.Type) + } s.imageLoader.Load(result.CoverID) s.title.SetText(result.Name) @@ -300,19 +304,29 @@ func (s *searchResult) Update(result *mediaprovider.SearchResult) { } else { secondaryText = "" } + case mediaprovider.ContentTypeOther: + secondaryText = result.ArtistName } - 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 result.Type == mediaprovider.ContentTypeOther { + s.secondary.Segments = []widget.RichTextSegment{} + } else { + 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 != "" { + if len(s.secondary.Segments) > 0 { + s.secondary.Segments = append(s.secondary.Segments, + &widget.TextSegment{ + Text: " · ", + Style: widget.RichTextStyle{SizeName: theme.SizeNameCaptionText, Inline: true}, + }) + } 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}, diff --git a/ui/theme/theme.go b/ui/theme/theme.go index 8318d1e..9f88961 100644 --- a/ui/theme/theme.go +++ b/ui/theme/theme.go @@ -54,7 +54,7 @@ var ( RadioIcon fyne.Resource = theme.NewThemedResource(res.ResBroadcastSvg) FavoriteIcon fyne.Resource = theme.NewThemedResource(res.ResHeartFilledSvg) NotFavoriteIcon fyne.Resource = theme.NewThemedResource(res.ResHeartOutlineSvg) - NowPlayingIcon fyne.Resource = theme.NewThemedResource(res.ResHeadphonesSvg) + HeadphonesIcon fyne.Resource = theme.NewThemedResource(res.ResHeadphonesSvg) PlaylistIcon fyne.Resource = theme.NewThemedResource(res.ResPlaylistSvg) PlayNextIcon fyne.Resource = theme.NewThemedResource(res.ResPlaylistAddNextSvg) PlayQueueIcon fyne.Resource = theme.NewThemedResource(res.ResPlayqueueSvg) diff --git a/ui/toolbar.go b/ui/toolbar.go index 1ba87ac..eedcb79 100644 --- a/ui/toolbar.go +++ b/ui/toolbar.go @@ -146,7 +146,7 @@ func (t *Toolbar) CreateRenderer() fyne.WidgetRenderer { } func (t *Toolbar) setupNavigationButtons(navigateFn func(controller.Route)) { - t.addNavigationButton(myTheme.NowPlayingIcon, controller.NowPlaying, func() { + t.addNavigationButton(myTheme.HeadphonesIcon, controller.NowPlaying, func() { navigateFn(controller.NowPlayingRoute()) }) t.addNavigationButton(myTheme.FavoriteIcon, controller.Favorites, func() {