test(queue): pin the panel's mouse model, and bound the highlight
Single click selects, ctrl and shift extend, double click plays from that row — all four already worked, and nothing in either tier pinned any of them, which is why the report could be made and could not be settled. `queue-reorder.spec.ts` covers the keyboard and `queue-overlay.spec.ts` the panel's mode; the pointer path had no coverage at all, so "selection is broken here" and "selection is fine here" were equally consistent with a green suite. Measured with real mouse events rather than dispatched ones, because a synthetic click aimed at the row bypasses the only thing that could be swallowing it: click row 1 selects 1, ctrl+click 4 gives 1 and 4, shift+click 7 extends to 1,4,5,6,7, a plain click collapses to one, and a double click on row 3 leaves the backend playing row 3. The three candidates the issue lists are all answered. The repaint was already correct, and already correct on the day the issue was filed. `resolveTrackIndexFromEvent` reads data-index, and DOM order matches data order. A row control does swallow the click — `explore-link` stops propagation on purpose, so a click on a name navigates and selects nothing — but a hit-scan across a row makes the queue 12% link against the track list's 21%, so the panel called broken is *less* covered by links than the list called correct. That measurement killed the fix this started out as. Two traps are written into the spec because both faked a defect while measuring. Fixture tracks are 2 seconds, so "double click row 3" read a moment later reports whatever auto-advance moved on to — recorded twice as an off-by-one that is not one, which is what `LONG_TRACK` exists for. And the selection assertions are bounded at 500ms rather than polled with the default 5s: `queue-panel` repaints two ways, the explicit `requestUpdate()` and a per-render `keyFunction` arrow, and with *both* removed the highlight still arrives — at 134ms, 3.9s and 5.8s against 5-17ms healthy. Four seconds is indistinguishable from broken to a user and invisible to a generous poll. Mutation-tested rather than trusted: `playAtIndex(index + 1)` fails both double-click tests, treating every click as ctrl+click fails both selection tests, and removing both repaint mechanisms fails all three selection tests — the last only because of the bound. Closes #43
This commit is contained in:
@@ -277,6 +277,26 @@ export class QueuePanel
|
||||
return this.queue.tracks.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Repaint the rows when the selection changes.
|
||||
*
|
||||
* `<lit-virtualizer>` renders through the `virtualize` directive,
|
||||
* which reacts to its *own* properties and not to the host having
|
||||
* re-rendered, so host state like a selection reaches the rows only
|
||||
* if it is pushed. `track-list` has always done this and both
|
||||
* playlist views had to be taught it.
|
||||
*
|
||||
* **There is a second, accidental mechanism here and it must not be
|
||||
* mistaken for this one**: `.keyFunction` below is a per-render
|
||||
* arrow, so it is a changed property on every host update and
|
||||
* repaints the rows by itself. Removing *either* alone changes
|
||||
* nothing observable, which is why #43 could not be settled by
|
||||
* reading the code. With both gone the highlight still arrives —
|
||||
* on whatever unrelated render happens next, measured at 134ms,
|
||||
* 3,866ms and 5,816ms against 5–17ms healthy, which a user cannot
|
||||
* tell from broken. `queue-selection.spec.ts` asserts the
|
||||
* *promptness* rather than the eventual state for that reason.
|
||||
*/
|
||||
onSelectionChanged(): void {
|
||||
this.virtualizer?.requestUpdate();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user