@@ -10,6 +10,7 @@ import (
1010 "slices"
1111 "strings"
1212
13+ "github.com/boxes-ltd/imaging"
1314 "github.com/cenkalti/dominantcolor"
1415 "github.com/dweymouth/supersonic/backend"
1516 "github.com/dweymouth/supersonic/backend/mediaprovider"
@@ -49,16 +50,18 @@ type NowPlayingPage struct {
4950 alreadyLoaded bool
5051
5152 // widgets for render
52- background * canvas.LinearGradient
53- queueList * widgets.PlayQueueList
54- relatedList * widgets.PlayQueueList
55- lyricsViewer * widgets.LyricsViewer
56- card * widgets.LargeNowPlayingCard
57- statusLabel * widget.Label
58- tabs * container.AppTabs
59- lyricsLoading * widgets.LoadingDots
60- relatedLoading * widgets.LoadingDots
61- container * fyne.Container
53+ backgroundImgA * canvas.Image
54+ backgroundImgB * canvas.Image
55+ backgroundGradient * canvas.LinearGradient
56+ queueList * widgets.PlayQueueList
57+ relatedList * widgets.PlayQueueList
58+ lyricsViewer * widgets.LyricsViewer
59+ card * widgets.LargeNowPlayingCard
60+ statusLabel * widget.Label
61+ tabs * container.AppTabs
62+ lyricsLoading * widgets.LoadingDots
63+ relatedLoading * widgets.LoadingDots
64+ container * fyne.Container
6265
6366 // cancel funcs for background fetch tasks
6467 imageLoadCancel context.CancelFunc
@@ -232,15 +235,19 @@ func (a *NowPlayingPage) CreateRenderer() fyne.WidgetRenderer {
232235 a .updateRelatedList ()
233236 }
234237 c := theme .Color (myTheme .ColorNamePageBackground )
235- a .background = canvas .NewLinearGradient (c , c , 0 )
238+ a .backgroundGradient = canvas .NewLinearGradient (c , c , 0 )
239+ a .backgroundImgA = canvas .NewImageFromImage (nil )
240+ a .backgroundImgB = canvas .NewImageFromImage (nil )
236241
237242 mainContent := container .NewGridWithColumns (2 ,
238243 container .New (paddedLayout , a .card ),
239244 container .New (paddedLayout ,
240245 util .AddHeaderBackgroundWithColorName (
241246 a .tabs , myTheme .ColorNameNowPlayingPanel )))
242247 a .container = container .NewStack (
243- a .background ,
248+ a .backgroundImgA ,
249+ a .backgroundImgB ,
250+ a .backgroundGradient ,
244251 mainContent ,
245252 container .NewVBox (
246253 layout .NewSpacer (),
@@ -318,20 +325,46 @@ func (a *NowPlayingPage) onImageLoaded(img image.Image, err error) {
318325 return
319326 }
320327
321- c := dominantcolor .Find (img )
322- if c == a .background .StartColor {
323- return
324- }
325-
326- // Fyne animation starting is currently thread-safe,
327- // despite not being marked as such
328- // TODO: if this changes, use fyne.Do
329- anim := canvas .NewColorRGBAAnimation (
330- a .background .StartColor , c , myTheme .AnimationDurationMedium , func (c color.Color ) {
331- a .background .StartColor = c
332- a .background .Refresh ()
328+ if a .conf .UseBackgroundImage {
329+ resized := imaging .Resize (img , 300 , 0 , imaging .NearestNeighbor )
330+ blurred := imaging .Blur (resized , 10.0 )
331+ fyne .Do (func () {
332+ if a .backgroundGradient .StartColor != color .Transparent {
333+ a .backgroundGradient .StartColor = color .Transparent
334+ a .backgroundGradient .Refresh ()
335+ }
336+ a .backgroundImgA .Hidden = false
337+ a .backgroundImgB .Hidden = false
338+ a .backgroundImgA .Image = a .backgroundImgB .Image
339+ a .backgroundImgB .Image = blurred
340+ fyne .NewAnimation (myTheme .AnimationDurationMedium , func (f float32 ) {
341+ a .backgroundImgA .Translucency = float64 (f )
342+ a .backgroundImgB .Translucency = float64 (1 - f )
343+ a .backgroundImgA .Refresh ()
344+ a .backgroundImgB .Refresh ()
345+ }).Start ()
333346 })
334- anim .Start ()
347+ } else {
348+ c := dominantcolor .Find (img )
349+ if c == a .backgroundGradient .StartColor {
350+ return
351+ }
352+ if ! a .backgroundImgA .Hidden {
353+ a .backgroundImgA .Hide ()
354+ }
355+ if ! a .backgroundImgB .Hidden {
356+ a .backgroundImgB .Hide ()
357+ }
358+ // Fyne animation starting is currently thread-safe,
359+ // despite not being marked as such
360+ // TODO: if this changes, use fyne.Do
361+ anim := canvas .NewColorRGBAAnimation (
362+ a .backgroundGradient .StartColor , c , myTheme .AnimationDurationMedium , func (c color.Color ) {
363+ a .backgroundGradient .StartColor = c
364+ a .backgroundGradient .Refresh ()
365+ })
366+ anim .Start ()
367+ }
335368}
336369
337370func (a * NowPlayingPage ) updateLyrics () {
@@ -486,11 +519,11 @@ func (a *NowPlayingPage) UnselectAll() {
486519}
487520
488521func (a * NowPlayingPage ) Refresh () {
489- if a .background != nil {
522+ if a .backgroundGradient != nil {
490523 c := theme .Color (myTheme .ColorNamePageBackground )
491- if c != a .background .EndColor {
492- a .background .EndColor = c
493- a .background .Refresh ()
524+ if c != a .backgroundGradient .EndColor {
525+ a .backgroundGradient .EndColor = c
526+ a .backgroundGradient .Refresh ()
494527 }
495528 }
496529 a .BaseWidget .Refresh ()
0 commit comments