Render sample rate overlay into spectrum bitmap

This commit is contained in:
2026-05-22 17:15:29 +03:00
parent ea6e57b8b8
commit 26aa55ddde
3 changed files with 195 additions and 90 deletions
+35 -5
View File
@@ -438,6 +438,7 @@ type
procedure SetRadioOfflineStatus(const ConnText: string; ClearDevice: Boolean = False);
procedure ApplyStatusTheme(const T: TAppTheme);
procedure PositionSampleRateOverlay;
procedure OnSampleRateOverlayInvalidate(Sender: TObject);
procedure OnSampleRateSelect(SampleRate: Integer);
procedure OnSampleRateHidePanel;
procedure UpdateVfoDisplay;
@@ -523,6 +524,7 @@ type
X, Y: Integer);
procedure PbSpectrumMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PbSpectrumMouseLeave(Sender: TObject);
procedure PbWaterfallMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PbWaterfallMouseMove(Sender: TObject; Shift: TShiftState;
@@ -1929,10 +1931,11 @@ begin
PanelRight.OnResize := RightPanelResize;
FSampleRateOverlay := TSampleRateOverlay.Create(Self);
FSampleRateOverlay.Parent := PanelRight;
FSampleRateOverlay.OnSpanSelect := OnSampleRateSelect;
FSampleRateOverlay.OnHidePanel := OnSampleRateHidePanel;
FSampleRateOverlay.OnInvalidate := OnSampleRateOverlayInvalidate;
FSampleRateOverlay.SetCurrentRate(FSampleRate);
FSpecView.SampleRateOverlay := FSampleRateOverlay;
// S-метр — внутри PanelToolbar, справа
PanelSMeterRight := TPanel.Create(Self);
@@ -1952,6 +1955,7 @@ begin
PbSpectrum.OnDblClick := PbSpectrumDblClick;
PbSpectrum.OnMouseMove := PbSpectrumMouseMove;
PbSpectrum.OnMouseUp := PbSpectrumMouseUp;
PbSpectrum.OnMouseLeave := PbSpectrumMouseLeave;
PbRuler := TPaintBox.Create(Self);
PbRuler.Parent := PanelRight;
@@ -2538,15 +2542,22 @@ end;
procedure TMainForm.PositionSampleRateOverlay;
const
MARGIN = 4;
MARGIN_X = 34;
MARGIN_Y = 4;
begin
if (FSampleRateOverlay = nil) or (PbSpectrum = nil) then Exit;
FSampleRateOverlay.SetBounds(
PbSpectrum.Left + MARGIN,
PbSpectrum.Top + MARGIN,
MARGIN_X,
MARGIN_Y,
FSampleRateOverlay.Width,
FSampleRateOverlay.Height);
FSampleRateOverlay.BringToFront;
end;
procedure TMainForm.OnSampleRateOverlayInvalidate(Sender: TObject);
begin
FSpectrumDirty := True;
if Assigned(FSpecView) then FSpecView.SpectrumDirty := True;
if Assigned(PbSpectrum) then PbSpectrum.Invalidate;
end;
// ===========================================================================
@@ -4637,6 +4648,9 @@ end;
procedure TMainForm.PbSpectrumMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FSampleRateOverlay) and
FSampleRateOverlay.HandleMouseDown(Button, X, Y) then Exit;
if Button = mbLeft then
begin
// Левая кнопка: сбрасываем маркер если активен
@@ -4677,6 +4691,15 @@ end;
procedure TMainForm.PbSpectrumMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if Assigned(FSampleRateOverlay) then
begin
FSampleRateOverlay.HandleMouseMove(X, Y);
if (FSampleRateOverlay.HotIdx >= 0) and (not FSpecDrag) then
PbSpectrum.Cursor := crHandPoint
else if not FSpecDrag then
PbSpectrum.Cursor := crDefault;
end;
if FSpecDrag and (ssLeft in Shift) then
DoSpectrumDrag(X, PbSpectrum.Width);
// Маркер следует за курсором — обновление произойдёт в ближайшем тике таймера (50ms)
@@ -4699,6 +4722,13 @@ begin
end;
end;
procedure TMainForm.PbSpectrumMouseLeave(Sender: TObject);
begin
if Assigned(FSampleRateOverlay) then
FSampleRateOverlay.HandleMouseLeave;
if not FSpecDrag then PbSpectrum.Cursor := crDefault;
end;
// Водопад (аналогично)
procedure TMainForm.PbWaterfallMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);