fix(spectrum): сохранение/восстановление зума для трансверторов (XVTR)

Зум был per-band только для HF (TBandSettings). XVTR-слоты хранятся отдельно
(TXvtrEntry) и зум туда не попадал — при входе в трансвертер не восстанавливался.

- TXvtrEntry: LastZoomFactor/LastPanSlider + Default/Load/Save (JSON).
- SaveCurrentBand (XVTR-ветка): пишет зум/пан в слот.
- ActivateXvtr: восстанавливает зум слота + SetZoomPan (re-arm анализатора).
  Покрывает все входы (кнопка, старт по LastXvtr, CAT/web).
- ApplyZoom: кэширует в активный слот — XVTR при активном трансверторе,
  иначе HF-band.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 21:27:08 +03:00
co-authored by Claude Opus 4.8
parent 371b2858bd
commit 5b7eda291e
2 changed files with 27 additions and 1 deletions
+19 -1
View File
@@ -1512,6 +1512,8 @@ begin
FXvtrSettings.Entries[i].LastAGCTop := FAGCTop;
FXvtrSettings.Entries[i].LastCTCSSAutoActive := FFMCTCSSAutoActive;
FXvtrSettings.Entries[i].LastFMRptAutoActive := FFMRptAutoActive;
FXvtrSettings.Entries[i].LastZoomFactor := FZoomFactor;
FXvtrSettings.Entries[i].LastPanSlider := FPanSlider;
end;
FSettings.SaveXvtr(FDevMAC, FXvtrSettings);
Exit;
@@ -2289,6 +2291,12 @@ begin
B.VfoB := FVfoB;
ApplyBandDSP(B);
// Zoom/pan слота: восстанавливаем и переармируем анализатор.
FZoomFactor := EnsureRange(E.LastZoomFactor, 0.0, 1.0);
FPanSlider := EnsureRange(E.LastPanSlider, 0.0, 1.0);
if Assigned(FDSPEngine) then FDSPEngine.SetZoomPan(FZoomFactor, FPanSlider);
Changed(rfZoom);
// VFO: B — своя сохранённая частота слота (клэмп в диапазон); A = visible.
FVfoB := EnsureRange(E.LastFreqB, E.FreqBegin, E.FreqEnd);
FVfoA := Vis;
@@ -2403,7 +2411,17 @@ begin
FPanSlider := EnsureRange(APan, 0.0, 1.0);
if Assigned(FDSPEngine) then
FDSPEngine.SetZoomPan(FZoomFactor, FPanSlider);
if (FCurrentBand >= 0) and (FCurrentBand < CFG_BAND_COUNT) then
// Кэшируем в активный слот (XVTR-слот при активном трансверторе, иначе HF-band);
// персист на диск — в SaveCurrentBand при смене/выходе.
if FCurrentXvtr >= 0 then
begin
if FCurrentXvtr < CFG_XVTR_COUNT then
begin
FXvtrSettings.Entries[FCurrentXvtr].LastZoomFactor := FZoomFactor;
FXvtrSettings.Entries[FCurrentXvtr].LastPanSlider := FPanSlider;
end;
end
else if (FCurrentBand >= 0) and (FCurrentBand < CFG_BAND_COUNT) then
begin
FBandCache[FCurrentBand].ZoomFactor := FZoomFactor;
FBandCache[FCurrentBand].PanSlider := FPanSlider;