refactor: group selection state into a Selection sub-struct + ClearSelection()
The box-selection state was 11 fields spread across three comment blocks (time sel, freq sel, drag state). Consolidate them into one Selection sub-struct (app.sel.*) and extract the 4-line 'clear to full range' block — duplicated in 5 places — into a ClearSelection() helper. Pure mechanical rename (anchored to app./spa-> so the ScopeView fields of the same name are untouched) + behavior-identical dedup. Fully-settled render verified pixel-identical (AE=0). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+18
-18
@@ -341,9 +341,9 @@ void DrawLabels(Rectangle bounds)
|
||||
void DrawSelection(Rectangle bounds)
|
||||
{
|
||||
// Only draw if selection is not full range AND not currently dragging
|
||||
bool hasSelection = (app.timeSelectionStart > 0.001f || app.timeSelectionEnd < 0.999f ||
|
||||
app.freqSelectionStart > 0.001f || app.freqSelectionEnd < 0.999f);
|
||||
if (!hasSelection || app.isTimeSelecting) return; // Don't draw overlay while dragging
|
||||
bool hasSelection = (app.sel.timeStart > 0.001f || app.sel.timeEnd < 0.999f ||
|
||||
app.sel.freqStart > 0.001f || app.sel.freqEnd < 0.999f);
|
||||
if (!hasSelection || app.sel.isTimeSelecting) return; // Don't draw overlay while dragging
|
||||
|
||||
Color overlayColor = Fade(BLACK, 0.25f); // Lighter overlay
|
||||
|
||||
@@ -351,10 +351,10 @@ void DrawSelection(Rectangle bounds)
|
||||
float viewWidth = app.viewEnd - app.viewStart;
|
||||
float freqWidth = app.freqViewEnd - app.freqViewStart;
|
||||
|
||||
float selStartX = bounds.x + ((app.timeSelectionStart - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selEndX = bounds.x + ((app.timeSelectionEnd - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selStartY = bounds.y + bounds.height - ((app.freqSelectionEnd - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
float selEndY = bounds.y + bounds.height - ((app.freqSelectionStart - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
float selStartX = bounds.x + ((app.sel.timeStart - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selEndX = bounds.x + ((app.sel.timeEnd - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selStartY = bounds.y + bounds.height - ((app.sel.freqEnd - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
float selEndY = bounds.y + bounds.height - ((app.sel.freqStart - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
|
||||
// Clamp to viewport bounds
|
||||
selStartX = fmaxf(bounds.x, fminf(bounds.x + bounds.width, selStartX));
|
||||
@@ -373,8 +373,8 @@ void DrawSelection(Rectangle bounds)
|
||||
|
||||
// Display selection stats inside viewport, clamped to fit
|
||||
{
|
||||
int startSample = (int)(app.timeSelectionStart * app.signal.numSamples);
|
||||
int endSample = (int)(app.timeSelectionEnd * app.signal.numSamples);
|
||||
int startSample = (int)(app.sel.timeStart * app.signal.numSamples);
|
||||
int endSample = (int)(app.sel.timeEnd * app.signal.numSamples);
|
||||
SignalStats stats = ComputeSignalStats(&app.signal, startSample, endSample);
|
||||
|
||||
if (stats.durationSec > 0.0f && app.signal.samples != NULL) {
|
||||
@@ -439,17 +439,17 @@ void DrawSelection(Rectangle bounds)
|
||||
void DrawSelectionDrag(Rectangle bounds)
|
||||
{
|
||||
// Draw bounding box while dragging (no overlay)
|
||||
if ((!app.isTimeSelecting && !app.isFreqSelecting && !app.isDraggingSelection) ||
|
||||
(app.isDraggingSelection && !IsMouseButtonDown(MOUSE_LEFT_BUTTON))) return;
|
||||
if ((!app.sel.isTimeSelecting && !app.sel.isFreqSelecting && !app.sel.isDragging) ||
|
||||
(app.sel.isDragging && !IsMouseButtonDown(MOUSE_LEFT_BUTTON))) return;
|
||||
|
||||
// Convert signal coordinates to viewport coordinates
|
||||
float viewWidth = app.viewEnd - app.viewStart;
|
||||
float freqWidth = app.freqViewEnd - app.freqViewStart;
|
||||
|
||||
float selStartX = bounds.x + ((app.timeSelectionStart - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selEndX = bounds.x + ((app.timeSelectionEnd - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selStartY = bounds.y + bounds.height - ((app.freqSelectionEnd - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
float selEndY = bounds.y + bounds.height - ((app.freqSelectionStart - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
float selStartX = bounds.x + ((app.sel.timeStart - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selEndX = bounds.x + ((app.sel.timeEnd - app.viewStart) / viewWidth) * bounds.width;
|
||||
float selStartY = bounds.y + bounds.height - ((app.sel.freqEnd - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
float selEndY = bounds.y + bounds.height - ((app.sel.freqStart - app.freqViewStart) / freqWidth) * bounds.height;
|
||||
|
||||
// Clamp to viewport bounds
|
||||
selStartX = fmaxf(bounds.x, fminf(bounds.x + bounds.width, selStartX));
|
||||
@@ -467,8 +467,8 @@ void DrawSelectionDrag(Rectangle bounds)
|
||||
|
||||
// Display live stats while dragging (inside viewport, clamped to fit)
|
||||
{
|
||||
int startSample = (int)(app.timeSelectionStart * app.signal.numSamples);
|
||||
int endSample = (int)(app.timeSelectionEnd * app.signal.numSamples);
|
||||
int startSample = (int)(app.sel.timeStart * app.signal.numSamples);
|
||||
int endSample = (int)(app.sel.timeEnd * app.signal.numSamples);
|
||||
SignalStats stats = ComputeSignalStats(&app.signal, startSample, endSample);
|
||||
|
||||
if (stats.durationSec > 0.0f && app.signal.samples != NULL) {
|
||||
@@ -538,7 +538,7 @@ void DrawPlayhead(Rectangle bounds)
|
||||
{
|
||||
if (!app.isPlaying || app.playheadT < 0.0f || app.playheadT > 1.0f) return;
|
||||
|
||||
float timePos = app.timeSelectionStart + app.playheadT * (app.timeSelectionEnd - app.timeSelectionStart);
|
||||
float timePos = app.sel.timeStart + app.playheadT * (app.sel.timeEnd - app.sel.timeStart);
|
||||
float viewWidth = app.viewEnd - app.viewStart;
|
||||
float t = (timePos - app.viewStart) / viewWidth;
|
||||
float x = bounds.x + t * bounds.width;
|
||||
|
||||
Reference in New Issue
Block a user