diff --git a/modules/Mpris.qml b/modules/Mpris.qml index 7d1b299..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 @@ -140,7 +155,7 @@ M.BarSection { // Album art Item { width: parent.width - height: _artImg.status === Image.Ready ? 140 : 60 + height: _artImg._hasArt ? 140 : 60 clip: true Rectangle { @@ -152,16 +167,16 @@ M.BarSection { id: _artImg anchors.fill: parent fillMode: Image.PreserveAspectCrop - visible: status === Image.Ready + visible: _hasArt asynchronous: true + source: root._cachedArt - 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 || "" } - source: _lastGoodSource + property bool _hasArt: false + onStatusChanged: if (status === Image.Ready) _hasArt = true + Connections { + target: root + function on_CachedArtChanged() { if (!root._cachedArt) _artImg._hasArt = false } + } } Rectangle {