fix(qbz-qt): covers were never actually resized, plus the adversarial parity round

**The scaled-cover fix from the last round produced nothing.** The seam ran —
462 requests in one offscreen smoke — and wrote zero files, so the owner was
right that nothing improved. The artwork cache stores files as `.img`, and
`image::open` picks its decoder from the EXTENSION, so every call failed
silently. Sniffing the content instead yields 101 derivatives on the same run.
The header atmosphere had the identical bug and had therefore never produced an
image either, which is why the flat fallback was all anyone ever saw.

Reported as fixed last round without checking that it ran. Verified by effect
this time, not by reading the diff.

The rest came through an analyse / refute / implement / verify pipeline, and the
adversarial passes earned their keep:

- The sidebar mini rail: icons sat left of centre because their slot kept its
  fixed 24px width while the rail collapsed, so the hit target was rectangular
  and off-axis. The rail narrows, rows are square, and the mini state gains the
  folder flyout and tooltips it never had. The reviewer caught a comment
  claiming the width change was a one-token revert when it is two — corrected
  rather than left to mislead the next reader.
- Playback context now travels from every producer, not the handful that
  happened to stamp it.
- Collapsible per-tab search in Library, and label artwork.
- Every View-all destination Home offers, plus the label page and its releases.
- Collapsing the sidebar drops a Large bar back to New, live, without
  overwriting the user's persisted preference.

cc
This commit is contained in:
vicrodh committed 2026-07-29 00:06:34 -06:00
1 parent 2a5b5ac16e
commit c56fab3c4e
34 files changed
+6234 -201

No files matched your search

@@ -0,0 +1,74 @@
// AlbumListHeader — primitives/AlbumListRow.slint:43-127, the column header
// above the LIST arm of an album collection (Discover Browse, Label
// Releases). 32px, 11px semibold muted labels with 0.5 letter-spacing and a
// bottom hairline.
//
// COLUMN SET, and why it is shorter than the Slint's: `AlbumListCols` there
// is rank · art · ITEM · TYPE · SOURCE · QUALITY · TRACKS · YEAR · overflow.
// The Qt transport for these pages is `home_qt::HomeCard`, which carries no
// release type and no track count, and SOURCE is hidden on both catalog
// pages anyway (`show-source: false`, DiscoverBrowseView.slint:168). Naming
// columns with nothing under them is worse than not drawing them, so the
// header lists exactly the three the rows fill. Widths are the Slint's.
import QtQuick
import com.blitzfc.qbz
import "../theme"
Rectangle {
id: root
QbzTheme { id: theme }
// AlbumListCols: art 52, quality 150, year 64, overflow 36, gap 12.
readonly property int colArt: 52
readonly property int colQuality: 150
readonly property int colYear: 64
readonly property int colOverflow: 36
readonly property int colGap: 12
width: parent ? parent.width : 0
height: 32
color: "transparent"
component ColLabel: Text {
color: theme.textMuted
font.pixelSize: 11
font.weight: theme.weightSemibold
font.letterSpacing: 0.5
verticalAlignment: Text.AlignVCenter
height: 32
}
Row {
anchors.fill: parent
anchors.leftMargin: 12
anchors.rightMargin: 12
spacing: root.colGap
Item { width: root.colArt; height: 1 }
ColLabel {
width: parent.width - root.colArt - root.colQuality - root.colYear
- root.colOverflow - 4 * root.colGap
text: QbzSession.tr("ITEM", QbzSession.trRev)
elide: Text.ElideRight
}
ColLabel {
width: root.colQuality
text: QbzSession.tr("QUALITY", QbzSession.trRev)
}
ColLabel {
width: root.colYear
text: QbzSession.tr("YEAR", QbzSession.trRev)
horizontalAlignment: Text.AlignHCenter
}
Item { width: root.colOverflow; height: 1 }
}
Rectangle {
y: parent.height - 1
width: parent.width
height: 1
color: theme.borderSubtle
}
}