// curve_popup.h — PURE sheet geometry + dismissal test for the r11 velocity-curve popup // editor (Wave B, FB1). NO VST3, NO REAPER, NO SWELL/LICE types at the boundary. The mirror // of overflow_menu: the size-clamp / centering / title-row arithmetic lives here, unit-tested // at the clamps outside the DAW, while the editor shell draws the wash + sheet through the // L1 kit and routes clicks (close / curve box / outside-sheet dismiss) via these rects. // // THE POPUP (CONTEXT.md §S-VIEW r11). Summoned by the mini curve-preview button, a CENTERED // SHEET over the Sample face (a 0.50-alpha bg/base wash behind it — lighter than Browse's // 0.82; a focused sub-editor, not a view change): width clamp(60% of window, 360..520), // height clamp(55% of window, 260..380). Inside: a ~22px title row ("VELOCITY -> AMP" // micro-caps left, an 18x18 Close button right) over the full-size curve box filling the // remainder. The curve box rect here is the BORDER rect — the shell derives the mapping box // through its ONE curveBoxFromRect formula (the landed inset grammar), so the popup editor // and the Zone-panel inline editor share coordinates by construction. #pragma once #include "core/instrument/ui/editor_geometry.h" // Rect, contains namespace reasampler::instrument::ui { // Fixed popup metrics (spec r11), exposed so the shell and tests agree. inline constexpr int kCurvePopupMinW = 360; inline constexpr int kCurvePopupMaxW = 520; inline constexpr int kCurvePopupMinH = 260; inline constexpr int kCurvePopupMaxH = 380; inline constexpr int kCurvePopupTitleH = 22; inline constexpr int kCurvePopupCloseSize = 18; inline constexpr int kCurvePopupPad = 8; // sheet inner padding (title inset + box margins) struct CurvePopupLayout { Rect sheet; // the bg/panel sheet, centered in the window Rect title; // the caption text rect (left part of the title row) Rect close; // the 18x18 Close (x) button, right-anchored in the title row Rect curveBox; // the full-size curve editor BORDER rect (shell insets via curveBoxFromRect) }; // The popup geometry for a (w x h) window: sheet width clamp(60% w, 360..520) and height // clamp(55% h, 260..380) — each additionally capped at the window dimension so a degenerate // window never yields an overhanging sheet — centered; title row + close button at the top; // the curve box filling the remainder inside kCurvePopupPad margins. Pure. CurvePopupLayout computeCurvePopup(int w, int h); // True when (x, y) lands OUTSIDE the sheet (on the wash) — the click-outside dismissal test. // The shell additionally gates on "no drag in flight" (spec). Pure. bool popupOutsideSheet(const CurvePopupLayout& layout, int x, int y); } // namespace reasampler::instrument::ui