diff --git a/MainForm.pas b/MainForm.pas index 9a35489..be212bf 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -1304,6 +1304,16 @@ begin PbWaterfall.Invalidate; if PbRuler <> nil then PbRuler.Invalidate; end; + rfCenterFreq: + begin + // CTUN-скролл центра (drag/web): ruler-метки сдвинулись → инвалидируем + // кэш; спектр откладываем (FSpectrumDirty) — drag шлёт много событий. + FSpecView.InvalidateRulerCache; + SyncSpecViewFreq; + FSpectrumDirty := True; + PbSpectrum.Invalidate; + if PbRuler <> nil then PbRuler.Invalidate; + end; rfVfoB: begin FreqDispB.Frequency := Round(FController.FVfoB); @@ -4728,24 +4738,9 @@ begin dPix := PixelX - FSpecDragX0; dFreq := dPix / PanelWidth * FController.FSpanHz; if FController.FCTun then - begin - // CTUN ON: drag двигает окно просмотра (FController.FCenterFreq/DDC) - // VFO остаётся, shift обновляется = VFO - новый FController.FCenterFreq - FController.FCenterFreq := FSpecDragFreq - dFreq; - if FController.FWDSPReady then - begin - if FController.FActiveVfo = 0 then - FController.FDSPEngine.SetShift(FController.FVfoA - FController.FCenterFreq) - else - FController.FDSPEngine.SetShift(FController.FVfoB - FController.FCenterFreq); - end; - if FController.FNetwork.Connected and FController.FNetwork.Running then - begin - FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), FController.FDriveLevel, FController.FTransmitting, True, True); - FController.FNetwork.SendFullHP; - end; - FSpectrumDirty := True; - end + // CTUN ON: drag двигает окно просмотра (DDC-центр) без смены VFO; shift, + // сеть и рендер — в контроллере SetCenter / OnControllerState(rfCenterFreq). + FController.SetCenter(FSpecDragFreq - dFreq) else begin // CTUN OFF: drag двигает VFO, FController.FCenterFreq следует через Apply @@ -6118,17 +6113,9 @@ end; procedure TMainForm.SyncWebCenter; begin - // Сдвигаем DDC-центр без смены VFO (аналог CTUN-drag в десктопе) - FController.FCenterFreq := FWebSyncFreq; - if FController.FWDSPReady then - begin - if FController.FActiveVfo = 0 then FController.FDSPEngine.SetShift(FController.FVfoA - FController.FCenterFreq) - else FController.FDSPEngine.SetShift(FController.FVfoB - FController.FCenterFreq); - end; - if FController.FNetwork.Connected and FController.FNetwork.Running then - FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), FController.FDriveLevel, FController.FTransmitting, True, True); - FSpecView.InvalidateRulerCache; - FSpectrumDirty := True; + // Сдвигаем DDC-центр без смены VFO (аналог CTUN-drag в десктопе). + // Движок (shift, сеть) + рендер (rfCenterFreq) — в контроллере SetCenter. + FController.SetCenter(FWebSyncFreq); end; procedure TMainForm.WebOnMOX(On_: Boolean); diff --git a/RadioController.pas b/RadioController.pas index 095fb90..3403e38 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -893,7 +893,17 @@ begin end; procedure TRadioController.SetCenter(Hz: Double); -begin FCenterFreq := Hz; Changed(rfCenterFreq); { TODO wiring } end; +// CTUN-скролл окна просмотра: двигаем DDC-центр БЕЗ смены VFO. Демодулятор +// сдвигаем = активный VFO − новый центр; полный HP-кадр в радио. Рендер +// (ruler/спектр) — в UI через OnControllerState(rfCenterFreq). +// Точки входа: десктопный CTUN-drag и web (SyncWebCenter). +begin + FCenterFreq := Hz; + if FWDSPReady and Assigned(FDSPEngine) then + FDSPEngine.SetShift(ActiveVfoHz - FCenterFreq); + PushNetworkState; + Changed(rfCenterFreq); +end; procedure TRadioController.VfoSwap; // Меняем VFO A/B местами и перестраиваем приёмник на новую частоту активного