mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +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 AudRowCount: Integer;
|
||||||
function AudRowName(I: Integer): string;
|
function AudRowName(I: Integer): string;
|
||||||
function AudRowCurrent(I: Integer): Boolean;
|
function AudRowCurrent(I: Integer): Boolean;
|
||||||
|
procedure ScrollAudToCurrent; // прокрутка к выбранному устройству
|
||||||
procedure RegisterHit(const HR: TRect; HV: Integer);
|
procedure RegisterHit(const HR: TRect; HV: Integer);
|
||||||
procedure ApplyThemeColors; // раскладывает FTheme → структурные CLR_*
|
procedure ApplyThemeColors; // раскладывает FTheme → структурные CLR_*
|
||||||
function FormatFreq(Hz: Double): string;
|
function FormatFreq(Hz: Double): string;
|
||||||
@@ -657,7 +658,7 @@ end;
|
|||||||
procedure TVfoOverlay.SetPanel(P: TFlyPanel);
|
procedure TVfoOverlay.SetPanel(P: TFlyPanel);
|
||||||
begin
|
begin
|
||||||
if FPanel = P then FPanel := fpNone else FPanel := P;
|
if FPanel = P then FPanel := fpNone else FPanel := P;
|
||||||
if FPanel = fpAud then FAudScroll := 0; // список с начала
|
if FPanel = fpAud then ScrollAudToCurrent; // сразу показать выбранное
|
||||||
Height := ComputeHeight;
|
Height := ComputeHeight;
|
||||||
RequestInvalidate;
|
RequestInvalidate;
|
||||||
end;
|
end;
|
||||||
@@ -963,6 +964,23 @@ begin
|
|||||||
Result := (FDevNames[I] = FCurDev) or ((FCurDev = '') and (I = 0));
|
Result := (FDevNames[I] = FCurDev) or ((FCurDev = '') and (I = 0));
|
||||||
end;
|
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);
|
procedure TVfoOverlay.DrawAudPanel(C: TCanvas; X, Y, RowW: Integer);
|
||||||
const
|
const
|
||||||
ARROW_W = 15;
|
ARROW_W = 15;
|
||||||
@@ -1311,8 +1329,8 @@ begin
|
|||||||
begin
|
begin
|
||||||
if FAudInTab <> (HV = HIT_AUD_TAB_IN) then
|
if FAudInTab <> (HV = HIT_AUD_TAB_IN) then
|
||||||
begin
|
begin
|
||||||
FAudInTab := HV = HIT_AUD_TAB_IN;
|
FAudInTab := HV = HIT_AUD_TAB_IN;
|
||||||
FAudScroll := 0; // список другой длины
|
ScrollAudToCurrent; // список другой длины
|
||||||
Height := ComputeHeight;
|
Height := ComputeHeight;
|
||||||
RequestInvalidate;
|
RequestInvalidate;
|
||||||
end;
|
end;
|
||||||
|
|||||||
Reference in New Issue
Block a user