fix: restore waveform symmetry about the midline, cut deck_values' link to the bank model, and unit-test the column arithmetic

The waveform column's vertical extents move to pure component_geometry so the shared
primitive stops being untested; PlaySeconds hoists into a header-only play_seconds target.
This commit is contained in:
2026-08-01 09:47:07 -04:00
parent 7f74b11dce
commit ca464397b2
17 changed files with 310 additions and 138 deletions
+11 -4
View File
@@ -153,11 +153,18 @@ struct DeckFaceHit {
bool inner = false; // inside the concentric inner disc
};
// A point inside the circle inscribed in `knob`, boundary-EXCLUSIVE. THE target rule for the
// reset gesture wherever a radial knob is drawn — the deck's own faces and the chrome's
// preview-velocity dial both resolve through it, so one gesture cannot grow two target rules.
bool inKnobFace(const Rect& knob, int x, int y);
// Resolved against the drawn CIRCLES, not the cell: a reset is aimed at a dial, so the label
// band and the cell margins must miss where a drag grab deliberately does not. Both radii are
// boundary-EXCLUSIVE, one rule for both rings — a point exactly on the inner radius is an
// outer-ring hit, one exactly on the outer radius is a miss. Whether a cell actually carries an
// inner value is deck_groups' call, exactly as with DeckHit::inner.
// band and the cell margins must miss where a drag grab deliberately does not. One rule for
// both rings — a point exactly on the inner radius is an outer-ring hit, one exactly on the
// outer radius is a miss. Whether a cell actually carries an inner value is deck_groups' call,
// exactly as with DeckHit::inner. Unlike hitTestDeck this runs NO toggle/radio precedence pass
// first, which is only correct while no toggle rect overlaps a knob circle — a layout change
// that lets them overlap has to give this the same precedence order.
DeckFaceHit hitTestKnobFace(const DeckLayout& layout, int x, int y);
} // namespace reasampler::instrument::ui