#pragma once #include "core/ui/rect.h" // overflow_menu — layout for the bank_panel top toolbar's "..." overflow-menu button: the rare // capture variants (Batch Items / Batch Razor / Capture RT) live in a popup opened by a small // square button right-anchored in the top toolbar band. Owns the button's placement and the // horizontal reserve action_bar must leave so its buttons never run under it. The popup itself // (TrackPopupMenu) and command dispatch are shell concerns. namespace reasampler::ui { // The toolbar band the button draws into, top-left origin. using MenuBarRect = Rect; // The More button's rect. Zero-area means "no button" — the three variants stay reachable via // their bindable commands regardless. using MenuButtonRect = Rect; // Layout inputs, in pixels; defaults match the bank_panel top-toolbar metrics. // * minLeftInset — button's left edge must stay at least this far from the band's left edge; // otherwise computeMenuButton suppresses it (empty rect). struct MenuButtonSpec { int buttonWidth = 28; int rightInset = 6; int verticalInset = 3; int minLeftInset = 40; }; // Horizontal reserve (px) action_bar must leave at the band's right: button width + both insets. // 0 for a degenerate band. int menuButtonReserve(const MenuBarRect& bar, const MenuButtonSpec& spec); // The More button's rect within `bar`, right-anchored, vertically centred by verticalInset. // Empty when the band is degenerate, buttonWidth <= 0, or the left edge would fall closer to the // band's left than minLeftInset. A thin band clamps height to the band's own rather than negative. MenuButtonRect computeMenuButton(const MenuBarRect& bar, const MenuButtonSpec& spec); // Half-open bounds, matching computeMenuButton. Empty button claims nothing. bool hitTestMenuButton(int px, int py, const MenuButtonRect& button); } // namespace reasampler::ui