mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 19:45:09 +00:00
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:
+21
-3
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user