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:
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 }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user