Redesign left panel layout: TX block on top, dynamic Band panel height

- 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 <noreply@anthropic.com>
This commit is contained in:
2026-05-15 15:15:10 +03:00
co-authored by Claude Sonnet 4.6
parent 88ceee824d
commit 66608da938
+46 -32
View File
@@ -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).