Loop-crossfade-ux review fixes: parked-drag no longer fakes LOOP OFF, waveform label contrast fixed, hover memoizes its bank read

Also corrects the cap-area, em-dash, glyph-overhang and heuristic-comment findings noted in review.
This commit is contained in:
2026-08-02 05:50:38 -04:00
parent a7c3c7a828
commit 1b4d0e67b7
10 changed files with 125 additions and 27 deletions
+11 -4
View File
@@ -337,9 +337,10 @@ private:
// instance's own SampleRefs as the self-contained fallback. "" when unresolvable.
std::string samplePathFor(const std::string& sampleId) const;
// The effective loop + start markers for the loaded capture. The state machine behind them
// — which stored source wins, when the pair re-parks, what the two OFF states mean — is the
// pure loop_marks module's; this only reads the bank intrinsic it cannot see.
// The effective loop + start markers for the loaded capture; the state machine behind them
// is the pure loop_marks module's. With no override set this costs a bridge read plus a bank
// parse — hoverWaveform calls it on every WM_MOUSEMOVE, so the answer is memoized (see
// HoldNeedKey below, which this shares) rather than paid per move.
SetupMarkers pickedMarkers(std::int64_t frames) const;
// Whether the loop controls answer at all: the sustain loop is Gate-only, so in Trigger the
@@ -365,16 +366,22 @@ private:
bool resolveBakeHoldNeeded();
// What that answer was last computed against. Invalidated wholesale by refreshFromBank,
// which is where the bank half of the input changes.
// which is where the bank half of the input changes. pickedMarkers' own memo (below) shares
// this key shape rather than declaring a second one; resolveBakeHoldNeeded leaves startPoint
// at its default (nullopt) since its own answer doesn't depend on it.
struct HoldNeedKey {
std::string sampleId;
std::optional<SampleLoop> loopOverride;
std::int64_t crossfade = 0;
std::optional<std::int64_t> startPoint;
bool operator==(const HoldNeedKey& other) const;
};
HoldNeedKey holdNeedKey_;
bool holdNeedValid_ = false;
bool holdNeedAnswer_ = false;
mutable HoldNeedKey marksKey_;
mutable SetupMarkers marksCache_;
mutable bool marksValid_ = false;
// Writes `m` into params_ as the loop/start override. Does NOT call commitAndReload —
// callers decide live-drag vs final commit.