mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-26 22:57:34 +00:00
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:
+19
-8
@@ -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
|
||||||
|
begin
|
||||||
|
FilterStartX := VfoX;
|
||||||
FilterEndX := VfoX;
|
FilterEndX := VfoX;
|
||||||
|
end;
|
||||||
|
FilterStartX := Max(0, Min(PbSpectrum.Width - 1, FilterStartX));
|
||||||
FilterEndX := Max(0, Min(PbSpectrum.Width - 1, FilterEndX));
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user