feat(overlay): flip VFO overlay to left side when it doesn't fit on right

PositionVfoOverlay считает обе кромки полосы фильтра и ставит накладку справа
от неё по умолчанию; если справа не влезает (маркер у правого края) — рисует
слева от левой кромки. Возврат на правую сторону автоматически, когда снова
помещается. Убран прежний clamp-оверлап с маркером.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 14:18:29 +03:00
co-authored by Claude Opus 4.8
parent 43dbd2b829
commit 6ad5f29657
+21 -10
View File
@@ -5029,8 +5029,8 @@ end;
procedure TMainForm.PositionVfoOverlay; procedure TMainForm.PositionVfoOverlay;
var var
VfoX, FilterEndX, OW, NewLeft, NewTop: Integer; VfoX, FilterStartX, FilterEndX, OW, NewLeft, NewTop: Integer;
HiHz: Double; LoHz, HiHz: Double;
ViewCenter, ViewSpan: Double; ViewCenter, ViewSpan: Double;
begin begin
if not Assigned(FVfoOverlay) or not FVfoOverlay.Visible then Exit; if not Assigned(FVfoOverlay) or not FVfoOverlay.Visible then Exit;
@@ -5044,20 +5044,31 @@ begin
else else
VfoX := PbSpectrum.Width div 2; VfoX := PbSpectrum.Width div 2;
// Кромки полосы фильтра относительно несущей (для выбора стороны накладки).
case FController.FMode of case FController.FMode of
MODE_LSB: HiHz := -100; MODE_LSB: begin LoHz := -FController.FFilterBW; HiHz := -100; end;
MODE_USB: HiHz := FController.FFilterBW; MODE_USB: begin LoHz := 100; HiHz := FController.FFilterBW; end;
else else
HiHz := FController.FFilterBW / 2; begin LoHz := -FController.FFilterBW / 2; HiHz := FController.FFilterBW / 2; end;
end; end;
if (PbSpectrum.Width > 0) and (ViewSpan > 0) then if (PbSpectrum.Width > 0) and (ViewSpan > 0) then
FilterEndX := VfoX + Round(HiHz / ViewSpan * PbSpectrum.Width) begin
FilterStartX := VfoX + Round(LoHz / ViewSpan * PbSpectrum.Width);
FilterEndX := VfoX + Round(HiHz / ViewSpan * PbSpectrum.Width);
end
else else
FilterEndX := VfoX; begin
FilterEndX := Max(0, Min(PbSpectrum.Width - 1, FilterEndX)); FilterStartX := VfoX;
FilterEndX := VfoX;
end;
FilterStartX := Max(0, Min(PbSpectrum.Width - 1, FilterStartX));
FilterEndX := Max(0, Min(PbSpectrum.Width - 1, FilterEndX));
// Всегда справа от правого края полосы фильтра. // По умолчанию справа от полосы фильтра; если не влезает — слева от неё.
NewLeft := Max(4, Min(PbSpectrum.Width - OW - 4, FilterEndX + 6)); NewLeft := FilterEndX + 6;
if NewLeft + OW > PbSpectrum.Width - 4 then
NewLeft := FilterStartX - 6 - OW;
NewLeft := Max(4, Min(PbSpectrum.Width - OW - 4, NewLeft));
NewTop := 16; NewTop := 16;
if (FVfoOverlay.Left <> NewLeft) or (FVfoOverlay.Top <> NewTop) then if (FVfoOverlay.Left <> NewLeft) or (FVfoOverlay.Top <> NewTop) then
begin begin