From ba7be747a7acb8ee23617c4ea5a7e064bb913f22 Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Mon, 13 Jul 2026 20:56:04 -0600 Subject: [PATCH] fix(immersive): persist volume on drag-end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The immersive VolumeBar only called set-volume (live) and never persist-volume, so a volume set in the immersive view was lost on restart/track-change. Adds a released(float) callback emitted on pointer-up, wired to NowPlayingState.persist-volume — parity with the NPB sliders. Pure .slint; persist-volume already exists in Rust. cc --- crates/qbz-ui/ui/immersive/ImmersiveView.slint | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/crates/qbz-ui/ui/immersive/ImmersiveView.slint b/crates/qbz-ui/ui/immersive/ImmersiveView.slint index 9c9db0bd4..4e883b8b8 100644 --- a/crates/qbz-ui/ui/immersive/ImmersiveView.slint +++ b/crates/qbz-ui/ui/immersive/ImmersiveView.slint @@ -153,7 +153,8 @@ component TinyBar inherits Rectangle { component VolumeBar inherits Rectangle { in property value: 0.0; // 0..1 in property locked: false; - callback changed(float); // emits 0..1 + callback changed(float); // emits 0..1 — live (every drag tick) + callback released(float); // emits 0..1 — drag-end only (persist) // The visual fill fraction: pinned to 100% when locked (matches Tauri). property shown: root.locked ? 1.0 : Math.max(0.0, Math.min(1.0, root.value)); @@ -226,6 +227,13 @@ component VolumeBar inherits Rectangle { root.changed(Math.max(0.0, Math.min(1.0, self.mouse-x / self.width))); } } + // Persist only the final value on drag-end (matches the NPB sliders' + // released -> persist-volume; live changes still fire via changed). + pointer-event(e) => { + if (!root.locked && e.kind == PointerEventKind.up) { + root.released(Math.max(0.0, Math.min(1.0, self.mouse-x / self.width))); + } + } } } @@ -354,6 +362,11 @@ component ImmersivePlayerBar inherits Rectangle { NowPlayingState.set-volume(v); } } + released(v) => { + if (!root.vol-locked) { + NowPlayingState.persist-volume(v); + } + } } Rectangle { x: root.width - 42px;