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
+21
View File
@@ -292,6 +292,7 @@ type
procedure DispatchFlagsMouseMove(X, Y: Integer);
function DispatchFlagsMouseUp(X, Y: Integer): Boolean;
procedure DispatchFlagsMouseLeave;
function DispatchFlagsMouseWheel(X, Y, WheelDelta: Integer): Boolean;
property Controller: TRadioController read FController write FController;
property MainFlag: TVfoOverlay read FMainFlag;
@@ -1557,4 +1558,24 @@ begin
if FSliceFlags[i] <> nil then FSliceFlags[i].HandleMouseLeave;
end;
// Колесо над раскрытым списком устройств во флаге: прокрутка списка вместо
// перестройки частоты. Координаты — в системе спектра (как у остальных Handle*).
function TPanafallPanel.DispatchFlagsMouseWheel(X, Y, WheelDelta: Integer): Boolean;
var i: Integer;
begin
Result := False;
if Assigned(FMainFlag) and FMainFlag.Visible then
begin
FActiveFlag := FMainFlag;
if FMainFlag.HandleMouseWheel(X, Y, WheelDelta) then Exit(True);
end;
for i := 0 to High(FSliceFlags) do
if (FSliceFlags[i] <> nil) and FSliceFlags[i].Visible then
begin
FActiveFlag := FSliceFlags[i];
if FSliceFlags[i].HandleMouseWheel(X, Y, WheelDelta) then Exit(True);
end;
FActiveFlag := nil;
end;
end.