From 22832a1163d9ed7f10e22fa3b675bdfe225a0053 Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Tue, 28 Apr 2026 15:01:25 +0300 Subject: [PATCH] Rework S-meter left label zone and bar layout --- BUILD.MD | 2 ++ SpectrumView.pas | 77 ++++++++++++++++++++++++++++++------------------ 2 files changed, 51 insertions(+), 28 deletions(-) create mode 100644 BUILD.MD diff --git a/BUILD.MD b/BUILD.MD new file mode 100644 index 0000000..2b965ba --- /dev/null +++ b/BUILD.MD @@ -0,0 +1,2 @@ +# RUN Build +lazbuild --ws=qt6 ewsdr.lpr diff --git a/SpectrumView.pas b/SpectrumView.pas index eb2e084..71ba861 100644 --- a/SpectrumView.pas +++ b/SpectrumView.pas @@ -937,6 +937,8 @@ var Y_BAR_TOP, Y_BAR_BOT: Integer; BarEnd, PeakLeft, PeakRight, S9X, OvrX: Integer; i, X, TW: Integer; Lbl: string; SNum, Over: Integer; + LblDbm, LblS: string; + TWDbm, TWS, TWUnit, LblZoneL, TH10, TH6, MaxTWDbm: Integer; function DBtoX(dB: Double): Integer; inline; begin @@ -960,9 +962,9 @@ begin W := R.Right - R.Left; H := R.Bottom - R.Top; ZX1 := 0; ZX2 := 0; ZY1 := 0; ZY2 := 0; if (W < 80) or (H < 16) then Exit; - BX := R.Left + LEFT_INFO; BW := W - LEFT_INFO - 4; - Y_BAR_TOP := R.Top + H * 36 div 100; - Y_BAR_BOT := R.Top + H * 66 div 100; + BX := R.Left + LEFT_INFO; BW := W - LEFT_INFO - 8; + Y_BAR_TOP := R.Top + H * 44 div 100; + Y_BAR_BOT := R.Top + H * 58 div 100; S9X := DBtoX(DB_S9); OvrX := DBtoX(DB_OVR); ACanvas.Brush.Color := CLR_SMETER_BG; ACanvas.Brush.Style := bsSolid; @@ -990,14 +992,41 @@ begin if (PeakRight > BX) and (PeakRight <= BX + BW) then begin ACanvas.Pen.Color := CLR_PEAK_MARKER; ACanvas.Pen.Width := 2; - ACanvas.MoveTo(PeakRight, Y_BAR_TOP); ACanvas.LineTo(PeakRight, Y_BAR_BOT); + ACanvas.MoveTo(PeakRight, Y_BAR_TOP - (Y_BAR_BOT - Y_BAR_TOP)); + ACanvas.LineTo(PeakRight, Y_BAR_BOT + (Y_BAR_BOT - Y_BAR_TOP)); ACanvas.Pen.Width := 1; end; - ACanvas.Brush.Style := bsClear; ACanvas.Pen.Color := CLR_BDR; - ACanvas.Rectangle(BX, Y_BAR_TOP, BX + BW, Y_BAR_BOT); + // --- Вычисляем строки надписей заранее чтобы измерить ширину --- + LblDbm := Format('%.1f', [Value]); + if Value >= -73.0 then + begin + Over := Round(Value - (-73.0)); + if Over < 5 then LblS := 'S9' + else begin Over := ((Over + 5) div 10) * 10; if Over = 0 then Over := 10; LblS := Format('S9+%d', [Over]); end; + end else if Value <= -121.0 then LblS := 'S1' + else begin + LblS := 'S1'; + for SNum := 1 to 8 do + if Value >= (-121.0 + (SNum - 1) * 6.0) then LblS := 'S' + IntToStr(SNum); + end; - ACanvas.Font.Name := 'Courier New'; ACanvas.Font.Size := 6; - ACanvas.Font.Style := []; ACanvas.Brush.Style := bsClear; + // Измеряем ширину надписей + ACanvas.Font.Name := 'Courier New'; ACanvas.Font.Style := [fsBold]; + ACanvas.Font.Size := 10; TWDbm := ACanvas.TextWidth(LblDbm); TWS := ACanvas.TextWidth(LblS); + MaxTWDbm := ACanvas.TextWidth('-120.0'); + ACanvas.Font.Size := 6; ACanvas.Font.Style := []; TWUnit := ACanvas.TextWidth('dBm'); + // Левый край зоны: фиксированная ширина под макс. число + "dBm " с пробелом справа + LblZoneL := BX - 4 - Max(MaxTWDbm + 2 + ACanvas.TextWidth('dBm '), TWS) - 4; + + // Рамка: от левого края зоны надписей до правого края шкалы + ACanvas.Brush.Style := bsClear; ACanvas.Pen.Color := CLR_BDR; + ACanvas.Rectangle(LblZoneL, Y_BAR_TOP, BX + BW, Y_BAR_BOT); + // разделитель между зоной надписей и шкалой + ACanvas.Pen.Color := TColor($00404040); + ACanvas.MoveTo(BX, Y_BAR_TOP + 1); ACanvas.LineTo(BX, Y_BAR_BOT - 1); + + // --- Шкальные тики и надписи --- + ACanvas.Font.Size := 6; ACanvas.Font.Style := []; ACanvas.Brush.Style := bsClear; for i := 0 to High(DBM_MARKS) do begin X := DBtoX(DBM_MARKS[i]); @@ -1023,26 +1052,18 @@ begin ACanvas.TextOut(X - TW div 2, Y_BAR_BOT + TICK_LONG + 1, Lbl); end; - ACanvas.Font.Size := 8; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_DBM; - Lbl := Format('%6.1f', [Value]); - ACanvas.TextOut(R.Left + 1, R.Top + 1, Lbl); - ACanvas.Font.Size := 6; ACanvas.Font.Style := []; - ACanvas.Font.Color := TColor($00507070); - ACanvas.TextOut(R.Left + 1, Y_BAR_TOP - ACanvas.TextHeight('dBm') - 1, 'dBm'); - - ACanvas.Font.Size := 8; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_S; - if Value >= -73.0 then - begin - Over := Round(Value - (-73.0)); - if Over < 5 then Lbl := 'S9' - else begin Over := ((Over + 5) div 10) * 10; if Over = 0 then Over := 10; Lbl := Format('S9+%d', [Over]); end; - end else if Value <= -121.0 then Lbl := 'S1' - else begin - Lbl := 'S1'; - for SNum := 1 to 8 do - if Value >= (-121.0 + (SNum - 1) * 6.0) then Lbl := 'S' + IntToStr(SNum); - end; - ACanvas.TextOut(R.Left + 1, Y_BAR_BOT + TICK_LONG + 1, Lbl); + // --- Надписи в левой зоне, левовыровнены к LblZoneL+4 --- + ACanvas.Brush.Style := bsClear; + ACanvas.Font.Size := 10; ACanvas.Font.Style := [fsBold]; TH10 := ACanvas.TextHeight('0'); + ACanvas.Font.Size := 6; ACanvas.Font.Style := []; TH6 := ACanvas.TextHeight('0'); + // "-85.3" над "dBm", снизу прижаты к верхнему краю полосы + ACanvas.Font.Size := 10; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_DBM; + ACanvas.TextOut(LblZoneL + 4, Y_BAR_TOP - TH10 - 2, LblDbm); + ACanvas.Font.Size := 6; ACanvas.Font.Style := []; ACanvas.Font.Color := TColor($00507070); + ACanvas.TextOut(LblZoneL + 4 + TWDbm + 2, Y_BAR_TOP - TH6 - 4, 'dBm'); + // S-значение под полосой, левый край у LblZoneL+4 + ACanvas.Font.Size := 10; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_S; + ACanvas.TextOut(LblZoneL + 4, Y_BAR_BOT + 2, LblS); end; procedure TSpectrumView.DrawSMeterZone(ACanvas: TCanvas; R: TRect;