ui(vfo): AUD-панель открывается на выбранном устройстве

При раскрытии fly-out AUD (и при переключении вкладок OUT/IN) список
теперь прокручивается к текущему устройству — выбранная строка ставится
примерно в середину видимого окна, а не приходится искать её стрелками.
Ручной скролл при этом не сбрасывается: push списков от контроллера
(SetAudioDevices/SetAudioInDevices) позицию не трогает.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 09:25:41 +03:00
co-authored by Claude Opus 4.8
parent c69d537852
commit fb1c263460
+20 -2
View File
@@ -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;
@@ -1312,7 +1330,7 @@ begin
if FAudInTab <> (HV = HIT_AUD_TAB_IN) then
begin
FAudInTab := HV = HIT_AUD_TAB_IN;
FAudScroll := 0; // список другой длины
ScrollAudToCurrent; // список другой длины
Height := ComputeHeight;
RequestInvalidate;
end;