From 66608da9387178811fcddf2d0c80ec115fa51b8b Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Fri, 15 May 2026 15:15:10 +0300 Subject: [PATCH] Redesign left panel layout: TX block on top, dynamic Band panel height MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move PanelTX above PanelBands; DRV slider now below MOX/TUN buttons - MOX/TUN resized to match standard button style (54×24, BTN_SM) - PanelBands default height reduced to 74 (no reserved XVTR space) - RebuildXvtrButtons dynamically resizes PanelBands (+27px per XVTR row) and calls RelayoutBelowBands to reposition Mode/Filter/CTUN/RX panels Co-Authored-By: Claude Sonnet 4.6 --- MainForm.pas | 78 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 32 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index d02a3f8..39f4f19 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -571,6 +571,7 @@ type function XvtrTranslate(VisibleHz: Double): Double; procedure ApplyXvtrToNetwork; procedure RebuildXvtrButtons; + procedure RelayoutBelowBands; procedure BtnXvtrBandClick(Sender: TObject); procedure ActivateXvtrBand(Idx: Integer); procedure DeactivateXvtr; @@ -1565,12 +1566,36 @@ begin LayoutTopVfoBlock; + // TX controls + PanelTX := TPanel.Create(Self); + PanelTX.Parent := PanelLeft; + PanelTX.SetBounds(0, Y, LEFT_W, 72); + 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); + + LblDrv := TLabel.Create(Self); + LblDrv.Parent := PanelTX; LblDrv.Left := 4; LblDrv.Top := 53; + LblDrv.Caption := 'DRV'; LblDrv.Font.Color := CLR_TEXTDIM; + LblDrv.Font.Name := 'Courier New'; LblDrv.Font.Size := 7; + + TrkDrive := TFlatSlider.Create(Self); + TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 50; + TrkDrive.Width := 150; TrkDrive.Height := 16; + TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50; + TrkDrive.OnChange := TrkDriveChange; + + Inc(Y, 76); + // Band selector. Высота резервирует 2 дополнительных ряда под XVTR-кнопки // (создаются динамически в RebuildXvtrButtons). В каждом ряду до 6 кнопок, // итого до 12 XVTR-кнопок (наш CFG_XVTR_COUNT = 8 умещается с запасом). PanelBands := TPanel.Create(Self); PanelBands.Parent := PanelLeft; - PanelBands.SetBounds(0, Y, LEFT_W, 74 + 54); + PanelBands.SetBounds(0, Y, LEFT_W, 74); PanelBands.BevelOuter := bvNone; MakeLbl(PanelBands, 'BAND', 4, 2); W := (LEFT_W - 6) div 6; @@ -1587,7 +1612,7 @@ begin for i := 0 to CFG_XVTR_COUNT - 1 do BtnXvtrBand[i] := nil; - Inc(Y, 76 + 54); + Inc(Y, 76); // Mode selector PanelMode := TPanel.Create(Self); @@ -1692,35 +1717,6 @@ begin Inc(Y, 126); - // S-Meter - - Inc(Y, 52); - - // TX controls - PanelTX := TPanel.Create(Self); - PanelTX.Parent := PanelLeft; - PanelTX.SetBounds(0, Y, LEFT_W, 74); - PanelTX.BevelOuter := bvNone; - MakeLbl(PanelTX, 'TX', 4, 2); - - LblDrv := TLabel.Create(Self); - LblDrv.Parent := PanelTX; LblDrv.Left := 4; LblDrv.Top := 17; - LblDrv.Caption := 'DRV'; LblDrv.Font.Color := CLR_TEXTDIM; - LblDrv.Font.Name := 'Courier New'; LblDrv.Font.Size := 7; - - TrkDrive := TFlatSlider.Create(Self); - TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 16; - TrkDrive.Width := 150; TrkDrive.Height := 16; - TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50; - TrkDrive.OnChange := TrkDriveChange; - - BtnMOX := MakeBtn(PanelTX, 'MOX', 2, 38, 50, 32, BtnMOXClick); - BtnMOX.Font.Size := 12; BtnMOX.Font.Bold := True; - - BtnTUN := MakeBtn(PanelTX, 'TUN', 56, 38, 50, 32, BtnTUNClick); - BtnTUN.Font.Size := 12; BtnTUN.Font.Bold := True; - - // ---- Right panel ---- PanelRight := TPanel.Create(Self); PanelRight.Parent := Self; @@ -5620,11 +5616,23 @@ end; // Перестраивает динамические XVTR-кнопки в PanelBands. Удаляет старые, // создаёт новые для enabled слотов в 3-м и 4-м ряду PanelBands. +procedure TMainForm.RelayoutBelowBands; +var + Y: Integer; +begin + if PanelBands = nil then Exit; + Y := PanelBands.Top + PanelBands.Height + 2; + PanelMode.Top := Y; Inc(Y, 76); + PanelFilter.Top := Y; Inc(Y, 76); + BtnCTun.Top := Y; BtnDUP.Top := Y; Inc(Y, 30); // BTN_H(26) + 4 + PanelRX.Top := Y; +end; + procedure TMainForm.RebuildXvtrButtons; const BTN_H_LOC = 24; var - i, Pos: Integer; + i, Pos, XvtrRows: Integer; W: Integer; B: TFlatButton; Cap: string; @@ -5658,6 +5666,12 @@ begin StyleButton(B, i = FCurrentXvtr); Inc(Pos); end; + // Динамически подгоняем высоту PanelBands под реальное число XVTR-рядов + if Pos = 0 then XvtrRows := 0 + else if Pos <= 6 then XvtrRows := 1 + else XvtrRows := 2; + PanelBands.Height := 74 + XvtrRows * 27; + RelayoutBelowBands; end; // Обработчик клика по XVTR-кнопке. Tag = -(idx+1).