From 05bb68ac58fa4f57d9afed3ce2871929edbe6dcf Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Thu, 4 Jun 2026 16:15:03 +0300 Subject: [PATCH] Fix ruler lag on click-to-tune and VFO change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ApplyVfoA (общий путь click-to-tune/wheel/VFO/band) синхронно дёргал PbSpectrum.Invalidate, но не PbRuler.Invalidate — линейку обновлял лишь таймер через NeedsRulerRedraw-гейт, отсюда "не всегда" при CTUN off. Invalidate только планирует перерисовку (не тяжёлый рендер), а DrawRuler дешёвый, поэтому дёргаем PbRuler.Invalidate сразу рядом с PbSpectrum. Явная инвалидация Ruler из RestoreBand убрана как избыточная — band идёт через ApplyVfoA, теперь единый источник правды там. Co-Authored-By: Claude Opus 4.8 --- MainForm.pas | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index e7c1770..334d0a4 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -1032,13 +1032,8 @@ begin // Пересчитываем drive byte для нового диапазона перед отправкой в сеть FController.FDriveLevel := CalcDriveByte; - // ApplyVfoA обновит сеть, FreqDisp, shift, перерисует + // ApplyVfoA обновит сеть, FreqDisp, shift, Ruler — перерисует. ApplyVfoA(Round(B.VfoA)); - // Смена диапазона — дискретное событие (не wheel/drag), поэтому - // перерисовываем Ruler синхронно. ApplyVfoA откладывает рендер на таймер - // (FSpectrumDirty), что для оффлайна/без RUN не перерисовывает линейку. - FSpecView.InvalidateRulerCache; - if PbRuler <> nil then PbRuler.Invalidate; end; procedure TMainForm.SaveAllAndExit; @@ -4732,9 +4727,13 @@ begin // Не рисуем синхронно из wheel/drag path: частые события мыши иначе // забивают UI-поток и мешают аудио. Таймер подхватит ближайший кадр. + // Сам DrawSpectrum/DrawWaterfall откладываем (FSpectrumDirty), но Invalidate + // дёргаем сразу — он лишь планирует перерисовку. Линейку (PbRuler) тоже: + // её рендер дешёвый и без него она отставала от спектра при клике/смене VFO. SyncSpecViewFreq; FSpectrumDirty := True; PbSpectrum.Invalidate; + if PbRuler <> nil then PbRuler.Invalidate; if Scrolled then begin FWaterfallDirty := True;