diff --git a/MainForm.pas b/MainForm.pas index 4601580..6f78e61 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -334,6 +334,7 @@ type TrkRxGain: TFlatSlider; // manual gain 0..73 dB LblRxGain: TLabel; // значение усиления TrkVolume: TFlatSlider; + LblVolume: TLabel; BtnNR: TFlatButton; BtnNB: TFlatButton; BtnSNB: TFlatButton; @@ -751,6 +752,7 @@ type procedure TrkDriveChange(Sender: TObject); procedure UpdateDriveLabel; // % (openHPSDR) / дБ (Pluto) рядом с ползунком drive procedure TrkVolumeChange(Sender: TObject); + procedure UpdateVolumeLabel; function CalcDriveByte: Byte; function ActiveTXFreqHz: Double; function DefaultMicSource: TTXMicSource; @@ -1603,7 +1605,10 @@ begin rfAGCMode: for i := 0 to 4 do StyleButton(BtnAGCMode[i], i = FController.FAGCMode); rfVolume: - TrkVolume.Position := FController.ActiveVolume; // RX или TX-монитор + begin + TrkVolume.Position := FController.ActiveVolume; // RX или TX-монитор + UpdateVolumeLabel; + end; rfRxGain: UpdateRxGainUI; rfAtten: @@ -1762,6 +1767,7 @@ begin TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive% TrkVolume.Position := FController.ActiveVolume; // слайдер ← загруженная громкость (был баг: не синхронизировался) UpdateDriveLabel; // переключаем единицу %/дБ под бэкенд + UpdateVolumeLabel; if Assigned(FSampleRateOverlay) then FSampleRateOverlay.SetCurrentRate(FController.FSampleRate); UpdateNRButton; UpdateNBButton; UpdateSNBButton; UpdateANFButton; @@ -1872,6 +1878,9 @@ const // Заголовок с отступом (20) + MODE_ROWS рядов с шагом 27 + нижний отступ. MODE_PANEL_H = 20 + (MODE_ROWS - 1) * 27 + BTN_SM + 3; PLUTO_AGC_H = 64; // высота отдельного Pluto RF-AGC блока (под AGC) + LEFT_SLIDER_LEFT = 56; + LEFT_SLIDER_W = LEFT_W - 96; + LEFT_SLIDER_VALUE_LEFT = LEFT_W - 38; TOP_VFO_W = 244; TOP_VFO_FREQ_H = 47; var @@ -2161,14 +2170,14 @@ begin LblDrv.Font.Size := 8; TrkDrive := TFlatSlider.Create(Self); - TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 78; - TrkDrive.Width := 120; TrkDrive.Height := 16; + TrkDrive.Parent := PanelTX; TrkDrive.Left := LEFT_SLIDER_LEFT; TrkDrive.Top := 78; + TrkDrive.Width := LEFT_SLIDER_W; 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.Left := LEFT_SLIDER_VALUE_LEFT; LblDrvVal.Top := 77; LblDrvVal.Font.Color := CLR_TEXT; LblDrvVal.Font.Size := 8; UpdateDriveLabel; @@ -2213,12 +2222,19 @@ begin MakeLbl(PanelRXBlock, 'VOL', 4, 50); TrkVolume := TFlatSlider.Create(Self); - TrkVolume.Parent := PanelRXBlock; TrkVolume.Left := 34; TrkVolume.Top := 50; - TrkVolume.Width := LEFT_W - 38; TrkVolume.Height := 16; + TrkVolume.Parent := PanelRXBlock; TrkVolume.Left := LEFT_SLIDER_LEFT; TrkVolume.Top := 50; + TrkVolume.Width := LEFT_SLIDER_W; TrkVolume.Height := 16; TrkVolume.Min := 0; TrkVolume.Max := 100; - TrkVolume.Position := FController.FVolume; + TrkVolume.Position := FController.ActiveVolume; TrkVolume.OnChange := TrkVolumeChange; + LblVolume := TLabel.Create(Self); + LblVolume.Parent := PanelRXBlock; + LblVolume.Left := LEFT_SLIDER_VALUE_LEFT; LblVolume.Top := 50; + LblVolume.Font.Color := CLR_TEXT; + LblVolume.Font.Size := 8; + UpdateVolumeLabel; + BtnNR := MakeBtn(PanelRXBlock, 'NR', LeftPanelButtonLeft(LEFT_W, 5, 0), 74, LeftPanelButtonWidth(LEFT_W, 5, 0), BTN_SM, BtnNRClick); @@ -2244,15 +2260,15 @@ begin LblAtt.Font.Size := 8; TrkAtt := TFlatSlider.Create(Self); - TrkAtt.Parent := PanelRXBlock; TrkAtt.Left := 34; TrkAtt.Top := 106; - TrkAtt.Width := LEFT_W - 76; TrkAtt.Height := 16; + TrkAtt.Parent := PanelRXBlock; TrkAtt.Left := LEFT_SLIDER_LEFT; TrkAtt.Top := 106; + TrkAtt.Width := LEFT_SLIDER_W; TrkAtt.Height := 16; TrkAtt.Min := 0; TrkAtt.Max := 31; // ADC step attenuator, дБ TrkAtt.Position := FController.FAtten; TrkAtt.OnChange := TrkAttChange; LblAttVal := TLabel.Create(Self); LblAttVal.Parent := PanelRXBlock; - LblAttVal.Left := LEFT_W - 38; LblAttVal.Top := 106; + LblAttVal.Left := LEFT_SLIDER_VALUE_LEFT; LblAttVal.Top := 106; LblAttVal.Font.Color := CLR_TEXT; LblAttVal.Font.Size := 8; UpdateAttLabel; @@ -2297,8 +2313,8 @@ begin // AGC level slider MakeLbl(PanelAGC, 'THRESH', 4, 44); TrkAGC := TFlatSlider.Create(Self); - TrkAGC.Parent := PanelAGC; TrkAGC.Left := 56; TrkAGC.Top := 44; - TrkAGC.Width := LEFT_W - 96; TrkAGC.Height := 16; + TrkAGC.Parent := PanelAGC; TrkAGC.Left := LEFT_SLIDER_LEFT; TrkAGC.Top := 44; + TrkAGC.Width := LEFT_SLIDER_W; TrkAGC.Height := 16; TrkAGC.Min := 20; TrkAGC.Max := 120; // 20..120 → −20..-120 dBm TrkAGC.Position := FController.FAGCTop; TrkAGC.Reversed := True; @@ -2306,7 +2322,7 @@ begin LblAGCTop := TLabel.Create(Self); LblAGCTop.Parent := PanelAGC; - LblAGCTop.Left := LEFT_W - 38; LblAGCTop.Top := 44; + LblAGCTop.Left := LEFT_SLIDER_VALUE_LEFT; LblAGCTop.Top := 44; LblAGCTop.Caption := Format('-%ddB', [FController.FAGCTop]); LblAGCTop.Font.Color := CLR_TEXT; LblAGCTop.Font.Size := 8; @@ -2341,14 +2357,14 @@ begin // Manual gain slider. MakeLbl(PanelPlutoAGC, 'GAIN', 4, 44); TrkRxGain := TFlatSlider.Create(Self); - TrkRxGain.Parent := PanelPlutoAGC; TrkRxGain.Left := 56; TrkRxGain.Top := 44; - TrkRxGain.Width := LEFT_W - 96; TrkRxGain.Height := 16; + TrkRxGain.Parent := PanelPlutoAGC; TrkRxGain.Left := LEFT_SLIDER_LEFT; TrkRxGain.Top := 44; + TrkRxGain.Width := LEFT_SLIDER_W; TrkRxGain.Height := 16; TrkRxGain.Min := 0; TrkRxGain.Max := 73; // AD936x hardwaregain dB TrkRxGain.Position := FController.FRxGainDb; TrkRxGain.OnChange := TrkRxGainChange; LblRxGain := TLabel.Create(Self); LblRxGain.Parent := PanelPlutoAGC; - LblRxGain.Left := LEFT_W - 38; LblRxGain.Top := 44; + LblRxGain.Left := LEFT_SLIDER_VALUE_LEFT; LblRxGain.Top := 44; LblRxGain.Caption := Format('%ddB', [FController.FRxGainDb]); LblRxGain.Font.Color := CLR_TEXT; LblRxGain.Font.Size := 8; @@ -2431,9 +2447,9 @@ begin MakeLbl(PanelRawDev, 'DEVIATION', 4, 2); TrkRawDev := TFlatSlider.Create(Self); TrkRawDev.Parent := PanelRawDev; - TrkRawDev.Left := 5; + TrkRawDev.Left := 34; TrkRawDev.Top := 22; - TrkRawDev.Width := LEFT_W - 68; + TrkRawDev.Width := LEFT_SLIDER_W; TrkRawDev.Height := 14; TrkRawDev.Min := RAW_FM_DEV_MIN div 50; TrkRawDev.Max := RAW_FM_DEV_MAX div 50; @@ -2467,7 +2483,7 @@ begin TrkFMSQ.Parent := PanelFMSQ; TrkFMSQ.Left := BtnFMSQ.Left + BtnFMSQ.Width + 3; TrkFMSQ.Top := 25; - TrkFMSQ.Width := LEFT_W - TrkFMSQ.Left - 30 - 4; // leave 30px for label + margins + TrkFMSQ.Width := LEFT_SLIDER_W; TrkFMSQ.Height := 14; TrkFMSQ.Min := 0; TrkFMSQ.Max := 100; TrkFMSQ.Position := FController.FFMSQLevel; @@ -3215,6 +3231,7 @@ begin DL(LblAGCTop, False); DL(LblDrv); DL(LblDrvVal, False); + DL(LblVolume, False); DL(LblAttVal, False); DL(LblRxGain, False); DL(LblRawDev, False); @@ -8495,6 +8512,13 @@ procedure TMainForm.TrkVolumeChange(Sender: TObject); begin if FSyncingFromController then Exit; FController.SetVolume(TrkVolume.Position); + UpdateVolumeLabel; +end; + +procedure TMainForm.UpdateVolumeLabel; +begin + if LblVolume <> nil then + LblVolume.Caption := Format('%d%%', [FController.ActiveVolume]); end; // ===========================================================================