// capture_browser.h — layout + hit-test for the capture-first editor's default face: a // scannable grid of capture cards with a bank-filter tab strip above it. Mirror of // editor_geometry/embed_strip/mode_switch; the shell draws thumbnails/names/badges and // routes clicks into these functions. // // This module knows only counts and rects — it draws nothing and holds no sample data; // the shell owns the SampleChoice list, peak envelopes, and filter state. // // Scroll is layered on top by browser_scroll — this module lays out every card top-down // and the shell clips at the bottom until a scroll offset is applied. #pragma once #include "core/instrument/ui/editor_geometry.h" // Rect, contains namespace reasampler::instrument::ui { // Fixed browser metrics, exposed so the shell and tests agree. inline constexpr int kBrowserTabHeight = 26; inline constexpr int kBrowserCardWidth = 132; inline constexpr int kBrowserCardHeight = 84; inline constexpr int kBrowserCardGutter = 8; inline constexpr int kBrowserThumbHeight = 44; // Clamped so a degenerate (tiny/zero) size never yields an inverted rect. struct BrowserLayout { Rect tabStrip; Rect grid; int columns = 1; // cards per row in `grid` (>= 1) }; // Divide a (w x h) browser area into its regions and compute the column count. columns = // max(1, grid.width/cardWidth) so a browser narrower than one card still lays out a // single column. BrowserLayout layoutBrowser(int w, int h); // Cell rect of capture card `index` (0-based), left-to-right then top-to-bottom across // `columns`. This is the full cell (card + gutter); cardContentRect insets it. Rect cardCellRect(const BrowserLayout& layout, int index); // Drawable card rect inside a cell: the cell inset by kBrowserCardGutter on all sides. Rect cardContentRect(const BrowserLayout& layout, int index); // Peak-thumbnail sub-rect at the top of a card's content: full card width, the top // kBrowserThumbHeight (clamped to the card height). Rect cardThumbnailRect(const BrowserLayout& layout, int index); // Name/badge sub-rect below the thumbnail. Rect cardLabelRect(const BrowserLayout& layout, int index); // Card a click at (x, y) lands on, given `cardCount` cards, or -1 for a miss. Only the // card content rect counts as a hit — a click in the inter-card gutter is a miss. int cardHitTest(const BrowserLayout& layout, int cardCount, int x, int y); // --- Bank-filter tabs --------------------------------------------------------- // // Divides tabStrip into `tabCount` equal segments: one tab per bank plus a leading "All" // tab the shell prepends. This module only divides the strip + hit-tests; the shell // supplies labels and tracks the active tab. // Rect of tab `index` when the strip is divided into `tabCount` equal segments. The last // tab absorbs any width remainder so the tabs tile the whole strip with no gap. Rect filterTabRect(const BrowserLayout& layout, int tabCount, int index); int filterTabHitTest(const BrowserLayout& layout, int tabCount, int x, int y); } // namespace reasampler::instrument::ui