feat(slices): пан-зум панов N — свой бар/кнопки, span-clip анализатора пана

Движок: TPanChan.ZoomFactor/PanSlider, span-clip в ApplyPanAnalyzerSettings
(математика главного, ZOOM_LIMIT 100), SetPanZoomPan с no-op guard (SetAnalyzer
сбрасывает FFT-историю). Зум переживает смену rate/ADC пана.
Контроллер: формула окна вынесена в ViewWindowFor (главный GetViewWindow тоже
через неё), GetPanViewWindow (PanId=0 делегирует), PanZoomIn/Out по лестнице
кратностей с якорем на центре окна, PanZoomDefault, геттеры.
UI: TPanZoomEvent получил Sender; у панов N включён ряд зума, бар
диспетчеризуется по объекту, кнопки −/⌂/+ общие через PanOfZoomButton (матч по
идентичности — MakeFlatBtn создаёт кнопки с Owner=контейнер, PanFromSender их
не видит); SyncPanZoomUI/RefreshPanZoom, вся мышь панов зум-корректна через
GetPanViewWindow. Темизация баров панов N.
Смоук panzoomtest ALL PASS (пик тона совпадает с формулой окна ±0.6%),
подтверждено на экране.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-12 11:35:13 +03:00
co-authored by Claude Fable 5
parent 209e490dfa
commit 64edf9e289
6 changed files with 312 additions and 36 deletions
+28
View File
@@ -545,6 +545,34 @@ RATEPROBE удалены.** Наблюдение юзера: смена rate Г
паузы >41мс, main-аудио/слайс пана 0/слайс пана 1 живы и слышат тон после
смены. Оба бинарника собираются.
**СТАТУС «пан-зум панов N» (2026-07-12): ГОТОВО — смоук panzoomtest ALL PASS,
юзер подтвердил на экране, коммит cb6bdfa.**
- Движок: `TPanChan.ZoomFactor/PanSlider`, span-clip в
`ApplyPanAnalyzerSettings` (та же математика, что у главного; ZOOM_LIMIT 100),
`SetPanZoomPan` (no-op guard — SetAnalyzer сбрасывает FFT-историю, урок
dae0c19). Зум переживает смену rate пана (SetPanRate пересоздаёт анализатор
из записи пана).
- Контроллер: `FPanZoomF/FPanPanSl` (сессия пана, сброс в Add/RemovePanDDC —
band-персиста у панов нет), формула окна вынесена в юнит-хелпер
`ViewWindowFor` (GetViewWindow главного теперь тоже через него),
`GetPanViewWindow(0)` делегирует главному; `PanZoomIn/Out` по той же
лестнице ZOOM_MAG_LADDER, якорь = ЦЕНТР текущего окна (`PanZoomStepTo`,
у панов нет VFO-якоря главного), `PanZoomDefault`, геттеры.
- UI: `TPanZoomEvent` получил Sender (PanZoomBar), `OnPanZoomWindow`
диспетчеризует бар→пан; кнопки −/⌂/+ общие (`PanFromSender`); у панов N
включён ShowZoomRow, бар проводится в CreatePanadapter; единые
`SyncPanZoomUI/RefreshPanZoom` (вьюха+бар ← контроллер) используются в
SyncPanViews и drag-ретюне; `TPanafallPanel.ViewWindow` и `PanViewWindow`
`GetPanViewWindow` ⇒ вся мышь/флаги панов автоматически зум-корректны.
Темизация баров панов N в ApplyDarkTheme.
- Смоук panzoomtest.pas: пик тона +50к на пане 384к совпадает с формулой окна
при зуме 0 / 0.5+пан 0.7 / сбросе (±0.6%).
- ⚠Фикс по первому экранному тесту: кнопки −/⌂/+ панов N рулили ГЛАВНЫМ зумом —
MakeFlatBtn создаёт кнопки с Owner=контейнер (не панель), PanFromSender их
не находит. Диспетчер кнопок = PanOfZoomButton (матч по идентичности
BtnZoomIn/Def/Out всех панов). Урок: PanFromSender работает только для
контролов с Owner=панель (TLabel шапки — да, MakeFlatBtn-кнопки — нет).
### 3.6 — Pluto+ (2r2t): второй пан на втором антенном входе
Опционально, после 3.0-3.3. Обычного Pluto НЕ касается (там один RX разведён).