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;