diff --git a/MainForm.pas b/MainForm.pas index 5ce65e0..a9f266b 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -278,6 +278,7 @@ type PanelTX: TPanel; LblDrv: TLabel; + LblDrvVal: TLabel; // значение drive: % (openHPSDR) или дБ (Pluto) TrkDrive: TFlatSlider; BtnMOX: TFlatButton; BtnTUN: TFlatButton; @@ -492,6 +493,7 @@ type procedure OnVfoOverlayInvalidate(Sender: TObject); procedure PbSpectrumDblClick(Sender: TObject); procedure TrkDriveChange(Sender: TObject); + procedure UpdateDriveLabel; // % (openHPSDR) / дБ (Pluto) рядом с ползунком drive procedure TrkVolumeChange(Sender: TObject); function CalcDriveByte: Byte; function ActiveTXFreqHz: Double; @@ -1257,6 +1259,7 @@ begin rfDrive: begin TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive% + UpdateDriveLabel; // % / дБ рядом с ползунком FChannelController.OnDriveChanged; // внешнее изменение снимает память канала end; rfAGCTop: @@ -1353,6 +1356,7 @@ begin RebuildXvtrButtons; PushXvtrToWeb; TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive% + UpdateDriveLabel; // переключаем единицу %/дБ под бэкенд if Assigned(FSampleRateOverlay) then FSampleRateOverlay.SetCurrentRate(FController.FSampleRate); UpdateNRButton; UpdateNBButton; UpdateSNBButton; UpdateANFButton; @@ -1680,10 +1684,17 @@ begin TrkDrive := TFlatSlider.Create(Self); TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 74; - TrkDrive.Width := 150; TrkDrive.Height := 16; + TrkDrive.Width := 120; TrkDrive.Height := 16; TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50; TrkDrive.OnChange := TrkDriveChange; + LblDrvVal := TLabel.Create(Self); + LblDrvVal.Parent := PanelTX; + LblDrvVal.Left := 158; LblDrvVal.Top := 77; + LblDrvVal.Font.Color := CLR_TEXT; LblDrvVal.Font.Name := 'Courier New'; + LblDrvVal.Font.Size := 7; + UpdateDriveLabel; + Inc(Y, 100); // RX block: CTUN + VOL + NR/NB/SNB/ANF/MUTE @@ -5029,6 +5040,17 @@ begin FController.SetDrive(TrkDrive.Position); // rfDrive-рендер снимет память канала (OnDriveChanged) end; +procedure TMainForm.UpdateDriveLabel; +// Значение рядом с ползунком drive: openHPSDR — проценты, Pluto — TX-аттенюация +// в дБ (берём из контроллера; маппинг drive%→дБ — там же). +begin + if LblDrvVal = nil then Exit; + if FController.IsPluto then + LblDrvVal.Caption := Format('%.0fdB', [FController.PlutoTxAttForDrive]) + else + LblDrvVal.Caption := Format('%d%%', [FController.FDrivePercent]); +end; + function TMainForm.CalcDriveByte: Byte; begin // Формула — в контроллере (чистая над состоянием). Делегат для существующих @@ -5058,6 +5080,7 @@ procedure TMainForm.OnPlutoTxMaxAttChange(MaxAttDb: Double); begin // Логика (clamp/apply/persist) — в контроллере; UI лишь передаёт значение. FController.SetPlutoTxMaxAtt(MaxAttDb); + UpdateDriveLabel; // изменился потолок → пересчитать дБ-подпись drive end; procedure TMainForm.OnVHFCalSettingsChange(const VHFCal: array of Double);