diff --git a/modules/Mpris.qml b/modules/Mpris.qml index e8147e5..17f7c7f 100644 --- a/modules/Mpris.qml +++ b/modules/Mpris.qml @@ -13,6 +13,21 @@ M.BarSection { readonly property MprisPlayer player: Mpris.players.values[0] ?? null readonly property bool playing: player?.playbackState === MprisPlaybackState.Playing + property string _cachedArt: "" + property string _artTrack: "" + + // Cache art URL at root level so it's captured even when panel is hidden + readonly property string _artUrl: player?.trackArtUrl ?? "" + readonly property string _currentTrack: player?.trackTitle ?? "" + on_ArtUrlChanged: if (_artUrl) _cachedArt = _artUrl + on_CurrentTrackChanged: if (_currentTrack !== _artTrack) { _artTrack = _currentTrack; _cachedArt = _artUrl || "" } + + // Preload art while panel is hidden — ensures QML image cache has the pixels + Image { + visible: false + source: root._cachedArt + asynchronous: true + } required property var bar @@ -154,16 +169,14 @@ M.BarSection { fillMode: Image.PreserveAspectCrop visible: _hasArt asynchronous: true + source: root._cachedArt property bool _hasArt: false - property string _lastGoodSource: "" - property string _lastTrack: "" - readonly property string _artUrl: root.player?.trackArtUrl ?? "" - readonly property string _track: root.player?.trackTitle ?? "" - on_ArtUrlChanged: if (_artUrl) _lastGoodSource = _artUrl - on_TrackChanged: if (_track !== _lastTrack) { _lastTrack = _track; _lastGoodSource = _artUrl || ""; _hasArt = false } onStatusChanged: if (status === Image.Ready) _hasArt = true - source: _lastGoodSource + Connections { + target: root + function on_CachedArtChanged() { if (!root._cachedArt) _artImg._hasArt = false } + } } Rectangle {