feat(slices): этап 3.4 ADC-селектор панов + этап 3.5 pop-out в отдельное окно

3.4 ADC-селектор:
- Caps.NumADCs (HPSDR: 2 для ORION/ORION2/SATURN, как Pkt.NumADCs; Pluto: 1)
- controller.PanADC/SetPanADC: пан 0 = FMainADCSrc + ConfigureDDCs (ADC
  прокинут и в штатные вызовы — смена rate не сбрасывает выбор), паны N =
  FPanADC[] + SetPanDDC (RebuildDDCSpecific)
- Бейдж «A1/A2» в шапке каждого пана (виден при NumADCs>1), клик = тумблер;
  пан 0 на ADC2 закрывает сценарий rx2-support

3.5 Pop-out:
- «⧉» в шапке панов N → PopOutPan: TForm.CreateNew + ReparentTo (перенос
  всех контролов панели), [×] окна = DockBackPan (возврат в стек), «×»
  шапки = закрыть пан; LayoutPanStack скипает плавающих; колесо окна =
  FormMouseWheel
- GL: reparent пересоздаёт контексты → ResetGLCache обеих канв без glDelete
  (по прецеденту MSAA); TWaterfallViewOpenGL.ResetGLCache новый, история
  водопада перезаливается из CPU-буфера

Проверено юзером на экране (беглый тест: селектор и pop-out работают).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 23:54:09 +03:00
co-authored by Claude Fable 5
parent e5921b8196
commit 8bf8bcfc76
9 changed files with 348 additions and 9 deletions
+34
View File
@@ -463,6 +463,21 @@ ChangeSampleRate).
- Diversity (sync-DDC, оба АЦП когерентно в один канал) — НЕ здесь; протокол
умеет, дизайну панов не мешает, отдельная будущая фича.
**СТАТУС 3.4 (2026-07-11): ГОТОВО, коммит 5e50cba, юзер подтвердил беглым
тестом. ⚠Ожидаются вопросы юзера по пункту «смена rate не сбрасывает АЦП».**
- `Caps.NumADCs` (HPSDR: 2 для BoardType 4/5/10 — ORION/ORION2/SATURN, те же
платы, что Pkt.NumADCs в RebuildDDCSpecific; Pluto: 1; достоверно после
Connect).
- Контроллер: `PanADC(PanId)` / `SetPanADC(PanId, ADC)`. Пан 0 = главный DDC
(`FMainADCSrc` + ConfigureDDCs с тем же rate/dither/random; FMainADCSrc
теперь прокинут и в оба штатных вызова ConfigureDDCs — смена rate не
сбрасывает АЦП). Паны N = `FPanADC[]` + SetPanDDC (RebuildDDCSpecific).
- UI: бейдж «A1»/«A2» в шапке КАЖДОГО пана (вкл. пан 0 — закрывает сценарий
rx2-support), виден только при NumADCs>1, клик = тумблер, акцентный цвет.
- ⚠Ограничение: шапка пана 0 видна только при ≥2 панах ⇒ с единственным
паном перекинуть пан 0 на ADC2 из UI нельзя (добавь пан или жди персиста).
Антенны Alex (ANT1/2/3) — по-прежнему глобально в Antenna-табе.
### 3.5 — Pop-out: панадаптер в отдельном OS-окне
Улучшение поверх Flex (SmartSDR так не умеет). Кнопка `⧉` в шапке.
@@ -478,6 +493,25 @@ ChangeSampleRate).
- **Риск №2 — общие GL-ресурсы**: закрывается аудитом из 3.0.
- Персист: флаг «пан N в отдельном окне» + геометрия окна.
**СТАТУС 3.5 (2026-07-11): ГОТОВО, коммит 5e50cba, юзер подтвердил беглым
тестом — честный GL-reparent на Qt6/Wayland РАБОТАЕТ (fallback-пересоздание
не понадобилось).**
- Кнопка «⧉» в шапке панов N>0 → `PopOutPan`: `TForm.CreateNew` (Caption
«EWSDR · PAN N», тема, OnMouseWheel = FormMouseWheel — колесо над
флагами/фоном работает как в стеке), `TPanafallPanel.ReparentTo(F)`
(Parent всех контролов), StackTop/Height=0/0 (= всё окно), сплиттер пана
скрыт, LayoutPanStack пере-стекует оставшихся (плавающие скипаются).
- GL: reparent пересоздаёт хэндлы канв → контексты умирают. По прецеденту
MSAA: `ResetGLCache` (обнуление id без glDelete) — расширен, теперь
сбрасывает и водопад (`TWaterfallViewOpenGL.ResetGLCache`, новый);
история водопада живёт в CPU-буфере — тексура перезальётся.
- [×] окна = dock back (`CloseAction := caNone` + `DockBackPan`: reparent в
PanelRight, сброс GL, Release окна). «×» шапки в окне = закрыть пан
целиком (ClosePanadapter освобождает и окно). STOP закрывает всё.
- Резерв на случай мёртвого GL после reparent: пересоздание вьюхи/контролов
(в коде НЕ делалось — сначала экранный тест).
- Персист геометрии — вместе с общим персистом панов.
### 3.6 — Pluto+ (2r2t): второй пан на втором антенном входе
Опционально, после 3.0-3.3. Обычного Pluto НЕ касается (там один RX разведён).