From fb1c26346099dc1cf6a617c727ac17818b696a23 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 22 Jul 2026 09:25:41 +0300 Subject: [PATCH] =?UTF-8?q?ui(vfo):=20AUD-=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BD=D0=B0=20=D0=B2=D1=8B=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=BC=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При раскрытии fly-out AUD (и при переключении вкладок OUT/IN) список теперь прокручивается к текущему устройству — выбранная строка ставится примерно в середину видимого окна, а не приходится искать её стрелками. Ручной скролл при этом не сбрасывается: push списков от контроллера (SetAudioDevices/SetAudioInDevices) позицию не трогает. Co-Authored-By: Claude Opus 4.8 --- VfoOverlay.pas | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/VfoOverlay.pas b/VfoOverlay.pas index 0238b78..cb7c248 100644 --- a/VfoOverlay.pas +++ b/VfoOverlay.pas @@ -157,6 +157,7 @@ type function AudRowCount: Integer; function AudRowName(I: Integer): string; function AudRowCurrent(I: Integer): Boolean; + procedure ScrollAudToCurrent; // прокрутка к выбранному устройству procedure RegisterHit(const HR: TRect; HV: Integer); procedure ApplyThemeColors; // раскладывает FTheme → структурные CLR_* function FormatFreq(Hz: Double): string; @@ -657,7 +658,7 @@ end; procedure TVfoOverlay.SetPanel(P: TFlyPanel); begin if FPanel = P then FPanel := fpNone else FPanel := P; - if FPanel = fpAud then FAudScroll := 0; // список с начала + if FPanel = fpAud then ScrollAudToCurrent; // сразу показать выбранное Height := ComputeHeight; RequestInvalidate; end; @@ -963,6 +964,23 @@ begin Result := (FDevNames[I] = FCurDev) or ((FCurDev = '') and (I = 0)); end; +procedure TVfoOverlay.ScrollAudToCurrent; +var + I, Cnt, MaxScroll: Integer; +begin + FAudScroll := 0; + Cnt := AudRowCount; + if Cnt <= AUD_MAX_VIS then Exit; + for I := 0 to Cnt - 1 do + if AudRowCurrent(I) then + begin + // Ставим выбранную строку примерно в середину видимого окна. + MaxScroll := Cnt - AUD_MAX_VIS; + FAudScroll := Min(Max(0, I - AUD_MAX_VIS div 2), MaxScroll); + Exit; + end; +end; + procedure TVfoOverlay.DrawAudPanel(C: TCanvas; X, Y, RowW: Integer); const ARROW_W = 15; @@ -1311,8 +1329,8 @@ begin begin if FAudInTab <> (HV = HIT_AUD_TAB_IN) then begin - FAudInTab := HV = HIT_AUD_TAB_IN; - FAudScroll := 0; // список другой длины + FAudInTab := HV = HIT_AUD_TAB_IN; + ScrollAudToCurrent; // список другой длины Height := ComputeHeight; RequestInvalidate; end;