ui(main): align left panel sliders

This commit is contained in:
2026-08-05 16:51:43 +03:00
parent 19babef4d7
commit 7c9064659b
+43 -19
View File
@@ -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;
// ===========================================================================