From 16c5f6d4289c03e154de591fc90b6c4b50fbe0e3 Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Mon, 25 May 2026 19:41:19 +0300 Subject: [PATCH] Align left panel button margins --- MainForm.pas | 172 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 123 insertions(+), 49 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index 256f636..3c9a062 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -126,6 +126,8 @@ const SMETER_MARGIN = 3; TOP_SMETER_GAP = 8; TOP_VFO_FONT = 25; + LEFT_PANEL_BTN_PAD = 3; + LEFT_PANEL_BTN_GAP = 2; type TDeviceItem = record @@ -434,6 +436,8 @@ type // ---- Helpers ---- procedure BuildUI; + function LeftPanelButtonLeft(PanelWidth, ColCount, ColIndex: Integer): Integer; + function LeftPanelButtonWidth(PanelWidth, ColCount, ColIndex: Integer): Integer; procedure ApplyDarkTheme; procedure SetLightTheme(V: Boolean); procedure StyleButton(B: TFlatButton; Active: Boolean = False); @@ -762,6 +766,31 @@ uses SettingsForm; {$R *.lfm} +function TMainForm.LeftPanelButtonWidth(PanelWidth, ColCount, + ColIndex: Integer): Integer; +var + InnerW, BaseW, Extra: Integer; +begin + if ColCount <= 0 then Exit(0); + InnerW := PanelWidth - 2 * LEFT_PANEL_BTN_PAD - + (ColCount - 1) * LEFT_PANEL_BTN_GAP; + BaseW := InnerW div ColCount; + Extra := InnerW mod ColCount; + Result := BaseW; + if ColIndex < Extra then Inc(Result); +end; + +function TMainForm.LeftPanelButtonLeft(PanelWidth, ColCount, + ColIndex: Integer): Integer; +var + i: Integer; +begin + Result := LEFT_PANEL_BTN_PAD; + for i := 0 to ColIndex - 1 do + Inc(Result, LeftPanelButtonWidth(PanelWidth, ColCount, i) + + LEFT_PANEL_BTN_GAP); +end; + constructor TWisdomBuildThread.Create(const ADirectory: string); begin inherited Create(False); @@ -1807,9 +1836,12 @@ begin PanelTX.BevelOuter := bvNone; MakeLbl(PanelTX, 'TX', 4, 2); - W := (LEFT_W - 6) div 4; - BtnMOX := MakeBtn(PanelTX, 'MOX', 2, 16, W - 2, BTN_SM, BtnMOXClick); - BtnTUN := MakeBtn(PanelTX, 'TUN', W + 2, 16, W - 2, BTN_SM, BtnTUNClick); + BtnMOX := MakeBtn(PanelTX, 'MOX', + LeftPanelButtonLeft(LEFT_W, 4, 0), 16, + LeftPanelButtonWidth(LEFT_W, 4, 0), BTN_SM, BtnMOXClick); + BtnTUN := MakeBtn(PanelTX, 'TUN', + LeftPanelButtonLeft(LEFT_W, 4, 1), 16, + LeftPanelButtonWidth(LEFT_W, 4, 1), BTN_SM, BtnTUNClick); LblDrv := TLabel.Create(Self); LblDrv.Parent := PanelTX; LblDrv.Left := 4; LblDrv.Top := 53; @@ -1832,13 +1864,13 @@ begin PanelBands.SetBounds(0, Y, LEFT_W, 74); PanelBands.BevelOuter := bvNone; MakeLbl(PanelBands, 'BAND', 4, 2); - W := (LEFT_W - 6) div 6; for i := 0 to BAND_COUNT - 1 do begin B := MakeBtn(PanelBands, BAND_NAMES[i], - 2 + (i mod 6) * W, + LeftPanelButtonLeft(LEFT_W, 6, i mod 6), 16 + (i div 6) * 27, - W - 2, BTN_SM, BtnBandClick); + LeftPanelButtonWidth(LEFT_W, 6, i mod 6), + BTN_SM, BtnBandClick); B.Tag := i; BtnBand[i] := B; end; @@ -1854,13 +1886,13 @@ begin PanelMode.SetBounds(0, Y, LEFT_W, 74); PanelMode.BevelOuter := bvNone; MakeLbl(PanelMode, 'MODE', 4, 2); - W := (LEFT_W - 6) div 4; for i := 0 to MODE_COUNT - 1 do begin B := MakeBtn(PanelMode, MODE_NAMES[i], - 2 + (i mod 4) * W, + LeftPanelButtonLeft(LEFT_W, 4, i mod 4), 16 + (i div 4) * 27, - W - 2, BTN_SM, BtnModeClick); + LeftPanelButtonWidth(LEFT_W, 4, i mod 4), + BTN_SM, BtnModeClick); B.Tag := i; BtnMode[i] := B; StyleButton(B, i = FMode); @@ -1874,13 +1906,13 @@ begin PanelFilter.SetBounds(0, Y, LEFT_W, 74); PanelFilter.BevelOuter := bvNone; MakeLbl(PanelFilter, 'FILTER', 4, 2); - W := (LEFT_W - 6) div 5; for i := 0 to FILT_COUNT - 1 do begin B := MakeBtn(PanelFilter, '---', - 2 + (i mod 5) * W, + LeftPanelButtonLeft(LEFT_W, 5, i mod 5), 16 + (i div 5) * 27, - W - 2, BTN_SM, BtnFilterClick); + LeftPanelButtonWidth(LEFT_W, 5, i mod 5), + BTN_SM, BtnFilterClick); B.Tag := i; BtnFilter[i] := B; end; @@ -1894,16 +1926,18 @@ begin PanelFMSQ.BevelOuter := bvNone; PanelFMSQ.Visible := False; MakeLbl(PanelFMSQ, 'SQL', 4, 4); - W := LEFT_W div 4 - 2; // button width ~56px - BtnFMSQ := MakeBtn(PanelFMSQ, 'SQL', 2, 20, W, BTN_SM, BtnFMSQClick); + W := LeftPanelButtonWidth(LEFT_W, 4, 0); + BtnFMSQ := MakeBtn(PanelFMSQ, 'SQL', + LeftPanelButtonLeft(LEFT_W, 4, 0), 20, + W, BTN_SM, BtnFMSQClick); StyleButton(BtnFMSQ, False); // Slider: vertically centred with button text (button top=20, h=24 → center=32) // Reserve 28px on the right for the numeric label TrkFMSQ := TFlatSlider.Create(Self); TrkFMSQ.Parent := PanelFMSQ; - TrkFMSQ.Left := W + 6; + TrkFMSQ.Left := BtnFMSQ.Left + BtnFMSQ.Width + 3; TrkFMSQ.Top := 25; // 32 - 14/2 = 25 - TrkFMSQ.Width := LEFT_W - W - 6 - 30 - 4; // leave 30px for label + margins + TrkFMSQ.Width := LEFT_W - TrkFMSQ.Left - 30 - 4; // leave 30px for label + margins TrkFMSQ.Height := 14; TrkFMSQ.Min := 0; TrkFMSQ.Max := 100; TrkFMSQ.Position := FFMSQLevel; @@ -1926,10 +1960,16 @@ begin PanelFMCTCSS.BevelOuter := bvNone; PanelFMCTCSS.Visible := False; MakeLbl(PanelFMCTCSS, 'CTCSS', 4, 4); - W := LEFT_W div 3 - 2; - BtnFMCTCSS := MakeBtn(PanelFMCTCSS, 'CTCSS', 2, 20, W, BTN_H, BtnFMCTCSSClick); + BtnFMCTCSS := MakeBtn(PanelFMCTCSS, 'CTCSS', + LeftPanelButtonLeft(LEFT_W, 3, 0), 20, + LeftPanelButtonWidth(LEFT_W, 3, 0), + BTN_H, BtnFMCTCSSClick); StyleButton(BtnFMCTCSS, False); - BtnFMCTCSSTone := MakeBtn(PanelFMCTCSS, CTCSS_NAMES[0], W + 4, 20, LEFT_W - W - 8, BTN_H, BtnFMCTCSSToneClick); + BtnFMCTCSSTone := MakeBtn(PanelFMCTCSS, CTCSS_NAMES[0], + LeftPanelButtonLeft(LEFT_W, 3, 1), 20, + LEFT_W - LEFT_PANEL_BTN_PAD - + LeftPanelButtonLeft(LEFT_W, 3, 1), + BTN_H, BtnFMCTCSSToneClick); StyleButton(BtnFMCTCSSTone, False); FCTCSSDropDown := TFlatDropDown.Create(BtnFMCTCSSTone, PanelLeft, 4, BTN_SM); @@ -1944,11 +1984,16 @@ begin PanelFMStep.BevelOuter := bvNone; PanelFMStep.Visible := False; MakeLbl(PanelFMStep, 'STEP', 4, 4); - W := LEFT_W div 3 - 2; - BtnFMStep := MakeBtn(PanelFMStep, 'STEP', 2, 20, W, BTN_H, BtnFMStepClick); + BtnFMStep := MakeBtn(PanelFMStep, 'STEP', + LeftPanelButtonLeft(LEFT_W, 3, 0), 20, + LeftPanelButtonWidth(LEFT_W, 3, 0), + BTN_H, BtnFMStepClick); StyleButton(BtnFMStep, FFMStepOn); BtnFMStepSel := MakeBtn(PanelFMStep, FM_STEP_NAMES[FFMStepIdx], - W + 4, 20, LEFT_W - W - 8, BTN_H, BtnFMStepSelClick); + LeftPanelButtonLeft(LEFT_W, 3, 1), 20, + LEFT_W - LEFT_PANEL_BTN_PAD - + LeftPanelButtonLeft(LEFT_W, 3, 1), + BTN_H, BtnFMStepSelClick); StyleButton(BtnFMStepSel, False); FStepDropDown := TFlatDropDown.Create(BtnFMStepSel, PanelLeft, FM_STEP_COUNT, BTN_SM); @@ -1957,12 +2002,17 @@ begin FStepDropDown.OnSelect := OnStepDropDownSelect; // CTUN / DUP buttons (display-related) - BtnCTun := MakeBtn(PanelLeft, 'CTUN', 2, Y, LEFT_W div 3 - 2, BTN_H, BtnCTunClick); + BtnCTun := MakeBtn(PanelLeft, 'CTUN', + LeftPanelButtonLeft(LEFT_W, 3, 0), Y, + LeftPanelButtonWidth(LEFT_W, 3, 0), + BTN_H, BtnCTunClick); BtnCTun.Tag := 0; StyleButton(BtnCTun, FCTun); BtnDUP := MakeBtn(PanelLeft, 'DUP', - 2 + (LEFT_W div 3) + 0, Y, LEFT_W div 3 - 2, BTN_H, BtnDUPClick); + LeftPanelButtonLeft(LEFT_W, 3, 1), Y, + LeftPanelButtonWidth(LEFT_W, 3, 1), + BTN_H, BtnDUPClick); BtnDUP.Tag := 0; StyleButton(BtnDUP, FDisplayDuplex); @@ -1976,12 +2026,31 @@ begin // AGC mode — 5 кнопок в ряд MakeLbl(PanelRX, 'AGC', 4, 4); - W := (LEFT_W - 10) div 5; - BtnAGCMode[0] := MakeBtn(PanelRX,'FAST', 2, 22, W, BTN_SM, BtnAGCModeClick); BtnAGCMode[0].Tag:=0; - BtnAGCMode[1] := MakeBtn(PanelRX,'MED', W+4, 22, W, BTN_SM, BtnAGCModeClick); BtnAGCMode[1].Tag:=1; - BtnAGCMode[2] := MakeBtn(PanelRX,'SLOW', 2*W+6, 22, W, BTN_SM, BtnAGCModeClick); BtnAGCMode[2].Tag:=2; - BtnAGCMode[3] := MakeBtn(PanelRX,'LONG', 3*W+8, 22, W, BTN_SM, BtnAGCModeClick); BtnAGCMode[3].Tag:=3; - BtnAGCMode[4] := MakeBtn(PanelRX,'OFF', 4*W+10, 22, W, BTN_SM, BtnAGCModeClick); BtnAGCMode[4].Tag:=4; + BtnAGCMode[0] := MakeBtn(PanelRX, 'FAST', + LeftPanelButtonLeft(LEFT_W, 5, 0), 22, + LeftPanelButtonWidth(LEFT_W, 5, 0), + BTN_SM, BtnAGCModeClick); + BtnAGCMode[0].Tag := 0; + BtnAGCMode[1] := MakeBtn(PanelRX, 'MED', + LeftPanelButtonLeft(LEFT_W, 5, 1), 22, + LeftPanelButtonWidth(LEFT_W, 5, 1), + BTN_SM, BtnAGCModeClick); + BtnAGCMode[1].Tag := 1; + BtnAGCMode[2] := MakeBtn(PanelRX, 'SLOW', + LeftPanelButtonLeft(LEFT_W, 5, 2), 22, + LeftPanelButtonWidth(LEFT_W, 5, 2), + BTN_SM, BtnAGCModeClick); + BtnAGCMode[2].Tag := 2; + BtnAGCMode[3] := MakeBtn(PanelRX, 'LONG', + LeftPanelButtonLeft(LEFT_W, 5, 3), 22, + LeftPanelButtonWidth(LEFT_W, 5, 3), + BTN_SM, BtnAGCModeClick); + BtnAGCMode[3].Tag := 3; + BtnAGCMode[4] := MakeBtn(PanelRX, 'OFF', + LeftPanelButtonLeft(LEFT_W, 5, 4), 22, + LeftPanelButtonWidth(LEFT_W, 5, 4), + BTN_SM, BtnAGCModeClick); + BtnAGCMode[4].Tag := 4; for i := 0 to 4 do StyleButton(BtnAGCMode[i], i = FAGCMode); // AGC level slider @@ -2011,12 +2080,21 @@ begin TrkVolume.OnChange := TrkVolumeChange; // NR NB SNB ANF MUTE - W := (LEFT_W - 10) div 5; - BtnNR := MakeBtn(PanelRX, 'NR', 2, 96, W, BTN_SM, BtnNRClick); - BtnNB := MakeBtn(PanelRX, 'NB', W+4, 96, W, BTN_SM, BtnNBClick); - BtnSNB := MakeBtn(PanelRX, 'SNB', 2*W+6, 96, W, BTN_SM, BtnSNBClick); - BtnANF := MakeBtn(PanelRX, 'ANF', 3*W+8, 96, W, BTN_SM, BtnANFClick); - BtnMute:= MakeBtn(PanelRX, 'MUTE', 4*W+10, 96, W, BTN_SM, BtnMuteClick); + BtnNR := MakeBtn(PanelRX, 'NR', + LeftPanelButtonLeft(LEFT_W, 5, 0), 96, + LeftPanelButtonWidth(LEFT_W, 5, 0), BTN_SM, BtnNRClick); + BtnNB := MakeBtn(PanelRX, 'NB', + LeftPanelButtonLeft(LEFT_W, 5, 1), 96, + LeftPanelButtonWidth(LEFT_W, 5, 1), BTN_SM, BtnNBClick); + BtnSNB := MakeBtn(PanelRX, 'SNB', + LeftPanelButtonLeft(LEFT_W, 5, 2), 96, + LeftPanelButtonWidth(LEFT_W, 5, 2), BTN_SM, BtnSNBClick); + BtnANF := MakeBtn(PanelRX, 'ANF', + LeftPanelButtonLeft(LEFT_W, 5, 3), 96, + LeftPanelButtonWidth(LEFT_W, 5, 3), BTN_SM, BtnANFClick); + BtnMute := MakeBtn(PanelRX, 'MUTE', + LeftPanelButtonLeft(LEFT_W, 5, 4), 96, + LeftPanelButtonWidth(LEFT_W, 5, 4), BTN_SM, BtnMuteClick); Inc(Y, 126); @@ -4329,7 +4407,6 @@ var i: Integer; Names: array[0..FILT_COUNT-1] of string; DefIdx: Integer; - W: Integer; begin if FMode = MODE_FM then begin @@ -4338,16 +4415,15 @@ begin if FFilter > 1 then FFilter := FILT_FM_DEF; // sanitize, keep NFM/WFM as-is FFilterBW := FILT_FM_BW[FFilter]; FFMDeviation := FILT_FM_DEV[FFilter]; - W := (PanelFilter.Width - 6) div 2; BtnFilter[0].Caption := FILT_FM_NAMES[0]; - BtnFilter[0].Left := 2; - BtnFilter[0].Width := W - 2; + BtnFilter[0].Left := LeftPanelButtonLeft(PanelFilter.Width, 2, 0); + BtnFilter[0].Width := LeftPanelButtonWidth(PanelFilter.Width, 2, 0); BtnFilter[0].Top := 16; BtnFilter[0].Visible := True; StyleButton(BtnFilter[0], FFilter = 0); BtnFilter[1].Caption := FILT_FM_NAMES[1]; - BtnFilter[1].Left := W + 2; - BtnFilter[1].Width := W - 2; + BtnFilter[1].Left := LeftPanelButtonLeft(PanelFilter.Width, 2, 1); + BtnFilter[1].Width := LeftPanelButtonWidth(PanelFilter.Width, 2, 1); BtnFilter[1].Top := 16; BtnFilter[1].Visible := True; StyleButton(BtnFilter[1], FFilter = 1); @@ -4377,12 +4453,11 @@ begin if PanelFMSQ <> nil then PanelFMSQ.Visible := False; if PanelFMCTCSS <> nil then PanelFMCTCSS.Visible := False; if PanelFMStep <> nil then begin CloseFMStepPopup; PanelFMStep.Visible := False; end; - W := (PanelFilter.Width - 6) div 5; for i := 0 to FILT_COUNT - 1 do begin - BtnFilter[i].Left := 2 + (i mod 5) * W; + BtnFilter[i].Left := LeftPanelButtonLeft(PanelFilter.Width, 5, i mod 5); BtnFilter[i].Top := 16 + (i div 5) * 27; - BtnFilter[i].Width := W - 2; + BtnFilter[i].Width := LeftPanelButtonWidth(PanelFilter.Width, 5, i mod 5); BtnFilter[i].Visible := True; end; @@ -6420,7 +6495,7 @@ end; procedure TMainForm.RebuildXvtrButtons; var i, Pos, XvtrRows: Integer; - W, BtnH, RowH, MaxBottom: Integer; + BtnH, RowH, MaxBottom: Integer; B: TFlatButton; Cap: string; begin @@ -6447,7 +6522,6 @@ begin if BtnH = 0 then BtnH := MulDiv(24, Screen.PixelsPerInch, 96); RowH := BtnH + 3; // шаг ряда: высота кнопки + 3px зазор (как 27=24+3 при 1x) - W := (PanelBands.Width - 6) div 6; Pos := 0; // позиция среди enabled слотов for i := 0 to CFG_XVTR_COUNT - 1 do if FXvtrSettings.Entries[i].Enabled then @@ -6458,9 +6532,9 @@ begin B := TFlatButton.Create(Self); B.Parent := PanelBands; B.Caption := Cap; - B.Left := 2 + (Pos mod 6) * W; + B.Left := LeftPanelButtonLeft(PanelBands.Width, 6, Pos mod 6); B.Top := MaxBottom + 4 + (Pos div 6) * RowH; - B.Width := W - 2; + B.Width := LeftPanelButtonWidth(PanelBands.Width, 6, Pos mod 6); B.Height := BtnH; B.OnClick := BtnXvtrBandClick; B.Tag := -(i + 1); // отрицательное значение = XVTR индекс