use radio icon for image placeholder for radio stations
This commit is contained in:
@@ -120,15 +120,6 @@ func (i *ImageManager) GetCoverThumbnail(coverID string) (image.Image, error) {
|
|||||||
return i.fetchAndCacheCoverFromDiskOrServer(context.Background(), coverID, i.thumbnailCache.DefaultTTL, nil)
|
return i.fetchAndCacheCoverFromDiskOrServer(context.Background(), coverID, i.thumbnailCache.DefaultTTL, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCoverThumbnailWithTTL fetches the cover for the given coverID and updates the TTL
|
|
||||||
// in the in-memory image cache. It blocks until the image fetch is complete.
|
|
||||||
func (i *ImageManager) GetCoverThumbnailWithTTL(coverID string, ttl time.Duration) (image.Image, error) {
|
|
||||||
if img, err := i.thumbnailCache.GetWithNewTTL(coverID, ttl); err == nil {
|
|
||||||
return img, nil
|
|
||||||
}
|
|
||||||
return i.fetchAndCacheCoverFromDiskOrServer(context.Background(), coverID, ttl, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFullSizeCoverArt fetches the full size cover image for the given coverID.
|
// GetFullSizeCoverArt fetches the full size cover image for the given coverID.
|
||||||
// It blocks until the fetch is complete.
|
// It blocks until the fetch is complete.
|
||||||
func (i *ImageManager) GetFullSizeCoverArt(coverID string) (image.Image, error) {
|
func (i *ImageManager) GetFullSizeCoverArt(coverID string) (image.Image, error) {
|
||||||
|
|||||||
+1
-1
@@ -88,7 +88,7 @@ var ResFilterSvg = &fyne.StaticResource{
|
|||||||
var ResBroadcastSvg = &fyne.StaticResource{
|
var ResBroadcastSvg = &fyne.StaticResource{
|
||||||
StaticName: "broadcast.svg",
|
StaticName: "broadcast.svg",
|
||||||
StaticContent: []byte(
|
StaticContent: []byte(
|
||||||
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<svg width=\"800px\" height=\"800px\" viewBox=\"4 4 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.92893 2.92896L6.34315 4.34317C4.89543 5.79088 4 7.79088 4 10C4 12.2092 4.89543 14.2092 6.34315 15.6569L4.92893 17.0711C3.11929 15.2614 2 12.7614 2 10C2 7.2386 3.11929 4.7386 4.92893 2.92896ZM19.0711 2.92896C20.8807 4.7386 22 7.2386 22 10C22 12.7614 20.8807 15.2614 19.0711 17.0711L17.6569 15.6569C19.1046 14.2092 20 12.2092 20 10C20 7.79088 19.1046 5.79088 17.6569 4.34317L19.0711 2.92896ZM7.75736 5.75738L9.17157 7.1716C8.44771 7.89545 8 8.89545 8 10C8 11.1046 8.44771 12.1046 9.17157 12.8285L7.75736 14.2427C6.67157 13.1569 6 11.6569 6 10C6 8.34317 6.67157 6.84317 7.75736 5.75738ZM16.2426 5.75738C17.3284 6.84317 18 8.34317 18 10C18 11.6569 17.3284 13.1569 16.2426 14.2427L14.8284 12.8285C15.5523 12.1046 16 11.1046 16 10C16 8.89545 15.5523 7.89545 14.8284 7.1716L16.2426 5.75738ZM12 12C10.8954 12 10 11.1046 10 10C10 8.89545 10.8954 8.00002 12 8.00002C13.1046 8.00002 14 8.89545 14 10C14 11.1046 13.1046 12 12 12ZM12 14C12.5798 14 13.0774 14.413 13.1843 14.9829L14.5 22H9.5L10.8157 14.9829C10.9226 14.413 11.4202 14 12 14Z\"/>\n</svg>"),
|
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<svg width=\"800px\" height=\"800px\" viewBox=\"2 2 22 22\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.92893 2.92896L6.34315 4.34317C4.89543 5.79088 4 7.79088 4 10C4 12.2092 4.89543 14.2092 6.34315 15.6569L4.92893 17.0711C3.11929 15.2614 2 12.7614 2 10C2 7.2386 3.11929 4.7386 4.92893 2.92896ZM19.0711 2.92896C20.8807 4.7386 22 7.2386 22 10C22 12.7614 20.8807 15.2614 19.0711 17.0711L17.6569 15.6569C19.1046 14.2092 20 12.2092 20 10C20 7.79088 19.1046 5.79088 17.6569 4.34317L19.0711 2.92896ZM7.75736 5.75738L9.17157 7.1716C8.44771 7.89545 8 8.89545 8 10C8 11.1046 8.44771 12.1046 9.17157 12.8285L7.75736 14.2427C6.67157 13.1569 6 11.6569 6 10C6 8.34317 6.67157 6.84317 7.75736 5.75738ZM16.2426 5.75738C17.3284 6.84317 18 8.34317 18 10C18 11.6569 17.3284 13.1569 16.2426 14.2427L14.8284 12.8285C15.5523 12.1046 16 11.1046 16 10C16 8.89545 15.5523 7.89545 14.8284 7.1716L16.2426 5.75738ZM12 12C10.8954 12 10 11.1046 10 10C10 8.89545 10.8954 8.00002 12 8.00002C13.1046 8.00002 14 8.89545 14 10C14 11.1046 13.1046 12 12 12ZM12 14C12.5798 14 13.0774 14.413 13.1843 14.9829L14.5 22H9.5L10.8157 14.9829C10.9226 14.413 11.4202 14 12 14Z\"/>\n</svg>"),
|
||||||
}
|
}
|
||||||
var ResRepeatSvg = &fyne.StaticResource{
|
var ResRepeatSvg = &fyne.StaticResource{
|
||||||
StaticName: "repeat.svg",
|
StaticName: "repeat.svg",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<svg width="800px" height="800px" viewBox="4 4 20 20" xmlns="http://www.w3.org/2000/svg">
|
<svg width="800px" height="800px" viewBox="2 2 22 22" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M4.92893 2.92896L6.34315 4.34317C4.89543 5.79088 4 7.79088 4 10C4 12.2092 4.89543 14.2092 6.34315 15.6569L4.92893 17.0711C3.11929 15.2614 2 12.7614 2 10C2 7.2386 3.11929 4.7386 4.92893 2.92896ZM19.0711 2.92896C20.8807 4.7386 22 7.2386 22 10C22 12.7614 20.8807 15.2614 19.0711 17.0711L17.6569 15.6569C19.1046 14.2092 20 12.2092 20 10C20 7.79088 19.1046 5.79088 17.6569 4.34317L19.0711 2.92896ZM7.75736 5.75738L9.17157 7.1716C8.44771 7.89545 8 8.89545 8 10C8 11.1046 8.44771 12.1046 9.17157 12.8285L7.75736 14.2427C6.67157 13.1569 6 11.6569 6 10C6 8.34317 6.67157 6.84317 7.75736 5.75738ZM16.2426 5.75738C17.3284 6.84317 18 8.34317 18 10C18 11.6569 17.3284 13.1569 16.2426 14.2427L14.8284 12.8285C15.5523 12.1046 16 11.1046 16 10C16 8.89545 15.5523 7.89545 14.8284 7.1716L16.2426 5.75738ZM12 12C10.8954 12 10 11.1046 10 10C10 8.89545 10.8954 8.00002 12 8.00002C13.1046 8.00002 14 8.89545 14 10C14 11.1046 13.1046 12 12 12ZM12 14C12.5798 14 13.0774 14.413 13.1843 14.9829L14.5 22H9.5L10.8157 14.9829C10.9226 14.413 11.4202 14 12 14Z"/>
|
<path d="M4.92893 2.92896L6.34315 4.34317C4.89543 5.79088 4 7.79088 4 10C4 12.2092 4.89543 14.2092 6.34315 15.6569L4.92893 17.0711C3.11929 15.2614 2 12.7614 2 10C2 7.2386 3.11929 4.7386 4.92893 2.92896ZM19.0711 2.92896C20.8807 4.7386 22 7.2386 22 10C22 12.7614 20.8807 15.2614 19.0711 17.0711L17.6569 15.6569C19.1046 14.2092 20 12.2092 20 10C20 7.79088 19.1046 5.79088 17.6569 4.34317L19.0711 2.92896ZM7.75736 5.75738L9.17157 7.1716C8.44771 7.89545 8 8.89545 8 10C8 11.1046 8.44771 12.1046 9.17157 12.8285L7.75736 14.2427C6.67157 13.1569 6 11.6569 6 10C6 8.34317 6.67157 6.84317 7.75736 5.75738ZM16.2426 5.75738C17.3284 6.84317 18 8.34317 18 10C18 11.6569 17.3284 13.1569 16.2426 14.2427L14.8284 12.8285C15.5523 12.1046 16 11.1046 16 10C16 8.89545 15.5523 7.89545 14.8284 7.1716L16.2426 5.75738ZM12 12C10.8954 12 10 11.1046 10 10C10 8.89545 10.8954 8.00002 12 8.00002C13.1046 8.00002 14 8.89545 14 10C14 11.1046 13.1046 12 12 12ZM12 14C12.5798 14 13.0774 14.413 13.1843 14.9829L14.5 22H9.5L10.8157 14.9829C10.9226 14.413 11.4202 14 12 14Z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
+10
-20
@@ -1,13 +1,11 @@
|
|||||||
package ui
|
package ui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"image"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/dweymouth/supersonic/backend"
|
"github.com/dweymouth/supersonic/backend"
|
||||||
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
||||||
"github.com/dweymouth/supersonic/ui/controller"
|
"github.com/dweymouth/supersonic/ui/controller"
|
||||||
"github.com/dweymouth/supersonic/ui/layouts"
|
"github.com/dweymouth/supersonic/ui/layouts"
|
||||||
|
"github.com/dweymouth/supersonic/ui/util"
|
||||||
"github.com/dweymouth/supersonic/ui/widgets"
|
"github.com/dweymouth/supersonic/ui/widgets"
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
@@ -18,19 +16,18 @@ import (
|
|||||||
type BottomPanel struct {
|
type BottomPanel struct {
|
||||||
widget.BaseWidget
|
widget.BaseWidget
|
||||||
|
|
||||||
ImageManager *backend.ImageManager
|
imageLoader util.ThumbnailLoader
|
||||||
|
|
||||||
NowPlaying *widgets.NowPlayingCard
|
NowPlaying *widgets.NowPlayingCard
|
||||||
Controls *widgets.PlayerControls
|
Controls *widgets.PlayerControls
|
||||||
AuxControls *widgets.AuxControls
|
AuxControls *widgets.AuxControls
|
||||||
|
|
||||||
coverArtID string
|
container *fyne.Container
|
||||||
container *fyne.Container
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ fyne.Widget = (*BottomPanel)(nil)
|
var _ fyne.Widget = (*BottomPanel)(nil)
|
||||||
|
|
||||||
func NewBottomPanel(pm *backend.PlaybackManager, contr *controller.Controller) *BottomPanel {
|
func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr *controller.Controller) *BottomPanel {
|
||||||
bp := &BottomPanel{}
|
bp := &BottomPanel{}
|
||||||
bp.ExtendBaseWidget(bp)
|
bp.ExtendBaseWidget(bp)
|
||||||
|
|
||||||
@@ -105,6 +102,8 @@ func NewBottomPanel(pm *backend.PlaybackManager, contr *controller.Controller) *
|
|||||||
pm.SetNextLoopMode()
|
pm.SetNextLoopMode()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
bp.imageLoader = util.NewThumbnailLoader(im, bp.NowPlaying.SetImage)
|
||||||
|
|
||||||
bp.container = container.New(layouts.NewLeftMiddleRightLayout(500),
|
bp.container = container.New(layouts.NewLeftMiddleRightLayout(500),
|
||||||
bp.NowPlaying, bp.Controls, bp.AuxControls)
|
bp.NowPlaying, bp.Controls, bp.AuxControls)
|
||||||
return bp
|
return bp
|
||||||
@@ -112,20 +111,11 @@ func NewBottomPanel(pm *backend.PlaybackManager, contr *controller.Controller) *
|
|||||||
|
|
||||||
func (bp *BottomPanel) onSongChange(song mediaprovider.MediaItem, _ *mediaprovider.Track) {
|
func (bp *BottomPanel) onSongChange(song mediaprovider.MediaItem, _ *mediaprovider.Track) {
|
||||||
if song == nil {
|
if song == nil {
|
||||||
bp.NowPlaying.Update(nil, nil)
|
bp.NowPlaying.Update(nil)
|
||||||
|
bp.imageLoader.Load("")
|
||||||
} else {
|
} else {
|
||||||
meta := song.Metadata()
|
bp.NowPlaying.Update(song)
|
||||||
bp.coverArtID = meta.CoverArtID
|
bp.imageLoader.Load(song.Metadata().CoverArtID)
|
||||||
var im image.Image
|
|
||||||
if bp.ImageManager != nil {
|
|
||||||
// set image to expire not long after the length of the song
|
|
||||||
// if song is played through without much pausing, image will still
|
|
||||||
// be in cache for the next song if it's from the same album, or
|
|
||||||
// if the user navigates to the album page for the track
|
|
||||||
imgTTLSec := meta.Duration + 30
|
|
||||||
im, _ = bp.ImageManager.GetCoverThumbnailWithTTL(meta.CoverArtID, time.Duration(imgTTLSec)*time.Second)
|
|
||||||
}
|
|
||||||
bp.NowPlaying.Update(song, im)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ func (s *searchResult) Update(result *mediaprovider.SearchResult) {
|
|||||||
}
|
}
|
||||||
s.id = result.ID
|
s.id = result.ID
|
||||||
s.contentType = result.Type
|
s.contentType = result.Type
|
||||||
s.image.CenterIcon = placeholderIconForContentType(result.Type)
|
s.image.PlaceholderIcon = placeholderIconForContentType(result.Type)
|
||||||
s.imageLoader.Load(result.CoverID)
|
s.imageLoader.Load(result.CoverID)
|
||||||
s.title.SetText(result.Name)
|
s.title.SetText(result.Name)
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -84,8 +84,7 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string,
|
|||||||
m.Controller.ReloadFunc = m.BrowsingPane.Reload
|
m.Controller.ReloadFunc = m.BrowsingPane.Reload
|
||||||
m.Controller.CurPageFunc = m.BrowsingPane.CurrentPage
|
m.Controller.CurPageFunc = m.BrowsingPane.CurrentPage
|
||||||
|
|
||||||
m.BottomPanel = NewBottomPanel(app.PlaybackManager, m.Controller)
|
m.BottomPanel = NewBottomPanel(app.PlaybackManager, app.ImageManager, m.Controller)
|
||||||
m.BottomPanel.ImageManager = app.ImageManager
|
|
||||||
m.container = container.NewBorder(nil, m.BottomPanel, nil, nil, m.BrowsingPane)
|
m.container = container.NewBorder(nil, m.BottomPanel, nil, nil, m.BrowsingPane)
|
||||||
m.Window.SetContent(m.container)
|
m.Window.SetContent(m.container)
|
||||||
m.Window.Resize(size)
|
m.Window.Resize(size)
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ func (g *GridView) doUpdateItemCard(itemIdx int, card *GridViewItem) {
|
|||||||
}
|
}
|
||||||
card.ItemIndex = itemIdx
|
card.ItemIndex = itemIdx
|
||||||
g.itemForIndex[itemIdx] = card
|
g.itemForIndex[itemIdx] = card
|
||||||
card.Cover.Im.CenterIcon = g.Placeholder
|
card.Cover.Im.PlaceholderIcon = g.Placeholder
|
||||||
if !card.NeedsUpdate(item) && card.ItemIndex == itemIdx {
|
if !card.NeedsUpdate(item) && card.ItemIndex == itemIdx {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
g.stateMutex.Unlock()
|
g.stateMutex.Unlock()
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ import (
|
|||||||
// a placeholder with a rectangular border frame
|
// a placeholder with a rectangular border frame
|
||||||
// and an icon positioned in the center of the frame.
|
// and an icon positioned in the center of the frame.
|
||||||
type ImagePlaceholder struct {
|
type ImagePlaceholder struct {
|
||||||
ScaleMode canvas.ImageScale
|
ScaleMode canvas.ImageScale
|
||||||
CenterIcon fyne.Resource
|
PlaceholderIcon fyne.Resource
|
||||||
|
|
||||||
widget.BaseWidget
|
widget.BaseWidget
|
||||||
content *fyne.Container
|
content *fyne.Container
|
||||||
@@ -31,7 +31,7 @@ type ImagePlaceholder struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewImagePlaceholder(centerIcon fyne.Resource, minSize float32) *ImagePlaceholder {
|
func NewImagePlaceholder(centerIcon fyne.Resource, minSize float32) *ImagePlaceholder {
|
||||||
i := &ImagePlaceholder{minSize: minSize, CenterIcon: centerIcon}
|
i := &ImagePlaceholder{minSize: minSize, PlaceholderIcon: centerIcon}
|
||||||
i.ExtendBaseWidget(i)
|
i.ExtendBaseWidget(i)
|
||||||
i.iconImage = canvas.NewImageFromResource(centerIcon)
|
i.iconImage = canvas.NewImageFromResource(centerIcon)
|
||||||
i.iconImage.FillMode = canvas.ImageFillContain
|
i.iconImage.FillMode = canvas.ImageFillContain
|
||||||
@@ -94,7 +94,7 @@ func (i *ImagePlaceholder) MinSize() fyne.Size {
|
|||||||
|
|
||||||
func (i *ImagePlaceholder) Refresh() {
|
func (i *ImagePlaceholder) Refresh() {
|
||||||
i.border.Hidden = i.HaveImage()
|
i.border.Hidden = i.HaveImage()
|
||||||
i.iconImage.Resource = i.CenterIcon
|
i.iconImage.Resource = i.PlaceholderIcon
|
||||||
i.iconImage.Hidden = i.HaveImage()
|
i.iconImage.Hidden = i.HaveImage()
|
||||||
i.imageDisp.Hidden = !i.HaveImage()
|
i.imageDisp.Hidden = !i.HaveImage()
|
||||||
i.imageDisp.ScaleMode = i.ScaleMode
|
i.imageDisp.ScaleMode = i.ScaleMode
|
||||||
|
|||||||
@@ -125,9 +125,11 @@ func (n *LargeNowPlayingCard) Update(item mediaprovider.MediaItem) {
|
|||||||
if tr, ok := item.(*mediaprovider.Track); ok {
|
if tr, ok := item.(*mediaprovider.Track); ok {
|
||||||
n.rating.Rating = tr.Rating
|
n.rating.Rating = tr.Rating
|
||||||
n.favorite.Favorite = tr.Favorite
|
n.favorite.Favorite = tr.Favorite
|
||||||
|
n.cover.PlaceholderIcon = myTheme.TracksIcon
|
||||||
} else {
|
} else {
|
||||||
n.rating.Rating = 0
|
n.rating.Rating = 0
|
||||||
n.favorite.Favorite = false
|
n.favorite.Favorite = false
|
||||||
|
n.cover.PlaceholderIcon = myTheme.RadioIcon
|
||||||
}
|
}
|
||||||
|
|
||||||
n.Refresh()
|
n.Refresh()
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ type NowPlayingCard struct {
|
|||||||
trackName *widget.Hyperlink
|
trackName *widget.Hyperlink
|
||||||
artistName *MultiHyperlink
|
artistName *MultiHyperlink
|
||||||
albumName *widget.Hyperlink
|
albumName *widget.Hyperlink
|
||||||
cover *TappableImage
|
cover *ImagePlaceholder
|
||||||
menu *widget.PopUpMenu
|
menu *widget.PopUpMenu
|
||||||
ratingMenu *fyne.MenuItem
|
ratingMenu *fyne.MenuItem
|
||||||
|
|
||||||
@@ -45,17 +45,16 @@ func NewNowPlayingCard() *NowPlayingCard {
|
|||||||
albumName: widget.NewHyperlink("", nil),
|
albumName: widget.NewHyperlink("", nil),
|
||||||
}
|
}
|
||||||
n.ExtendBaseWidget(n)
|
n.ExtendBaseWidget(n)
|
||||||
n.cover = NewTappableImage(n.onShowCoverImage)
|
n.cover = NewImagePlaceholder(myTheme.TracksIcon, 85)
|
||||||
|
n.cover.OnTapped = n.onShowCoverImage
|
||||||
n.cover.OnTappedSecondary = n.showMenu
|
n.cover.OnTappedSecondary = n.showMenu
|
||||||
|
n.cover.ScaleMode = canvas.ImageScaleFastest
|
||||||
|
n.cover.Hidden = true
|
||||||
n.trackName.Hidden = true
|
n.trackName.Hidden = true
|
||||||
n.albumName.Hidden = true
|
n.albumName.Hidden = true
|
||||||
n.albumName.Truncation = fyne.TextTruncateEllipsis
|
n.albumName.Truncation = fyne.TextTruncateEllipsis
|
||||||
n.trackName.Truncation = fyne.TextTruncateEllipsis
|
n.trackName.Truncation = fyne.TextTruncateEllipsis
|
||||||
n.trackName.TextStyle.Bold = true
|
n.trackName.TextStyle.Bold = true
|
||||||
n.cover.SetMinSize(fyne.NewSquareSize(85))
|
|
||||||
n.cover.FillMode = canvas.ImageFillContain
|
|
||||||
n.cover.ScaleMode = canvas.ImageScaleFastest
|
|
||||||
n.cover.Hidden = true
|
|
||||||
n.albumName.OnTapped = n.onAlbumNameTapped
|
n.albumName.OnTapped = n.onAlbumNameTapped
|
||||||
n.artistName.OnTapped = n.onArtistNameTapped
|
n.artistName.OnTapped = n.onArtistNameTapped
|
||||||
n.trackName.OnTapped = n.onTrackNameTapped
|
n.trackName.OnTapped = n.onTrackNameTapped
|
||||||
@@ -119,30 +118,35 @@ func (n *NowPlayingCard) CreateRenderer() fyne.WidgetRenderer {
|
|||||||
return widget.NewSimpleRenderer(c)
|
return widget.NewSimpleRenderer(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *NowPlayingCard) Update(track mediaprovider.MediaItem, cover image.Image) {
|
func (n *NowPlayingCard) Update(track mediaprovider.MediaItem) {
|
||||||
if track == nil {
|
if track == nil {
|
||||||
n.trackName.SetText("")
|
n.trackName.SetText("")
|
||||||
n.artistName.BuildSegments([]string{}, []string{})
|
n.artistName.BuildSegments([]string{}, []string{})
|
||||||
n.albumName.SetText("")
|
n.albumName.SetText("")
|
||||||
|
n.cover.Hidden = true
|
||||||
} else {
|
} else {
|
||||||
|
n.cover.Hidden = false
|
||||||
n.trackName.SetText(track.Metadata().Name)
|
n.trackName.SetText(track.Metadata().Name)
|
||||||
if tr, ok := track.(*mediaprovider.Track); ok {
|
if tr, ok := track.(*mediaprovider.Track); ok {
|
||||||
n.artistName.BuildSegments(tr.ArtistNames, tr.ArtistIDs)
|
n.artistName.BuildSegments(tr.ArtistNames, tr.ArtistIDs)
|
||||||
n.albumName.SetText(tr.Album)
|
n.albumName.SetText(tr.Album)
|
||||||
|
n.cover.PlaceholderIcon = myTheme.TracksIcon
|
||||||
} else {
|
} else {
|
||||||
n.artistName.BuildSegments([]string{}, []string{})
|
n.artistName.BuildSegments([]string{}, []string{})
|
||||||
n.albumName.SetText("")
|
n.albumName.SetText("")
|
||||||
|
n.cover.PlaceholderIcon = myTheme.RadioIcon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n.trackName.Hidden = n.trackName.Text == ""
|
n.trackName.Hidden = n.trackName.Text == ""
|
||||||
n.artistName.Hidden = len(n.artistName.Segments) == 0
|
n.artistName.Hidden = len(n.artistName.Segments) == 0
|
||||||
n.albumName.Hidden = n.albumName.Text == ""
|
n.albumName.Hidden = n.albumName.Text == ""
|
||||||
n.cover.Image.Image = cover
|
|
||||||
n.cover.Hidden = cover == nil
|
|
||||||
n.Refresh()
|
n.Refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n *NowPlayingCard) SetImage(cover image.Image) {
|
||||||
|
n.cover.SetImage(cover, true)
|
||||||
|
}
|
||||||
|
|
||||||
func (n *NowPlayingCard) showMenu(e *fyne.PointEvent) {
|
func (n *NowPlayingCard) showMenu(e *fyne.PointEvent) {
|
||||||
if n.menu == nil {
|
if n.menu == nil {
|
||||||
n.ratingMenu = util.NewRatingSubmenu(n.onSetRating)
|
n.ratingMenu = util.NewRatingSubmenu(n.onSetRating)
|
||||||
|
|||||||
@@ -372,6 +372,11 @@ func (p *PlayQueueListRow) Update(tm *util.TrackListModel, rowNum int) {
|
|||||||
// a new track (*mediaprovider.Track)
|
// a new track (*mediaprovider.Track)
|
||||||
meta := tm.Item.Metadata()
|
meta := tm.Item.Metadata()
|
||||||
if meta.ID != p.trackID {
|
if meta.ID != p.trackID {
|
||||||
|
if meta.Type == mediaprovider.MediaItemTypeRadioStation {
|
||||||
|
p.cover.PlaceholderIcon = myTheme.RadioIcon
|
||||||
|
} else {
|
||||||
|
p.cover.PlaceholderIcon = myTheme.TracksIcon
|
||||||
|
}
|
||||||
p.imageLoader.Load(meta.CoverArtID)
|
p.imageLoader.Load(meta.CoverArtID)
|
||||||
p.EnsureUnfocused()
|
p.EnsureUnfocused()
|
||||||
p.trackID = meta.ID
|
p.trackID = meta.ID
|
||||||
|
|||||||
Reference in New Issue
Block a user