68 lines
3.0 KiB
C++
68 lines
3.0 KiB
C++
// 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
|