feat(qt): ambient background port, clip sweep and measurement tooling

Accumulated qt-frontend work from the 2026-08-11/12 sessions (cc),
uncommitted until now: the app-wide dynamic background in both modes
(AmbientField with GPU/Canvas arms, AppShell layering, ambient palette
pipeline), the wave-1 clip/batch sweep across the tree (alpha batches
449 -> 327, reproducible), the rounded-cover and icon-tint arms, and
scripts/qt-batches.sh (batches + presents/s sampler).

The GPU behaviour of these pieces was finalized in the follow-up pulse
commits; see qbz-nix-docs/qt-frontend/2026-08-11-scenegraph-batches/
GPU-COST-INVESTIGATION.md for the full campaign.

km
This commit is contained in:
vicrodh committed 2026-08-13 13:01:32 -06:00
1 parent 21e941bdf6
commit b136c9cf5d
60 files changed
+915 -162

No files matched your search

+15 -3
View File
@@ -161,10 +161,21 @@ Rectangle {
width: root.expandable ? (root.open ? root.openWidth : 0) : root.width
height: root.height
radius: (root.searchMode || root.expandable) ? 6 : theme.radiusSm
color: root.elevated ? theme.surfaceElevated : theme.surfaceCard
// Translucent under the app-wide dynamic background, on the SAME
// token the opaque arm uses: surface-card for the expandable search
// overlay (ExpandableSearch.slint:80), surface-elevated for the inline
// toolbar field (BrowseHeaderTools.slint:26).
color: root.elevated
? (theme.ambientOn ? theme.surfaceElevatedA50 : theme.surfaceElevated)
: (theme.ambientOn ? theme.surfaceCardA50 : theme.surfaceCard)
border.width: (root.expandable && !root.open) ? 0 : 1
border.color: input.activeFocus ? theme.accent : theme.borderSubtle
clip: true
// Load-bearing ONLY on the expandable arm, where `width` animates
// 0 -> openWidth past a fixed 14px magnifier and the 22/24px clear
// slot. On the plain arm the Row sums to exactly the box and the text
// is guarded one level down, so the scissor there was a free batch
// root on every mounted field.
clip: root.expandable
Behavior on width {
enabled: root.expandable
NumberAnimation { duration: 200; easing.type: Easing.InOutQuad }
@@ -191,7 +202,8 @@ Rectangle {
- (root.searchMode ? root.glyph + 7 : 0)
- (clearSlot.visible ? clearSlot.width + 7 : 0))
height: parent.height
clip: true
// No clip: TextInput scissors itself (:207) and the
// placeholder elides. A redundant second scissor.
TextInput {
id: input
anchors.fill: parent