fix(player): finalize lyrics and park waveform

Hide the waveform controls and force every now-playing bar back to the classic seekbar while preserving the implementation for a later release. Keep full-screen timed lyrics centered, slightly larger and wrapped without changing the approved typography or fill.

cx
This commit is contained in:
vicrodh committed 2026-08-25 10:17:43 -06:00
1 parent 9b4bb865bf
commit a92dafa734
9 files changed
+42 -24

No files matched your search

@@ -206,9 +206,8 @@ Item {
font.letterSpacing: 1.5
}
Repeater {
// FOCUS rows IN SLINT ORDER (:586-650): Album Reactive(0),
// Static(1), Coverflow(2), Spectrum(3), Wave Bed(6),
// Goniometer(7), Oscilloscope(8), Lyrics(4), Queue(5).
// FOCUS owner order: the two reading surfaces sit directly below
// Coverflow; the reactive visualizers follow them.
model: [
{ "vm": 0, "m": 0, "sp": -1, "entry": "",
"label": QbzSession.tr("Album Reactive", QbzSession.trRev) },
@@ -216,6 +215,10 @@ Item {
"label": QbzSession.tr("Static", QbzSession.trRev) },
{ "vm": 0, "m": 2, "sp": -1, "entry": "",
"label": QbzSession.tr("Coverflow", QbzSession.trRev) },
{ "vm": 0, "m": 4, "sp": -1, "entry": "",
"label": QbzSession.tr("Lyrics", QbzSession.trRev) },
{ "vm": 0, "m": 5, "sp": -1, "entry": "queue",
"label": QbzSession.tr("Queue", QbzSession.trRev) },
{ "vm": 0, "m": 3, "sp": -1, "entry": "",
"label": QbzSession.tr("Spectrum", QbzSession.trRev) },
{ "vm": 0, "m": 6, "sp": -1, "entry": "",
@@ -224,10 +227,6 @@ Item {
"label": QbzSession.tr("Goniometer", QbzSession.trRev) },
{ "vm": 0, "m": 8, "sp": -1, "entry": "",
"label": QbzSession.tr("Oscilloscope", QbzSession.trRev) },
{ "vm": 0, "m": 4, "sp": -1, "entry": "",
"label": QbzSession.tr("Lyrics", QbzSession.trRev) },
{ "vm": 0, "m": 5, "sp": -1, "entry": "queue",
"label": QbzSession.tr("Queue", QbzSession.trRev) },
]
delegate: menuRow
}
@@ -4,9 +4,9 @@
// built fresh — shell/SongCard.qml is the bar's INTERACTIVE meta-link card
// with AudioStamp; this twin is NON-interactive with the E chip).
//
// Mounted by ImmersiveView as layer 4 over Wave Bed, full Lyrics and every
// shader scene, bottom-right with 24px insets. It does NOT fade with the
// auto-hide chrome. Content-sized: the card hugs its content
// Mounted by ImmersiveView as layer 4 over Wave Bed, full Lyrics, both scopes
// and every shader scene, bottom-right with 24px insets. It does NOT fade with
// the auto-hide chrome. Content-sized: the card hugs its content
// and the mount pins it bottom-right, so a wider card grows LEFTWARD.
//
// meta column (right-aligned): title 15px semibold capped 420px + elide
@@ -29,7 +29,7 @@
// spectrum band and the viz eye toggle; port of the Slint root
// TouchArea :1283-1286). Stacked BELOW panels + chrome.
// 3. FOCUS panels (viewMode==0 && mode==N) / the SPLIT layout (viewMode==1)
// 4. ImmersiveSongCard (Wave Bed, full Lyrics and shader scenes;
// 4. ImmersiveSongCard (Wave Bed, full Lyrics, scopes and shader scenes;
// does NOT fade with the chrome)
// 5. ImmersivePlayerBar (B5, :1607-1616) — centered, y = height-90-24,
// fades with the chrome like the header
@@ -639,9 +639,9 @@ Item {
// --- Layer 4: ImmersiveSongCard (§5.1, :1602-1605) ----------------------
// Keep the compact bottom-right metadata over shader backgrounds,
// Wave Bed and full-screen Lyrics. The lyrics surface deliberately keeps
// one line at a time, so the card supplies the otherwise absent track
// context without competing with the active line.
// Wave Bed, full-screen Lyrics and the two scope views. The lyrics surface
// deliberately keeps one line at a time, so the card supplies the
// otherwise absent track context without competing with the active line.
// shader-mode was constant 0 so the first arm was dead (trap 19); A1
// makes it real. NON-interactive; does NOT fade with the auto-hide
// chrome (no opacity binding here — that is deliberate).
@@ -653,7 +653,8 @@ Item {
anchors.bottomMargin: 24
visible: (QbzShaderScene.scene > 0
|| (QbzImmersive.viewMode === 0
&& (QbzImmersive.mode === 4 || QbzImmersive.mode === 6)))
&& (QbzImmersive.mode === 4 || QbzImmersive.mode === 6
|| QbzImmersive.mode === 7 || QbzImmersive.mode === 8)))
&& QbzPlayer.npHasTrack
}
@@ -51,10 +51,11 @@ Item {
readonly property bool noLyrics: root.status === 3
|| (root.status === 2 && root.lines.length === 0)
// Same responsive active size as immersive split lyrics. Keeping this
// scale identical prevents a jarring type jump between full and split.
readonly property real lineSize: Math.round(Math.max(28,
Math.min(root.width * 0.022, 42)))
// Keep the split-view typeface and weight, with a modest size lift for
// the single-line stage. The bounded content width below remains the
// wrapping authority, so longer lines gain rows rather than clipping.
readonly property real lineSize: Math.round(Math.max(30,
Math.min(root.width * 0.026, 48)))
readonly property string fontDir: "qrc:/qt/qml/com/blitzfc/qbz/qml/assets/fonts/"
FontLoader { id: fLineSeed; source: QbzLyrics.fontIndex === 1 ? root.fontDir + "LINESeedJP-Regular.ttf" : "" }
@@ -113,6 +114,7 @@ Item {
fontFamily: root.fontFamily
activeColor: "#ffffff"
liteFill: false
centered: true
textShadow: true
// The translate-up is applied via anchors.verticalCenterOffset so
// the centering anchor survives the offset.
@@ -416,6 +416,9 @@ Column {
}
}
SettingRow {
// Parked for a later visual pass. Keep the preference wiring intact so
// restoring the experiment does not require a settings migration.
visible: false
label: QbzSession.tr("Track waveform", QbzSession.trRev)
description: QbzSession.tr("Show the full-track waveform in the player seek bar.", QbzSession.trRev)
QbzToggle {
@@ -57,6 +57,9 @@ Column {
// Lite fill: light the active line whole, no per-frame clip sweep.
property bool liteFill: false
property bool showTranslation: false
// Full-screen one-line lyrics centre every visual wrap segment while the
// split list keeps its established left alignment.
property bool centered: false
// The full-screen one-line host enables this lightweight native text
// shadow. It avoids an extra blurred layer while keeping every glyph
// readable over arbitrary album artwork.
@@ -110,6 +113,7 @@ Column {
width: row.contentWidth
text: row.displayText
wrapMode: Text.WordWrap
horizontalAlignment: row.centered ? Text.AlignHCenter : Text.AlignLeft
opacity: row.lineOpacity()
// 1:1 with Slint's 220ms ease-out: upcoming lines fade IN as they
// brighten toward active, passed lines fade OUT to their dim tier,
@@ -204,6 +208,7 @@ Column {
delegate: Item {
id: seg
required property var modelData
x: row.centered ? (row.contentWidth - width) * 0.5 : 0
width: segBase.width
height: segBase.height
@@ -269,6 +274,7 @@ Column {
width: row.contentWidth
text: row.translationText
wrapMode: Text.WordWrap
horizontalAlignment: row.centered ? Text.AlignHCenter : Text.AlignLeft
opacity: row.lineOpacity()
Behavior on opacity { NumberAnimation { duration: 220; easing.type: Easing.OutQuad } }
// Slint: text-muted when past, text-secondary @ 0.7 otherwise.
@@ -44,8 +44,9 @@ Rectangle {
// PlayerBarSmall.slint).
color: ambientOn ? theme.surfaceCardA50 : theme.surfaceCard
readonly property bool ambientOn: theme.ambientOn
readonly property bool waveformVisible: QbzShell.seekbarWaveform
&& QbzPlayer.npHasTrack
// Feature parked for a later release. Keep the compact renderer in place
// but use the classic seekbar consistently with the other NPB modes.
readonly property bool waveformVisible: false
QbzTheme { id: theme }
+3 -3
View File
@@ -73,9 +73,9 @@ Rectangle {
readonly property bool ambientOn: theme.ambientOn
readonly property bool largeActive: QbzShell.npbMode === 3 && QbzShell.sidebarState === 0
readonly property bool isClassic: QbzShell.npbMode === 1
readonly property bool waveformVisible: QbzShell.seekbarWaveform
&& QbzPlayer.npSeekWaveformAnalyzed > 0
&& QbzPlayer.npSeekWaveform.length > 0
// Feature parked for a later release. The renderer and preference remain
// intact; every full-height NPB uses the classic seekbar for now.
readonly property bool waveformVisible: false
// The shell's shared hover-tooltip overlay (controls/QbzTooltip.qml),
// fed in through NowPlayingBar.qml's Binding. Consumed by the Qobuz
+6
View File
@@ -83,6 +83,9 @@ QbzContextMenu {
}
Item {
// Park this divider with the hidden waveform row. The live divider
// below remains the single boundary before the window-mode actions.
visible: false
width: parent ? parent.width : 0
height: 7
Rectangle {
@@ -94,6 +97,9 @@ QbzContextMenu {
}
}
Rectangle {
// The waveform seekbar is parked for a later release. Preserve this
// control and its preference wiring, but do not expose a dead toggle.
visible: false
width: parent ? parent.width : 0
height: 33
radius: 5