ui(vfo): колесо мыши прокручивает список устройств в AUD

VfoOverlay запоминает прямоугольник списка (FAudListRect) и обрабатывает
колесо над ним (HandleMouseWheel): шаг = одна строка. Если курсор в этой
зоне, событие считается обработанным и не уходит в спектр — частота не
съезжает даже когда список целиком помещается и крутить нечего.

PanafallPanel.DispatchFlagsMouseWheel перебирает главный флаг и флаги
слайсов (как остальные Dispatch*), MainForm.FormMouseWheel зовёт его по
всем панам первым делом после дисплеев VFO; координаты берутся через
PbSpectrum.ScreenToClient(Mouse.CursorPos), поэтому работает и в pop-out.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 09:29:32 +03:00
co-authored by Claude Opus 4.8
parent fb1c263460
commit c986232891
3 changed files with 57 additions and 0 deletions
+15
View File
@@ -7885,12 +7885,27 @@ var
SLo, SHi, SNew: Double;
Sl: TCtrlSlice;
SlicePan: TPanafallPanel;
P: TPoint;
begin
// Над дисплеем VFO (A или B) колесо обрабатывает сам TFreqDisplay поразрядно
// (включая неактивный VFO). Не дублируем здесь, иначе менялись бы обе частоты:
// виджет крутил бы B, а этот хендлер — активный A.
if OverFreqDisp(FreqDispA) or OverFreqDisp(FreqDispB) then Exit;
// Колесо над раскрытым списком устройств во флаге — прокрутка этого списка.
for i := 0 to MAX_PANS - 1 do
if (FPans[i] <> nil) and Assigned(FPans[i].PbSpectrum) and
FPans[i].PbSpectrum.Visible then
begin
P := FPans[i].PbSpectrum.ScreenToClient(Mouse.CursorPos);
if FPans[i].DispatchFlagsMouseWheel(P.X, P.Y, WheelDelta) then
begin
MarkPanDirty(FPans[i]);
Handled := True;
Exit;
end;
end;
// Колесо над маркером слайса (любого пана) — двигаем частоту ЭТОГО слайса.
SliceId := 0;
SlicePan := nil;