fix: close review findings on spline EGs — engine, codec, and popup/overlay UI grammar

Live pitch depth, Gate/Spline enable-rule agreement, inert kTrigLength, NaN wire guards, hard-flag-tail corruption no longer wipes the record, RT/cold spline tie-break, retired alt-click, marker-shadow fix, plus new test coverage.
This commit is contained in:
2026-07-31 22:27:41 -04:00
parent e44bd42dd9
commit 1c774226d3
22 changed files with 414 additions and 88 deletions
+11 -6
View File
@@ -112,17 +112,22 @@ void ReaSamplerEditor::onMouseUp(int x, int y) {
invalidate();
return;
}
// Drag-off delete: releasing a curve-node drag well outside the box removes the dragged
// point (deletePoint refuses the two endpoints, so an endpoint drag-off is a plain move —
// its amp keeps the last clamped drag value).
if (kind == DragKind::kCurveNode && curveIdx >= 0) {
// Drag-off delete: releasing a curve-node drag well outside its box removes the dragged
// point on EITHER spline surface — the popup's kCurveNode and the overlay's kSplineNode
// share this grammar, not just their click grammar (deletePoint refuses the two endpoints,
// so an endpoint drag-off is a plain move — its amp keeps the last clamped drag value).
if ((kind == DragKind::kCurveNode || kind == DragKind::kSplineNode) && curveIdx >= 0) {
const bool off = x < curveRect.x - kCurveDragOffMargin ||
x > curveRect.right() + kCurveDragOffMargin ||
y < curveRect.y - kCurveDragOffMargin ||
y > curveRect.bottom() + kCurveDragOffMargin;
if (off) {
editedCurve().deletePoint(static_cast<std::size_t>(curveIdx));
hover_ = HoverTarget{}; // stale kCurveNode index would light a shifted node
if (kind == DragKind::kCurveNode) {
editedCurve().deletePoint(static_cast<std::size_t>(curveIdx));
} else {
splineFor(overlayEnv_).deletePoint(static_cast<std::size_t>(curveIdx));
}
hover_ = HoverTarget{}; // stale node index would light a shifted node
}
}
commitAndReload();