mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
Fix VfoOverlay FM mode: NFM/FM filters, deviation sync, button layout
- FM filter row now shows only NFM (11 kHz) and FM (16 kHz) matching MainForm - OnModeFilterSelect updates FFMDeviation and FFilter index for FM mode - Mode and filter button widths distributed evenly (proportional, not fixed BtnW) - S-meter inset by extra 4 px on each side Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+24
-21
@@ -85,9 +85,9 @@ const
|
||||
CW_BW: array[0..5] of Integer = (500,250,150,100,50,1000);
|
||||
CW_LBL: array[0..5] of string = ('500','250','150','100','50','1K');
|
||||
|
||||
// Фильтры FM (FM=5)
|
||||
FM_BW: array[0..5] of Integer = (20000,15000,12000,10000,8000,5000);
|
||||
FM_LBL: array[0..5] of string = ('20K','15K','12K','10K','8K','5K');
|
||||
// Фильтры FM (FM=5) — только NFM и FM, как в MainForm
|
||||
FM_BW: array[0..1] of Integer = (11000, 16000);
|
||||
FM_LBL: array[0..1] of string = ('NFM', 'FM');
|
||||
|
||||
// Фильтры AM/SAM (AM=6, SAM=7)
|
||||
AM_BW: array[0..5] of Integer = (20000,16000,12000,10000,8000,6000);
|
||||
@@ -120,7 +120,8 @@ end;
|
||||
|
||||
function TVfoOverlay.GetFilterCountForMode(ModeIdx: Integer): Integer;
|
||||
begin
|
||||
Result := 6; // всегда 6 вариантов фильтра
|
||||
if ModeIdx = 5 then Result := 2 // FM: только NFM и FM
|
||||
else Result := 6;
|
||||
end;
|
||||
|
||||
function DBmToSLabel(DB: Double): string;
|
||||
@@ -166,7 +167,7 @@ begin
|
||||
FModeFilter[2] := 8000; // DSB
|
||||
FModeFilter[3] := 500; // CWL
|
||||
FModeFilter[4] := 500; // CWU
|
||||
FModeFilter[5] := 15000; // FM
|
||||
FModeFilter[5] := 11000; // FM (NFM по умолчанию)
|
||||
FModeFilter[6] := 8000; // AM
|
||||
FModeFilter[7] := 8000; // SAM
|
||||
Width := 260; // шире — 8 кнопок режимов
|
||||
@@ -262,17 +263,17 @@ end;
|
||||
|
||||
procedure TVfoOverlay.DrawModeRow(C: TCanvas; X, Y, RowW, RowH: Integer);
|
||||
var
|
||||
I, BtnW, BX: Integer;
|
||||
I, BX, BRight: Integer;
|
||||
HR: TRect;
|
||||
IsAct, IsHot: Boolean;
|
||||
begin
|
||||
BtnW := (RowW - (OVL_MODE_COUNT - 1)) div OVL_MODE_COUNT;
|
||||
BX := X;
|
||||
for I := 0 to OVL_MODE_COUNT - 1 do
|
||||
begin
|
||||
BX := X + I * (BtnW + 1);
|
||||
HR := Rect(BX, Y, BX + BtnW, Y + RowH);
|
||||
IsAct := (I = FMode);
|
||||
IsHot := (FHotIdx >= 0) and (FHitActions[FHotIdx] = -(I + 1));
|
||||
BRight := X + ((I + 1) * RowW) div OVL_MODE_COUNT;
|
||||
HR := Rect(BX, Y, BRight, Y + RowH);
|
||||
IsAct := (I = FMode);
|
||||
IsHot := (FHotIdx >= 0) and (FHitActions[FHotIdx] = -(I + 1));
|
||||
|
||||
if IsAct then C.Brush.Color := CLR_BTN_ACT
|
||||
else if IsHot then C.Brush.Color := CLR_BTN_HOT
|
||||
@@ -286,29 +287,30 @@ begin
|
||||
else C.Font.Color := CLR_TEXT;
|
||||
C.Font.Size := 6; C.Font.Style := []; C.Font.Name := 'Courier New';
|
||||
C.Brush.Style := bsClear;
|
||||
C.TextOut(BX + (BtnW - C.TextWidth(OVL_MODE_NAMES[I])) div 2,
|
||||
C.TextOut(BX + (BRight - BX - C.TextWidth(OVL_MODE_NAMES[I])) div 2,
|
||||
Y + (RowH - C.TextHeight('A')) div 2,
|
||||
OVL_MODE_NAMES[I]);
|
||||
|
||||
RegisterHit(HR, -(I + 1)); // -1=LSB, -2=USB, -3=DSB, -4=CWL, -5=CWU, -6=FM, -7=AM, -8=SAM
|
||||
BX := BRight + 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TVfoOverlay.DrawFilterRow(C: TCanvas; X, Y, RowW, RowH: Integer);
|
||||
const
|
||||
FILT_COUNT = 6;
|
||||
var
|
||||
I, BtnW, BX, BV: Integer;
|
||||
FILT_COUNT: Integer;
|
||||
I, BX, BRight, BV: Integer;
|
||||
HR: TRect;
|
||||
Lbl: string;
|
||||
IsAct: Boolean;
|
||||
begin
|
||||
BtnW := (RowW - (FILT_COUNT - 1)) div FILT_COUNT;
|
||||
FILT_COUNT := GetFilterCountForMode(FMode);
|
||||
BX := X;
|
||||
for I := 0 to FILT_COUNT - 1 do
|
||||
begin
|
||||
BX := X + I * (BtnW + 1);
|
||||
HR := Rect(BX, Y, BX + BtnW, Y + RowH);
|
||||
BV := GetFilterBWForMode(FMode, I);
|
||||
BRight := X + ((I + 1) * RowW) div FILT_COUNT;
|
||||
HR := Rect(BX, Y, BRight, Y + RowH);
|
||||
BV := GetFilterBWForMode(FMode, I);
|
||||
IsAct := (BV = FFilterBW);
|
||||
Lbl := GetFilterLblForMode(FMode, I);
|
||||
|
||||
@@ -325,10 +327,11 @@ begin
|
||||
else C.Font.Color := CLR_TEXT;
|
||||
C.Font.Size := 7; C.Font.Name := 'Courier New';
|
||||
C.Brush.Style := bsClear;
|
||||
C.TextOut(BX + (BtnW - C.TextWidth(Lbl)) div 2,
|
||||
C.TextOut(BX + (BRight - BX - C.TextWidth(Lbl)) div 2,
|
||||
Y + (RowH - C.TextHeight('A')) div 2, Lbl);
|
||||
|
||||
RegisterHit(HR, BV); // BV всегда > 0 (BW в Гц, минимум 25)
|
||||
BX := BRight + 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -374,7 +377,7 @@ begin
|
||||
Inc(CurY, INFO_H);
|
||||
|
||||
// S-метр
|
||||
DrawSMeterBar(C, PAD, CurY, W - PAD * 2, SM_H);
|
||||
DrawSMeterBar(C, PAD + 4, CurY, W - (PAD + 4) * 2, SM_H);
|
||||
Inc(CurY, SM_H + GAP);
|
||||
|
||||
// Кнопки режимов
|
||||
|
||||
Reference in New Issue
Block a user