feat(slices): per-pan дисплей — палитра/gamma/уровни на пан («◑»-поповер)

Кнопка «◑» в шапке каждого пана открывает компактный поповер настроек
отображения (палитра, gamma, ref/range спектра, авто-уровень водопада +
offset/ручные min-max). Модель «глобальный дефолт + override на пан»: пан 0
правит глобальные поля рендера (зеркалятся в контроллер), паны N ставят
DisplayOverride и персистятся в воркспейс раздельно КВ/трансвертер.

- PanDisplayPopup.pas (new): borderless fsStayOnTop форма, гаснет по
  OnDeactivate; Flat*-контролы; крестик «×» закрытия; дим-хинт «правки
  применяются и сохраняются сами»; кнопки «⟳ Reset»/«⇄ Copy to all».
- TPanafallPanel: FBtnDisplay + OnDisplayClick + DisplayOverride;
  PositionHeaderChildren каскадит [×][⧉][◑] справа по Visible.
- MainForm: OnPanDisplayClick/Applied/Reset/ApplyAll + ApplyGlobalRenderToView
  + MarkPanDisplayDirty. При смене палитры/сбросе чистим историю GL-водопада
  (TSpectrumView.ClearWaterfall) — GL хранит уже раскрашенные пиксели.
- Settings/TPanCfg: под-объект 'display' (палитра/gamma/ref/range/wf-уровни),
  пишется только при override.

Глобальными осознанно оставлены разрешение анализатора, MSAA, скорость
водопада, детектор/усреднение (движок/перф, не косметика).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 13:49:19 +03:00
co-authored by Claude Opus 4.8
parent 543453007e
commit 3566f10191
6 changed files with 666 additions and 10 deletions
+44 -1
View File
@@ -712,13 +712,56 @@ RATEPROBE удалены.** Наблюдение юзера: смена rate Г
- Авто-promotion (слайс уехал за край пана → предлагать новый пан) — нет,
осознанно: только явное создание пана (решение «сначала статика» остаётся).
- Настройки водопада (палитра/AGC/avg) per-pan или глобально — стартуем с
наследования глобальных, разделим по запросу.
наследования глобальных, разделим по запросу. ★РЕШЕНО/РЕАЛИЗОВАНО 2026-07-13
(см. блок «PER-PAN ДИСПЛЕЙ» ниже).
- **Компоновка панов сеткой** (запрос юзера 2026-07-11): не только вертикальный
стек — например, пан 0 сверху во всю ширину, паны B и C ниже бок о бок
(пол-ширины каждый), и т.п. Идея на после 3.3/3.5: обобщить `LayoutPanStack`
до грид-раскладки (регион пана = прямоугольник, а не полоса; `StackTop/Height`
`Rect`), сплиттеры по обеим осям. Не блокер текущего этапа.
**PER-PAN ДИСПЛЕЙ (2026-07-13, собирается, dispcfgtest ALL PASS, НЕ закоммичен,
НА ЭКРАНЕ НЕ ПРОВЕРЕН)**
UX залочен с юзером: кнопка «◑» в шапке каждого пана открывает компактный
поповер настроек отображения. Модель — **глобальный дефолт + override на пан**:
- Пан 0 «◑» правит ГЛОБАЛЬНЫЕ поля рендера (`FController.FWf*`/`FSpec*`),
зеркалятся в контроллер, persist глобальных при закрытии (FormDestroy →
SaveGlobalSettings). Solo пан 0 (нет доп. панов ⇒ шапка скрыта) правится
штатным диалогом настроек — «◑» виден только при видимой шапке (>=2 панов).
- Паны N при первой правке ставят `DisplayOverride:=True`; их рендер
персистится в воркспейс раздельно по контексту (КВ/xvtr).
- «Reset» (только паны N) — снять override, вернуть глоб. дефолт.
«Apply all» — раскатать текущий рендер пана на все паны + сделать глоб.
дефолтом.
Что per-pan (view-side, дёшево — всё уже в `Pan.View`): палитра, gamma,
ref level, range, водопад авто-уровень + offset + ручные min/max. Что осталось
ГЛОБАЛЬНЫМ (движок/перф, не косметика): DisplayPixels (разрешение анализатора),
MSAA, WfSpeedDiv, детектор/усреднение спектра и водопада.
Реализация:
- Новый юнит **PanDisplayPopup.pas**: `TPanDisplayPopup` = borderless
`fsStayOnTop` форма, гаснет по `OnDeactivate`; Flat*-контролы (combo палитры,
float-spin gamma, int-spin уровней, чекбокс авто). Combo-дропдаун парентится
к самой форме (child) ⇒ не деактивирует поповер. Правки применяются к
`P.View` живьём → `OnApplied(P)`.
- **TPanafallPanel**: `FBtnDisplay` («◑», Owner=FHeaderPanel ⇒ освобождается
авто с шапкой, в Destroy не нужен), `OnDisplayClick`, `DisplayOverride`.
`PositionHeaderChildren` каскадит `[×][⧉][◑]` справа налево по `Visible`.
- **MainForm**: `OnPanDisplayClick` (лениво создаёт `FPanDisplayPopup`, показ
под кнопкой), `OnPanDisplayApplied/Reset/ApplyAll`, `ApplyGlobalRenderToView`,
`MarkPanDisplayDirty` (инвалидция сетки спектра + водопада; `SetWfPalette/
Gamma` сами no-op-гардят и метят LUT к пересбору). Поповер прячется в
`ClosePanadapter` (FPan мог висеть → перепривязка на след. показе).
- **Settings/TPanCfg**: `HasDisplay` + `DPalette/DGamma/DSpecRef/DSpecRange/
DWfAGC/DWfOffset/DWfHigh/DWfLow`; под-объект `'display'` пишется ТОЛЬКО при
override; чтение = присутствие блока. Save/RestorePanWorkspaceCtx прокинуты.
Файлы: `PanDisplayPopup.pas` (new), `PanafallPanel.pas`, `MainForm.pas`,
`Settings.pas`. NEXT: экранная проверка (палитра/gamma/уровни на пан, Reset/
ApplyAll, тёплый рестарт восстанавливает override панов N раздельно КВ/xvtr).
## Отвергнутые альтернативы (для истории)
Старый черновик Этапа 3 предлагал «off-span слайсы»: слайс вне видимой