forked from 1b-agent/opencadstudio-upstream
Each ribbon panel was rendered five ways every frame so CollapsePanels could roll back to any density at layout time: full, compact, button, tight and a full-size flyout that duplicated the full rendering. The layout pass ran four full measure-layouts per panel even in forced modes, and the degradation decision was an untested u8 inline in Ribbon::view. Now the choice is a pure, unit-tested decide_levels() whose levels are a typed Level enum (Full/Compact/Collapsed/Tight). Panel carries its four renderings as elements: [Element; 4] indexed by Level, with a slot(i, level) helper for the tree stride. Forced modes (Full/Compact/Collapsed) measure nothing at all and derive the row height from the placed panel. The open flyout draws the panel's own `full` rendering inside a self-drawn box (identical weakest-bg + 1px neutral-border to the container it replaced), so no duplicate render_group is built per panel per frame. Level, Panel, Widths, CollapsePanels and decide_levels are pub(crate); CollapseMode stays pub (re-exported). Tests (collapse.rs tests module, added RED first): - forced_modes_pin_every_panel - auto_huge_width_keeps_everything_full - auto_degrades_from_the_right_one_panel_at_a_time - auto_stops_degrading_once_the_row_fits - auto_escalates_a_single_panel_past_collapsed_to_tight - auto_cascade_drops_every_collapsed_panel_to_tight - auto_runs_the_compact_phase_across_the_row_first - no_panels_stays_empty - single_panel_walks_the_whole_ladder - zero_widths_never_overflow - endless_row_degrades_everything_to_tight - unbounded_row_keeps_everything_full - nan_budget_degrades_both_phases_but_no_tight_cascade - exact_fit_at_full_stays_full - matches_the_pre_refactor_algorithm: byte-equivalence sweep against the verbatim pre-refactor u8 algorithm (280 width/budget combos incl. the degenerate 0/0/inf/NaN inputs), proving the decision logic is unchanged. Measured with the committed #[ignore]d benchmark (`cargo test --lib --release -- --ignored --nocapture bench_ribbon_view_construction`) run as one instrument across pre-change / this change: Ribbon::view() construction ~676 -> ~425 us/frame (~37% of view construction saved); forced modes run 1 layout call per panel per frame instead of 5. Verification: cargo build clean; cargo test --lib = 382 passed (367 baseline + 15 new ribbon tests) / 2 known pre-existing failures unchanged (save_then_open_round_trips, tilted_ucs_places_planar_entities_with_the_plane_normal).