mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
ui(main): fix DPI layout and theme switching
This commit is contained in:
+24
-12
@@ -32,9 +32,11 @@ type
|
|||||||
FItemBtns: array of TFlatButton;
|
FItemBtns: array of TFlatButton;
|
||||||
FItemIndex: Integer;
|
FItemIndex: Integer;
|
||||||
FColumns: Integer;
|
FColumns: Integer;
|
||||||
FItemBtnH: Integer;
|
FItemBtnH96: Integer;
|
||||||
FRightInset96: Integer;
|
FRightInset96: Integer;
|
||||||
FIsOpen: Boolean;
|
FIsOpen: Boolean;
|
||||||
|
FStyleProc: TButtonStyleProc;
|
||||||
|
FPanelColor: TColor;
|
||||||
FOnSelect: TDropDownSelectEvent;
|
FOnSelect: TDropDownSelectEvent;
|
||||||
procedure ItemClick(Sender: TObject);
|
procedure ItemClick(Sender: TObject);
|
||||||
procedure PositionPopup;
|
procedure PositionPopup;
|
||||||
@@ -61,15 +63,17 @@ begin
|
|||||||
inherited Create;
|
inherited Create;
|
||||||
FAnchor := AAnchor;
|
FAnchor := AAnchor;
|
||||||
FPopupParent := APopupParent;
|
FPopupParent := APopupParent;
|
||||||
FColumns := ACols;
|
FColumns := Max(1, ACols);
|
||||||
FItemBtnH := ABtnH;
|
FItemBtnH96 := Max(1, ABtnH);
|
||||||
FRightInset96 := Max(0, ARightInset96);
|
FRightInset96 := Max(0, ARightInset96);
|
||||||
FItemIndex := 0;
|
FItemIndex := 0;
|
||||||
FIsOpen := False;
|
FIsOpen := False;
|
||||||
|
FStyleProc := nil;
|
||||||
|
FPanelColor := TColor($00181818);
|
||||||
FPopup := TPanel.Create(nil);
|
FPopup := TPanel.Create(nil);
|
||||||
FPopup.Parent := APopupParent;
|
FPopup.Parent := APopupParent;
|
||||||
FPopup.BevelOuter := bvNone;
|
FPopup.BevelOuter := bvNone;
|
||||||
FPopup.Color := TColor($00181818);
|
FPopup.Color := FPanelColor;
|
||||||
FPopup.Visible := False;
|
FPopup.Visible := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -81,7 +85,7 @@ end;
|
|||||||
|
|
||||||
procedure TFlatDropDown.SetItems(const ANames: array of string);
|
procedure TFlatDropDown.SetItems(const ANames: array of string);
|
||||||
var
|
var
|
||||||
I, Count, BtnW, PopW: Integer;
|
I, Count, BtnW, PopW, ItemBtnH, EdgePad, ItemGap: Integer;
|
||||||
B: TFlatButton;
|
B: TFlatButton;
|
||||||
begin
|
begin
|
||||||
while FPopup.ControlCount > 0 do
|
while FPopup.ControlCount > 0 do
|
||||||
@@ -93,17 +97,22 @@ begin
|
|||||||
// при каждом наполнении: SetItems бывает и до, и после DPI-scale формы.
|
// при каждом наполнении: SetItems бывает и до, и после DPI-scale формы.
|
||||||
PopW := Max(1, FPopupParent.ClientWidth -
|
PopW := Max(1, FPopupParent.ClientWidth -
|
||||||
FPopupParent.Scale96ToForm(FRightInset96));
|
FPopupParent.Scale96ToForm(FRightInset96));
|
||||||
BtnW := (PopW - 4) div FColumns;
|
ItemBtnH := FPopupParent.Scale96ToForm(FItemBtnH96);
|
||||||
|
EdgePad := FPopupParent.Scale96ToForm(2);
|
||||||
|
ItemGap := FPopupParent.Scale96ToForm(2);
|
||||||
|
BtnW := Max(1, (PopW - 2 * EdgePad) div FColumns);
|
||||||
FPopup.SetBounds(0, 0, PopW,
|
FPopup.SetBounds(0, 0, PopW,
|
||||||
((Count + FColumns - 1) div FColumns) * FItemBtnH);
|
((Count + FColumns - 1) div FColumns) * ItemBtnH);
|
||||||
for I := 0 to Count - 1 do
|
for I := 0 to Count - 1 do
|
||||||
begin
|
begin
|
||||||
B := MakeFlatBtn(FPopup, ANames[I],
|
B := MakeFlatBtn(FPopup, ANames[I],
|
||||||
2 + (I mod FColumns) * BtnW,
|
EdgePad + (I mod FColumns) * BtnW,
|
||||||
(I div FColumns) * FItemBtnH,
|
(I div FColumns) * ItemBtnH,
|
||||||
BtnW - 2, FItemBtnH, @ItemClick);
|
Max(1, BtnW - ItemGap), ItemBtnH, @ItemClick);
|
||||||
B.Tag := I;
|
B.Tag := I;
|
||||||
B.Active := (I = FItemIndex);
|
B.Active := (I = FItemIndex);
|
||||||
|
if Assigned(FStyleProc) then
|
||||||
|
FStyleProc(B, B.Active);
|
||||||
FItemBtns[I] := B;
|
FItemBtns[I] := B;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@@ -141,9 +150,10 @@ var
|
|||||||
begin
|
begin
|
||||||
P := FAnchor.ClientToScreen(Point(0, FAnchor.Height));
|
P := FAnchor.ClientToScreen(Point(0, FAnchor.Height));
|
||||||
P := FPopupParent.ScreenToClient(P);
|
P := FPopupParent.ScreenToClient(P);
|
||||||
Y0 := P.Y + 2;
|
Y0 := P.Y + FPopupParent.Scale96ToForm(2);
|
||||||
if Y0 + FPopup.Height > FPopupParent.ClientHeight then
|
if Y0 + FPopup.Height > FPopupParent.ClientHeight then
|
||||||
Y0 := P.Y - FAnchor.Height - FPopup.Height - 2;
|
Y0 := P.Y - FAnchor.Height - FPopup.Height -
|
||||||
|
FPopupParent.Scale96ToForm(2);
|
||||||
if Y0 < 0 then Y0 := 0;
|
if Y0 < 0 then Y0 := 0;
|
||||||
FPopup.Top := Y0;
|
FPopup.Top := Y0;
|
||||||
FPopup.Left := 0;
|
FPopup.Left := 0;
|
||||||
@@ -173,6 +183,8 @@ procedure TFlatDropDown.ApplyStyle(AStyleProc: TButtonStyleProc; APanelColor: TC
|
|||||||
var
|
var
|
||||||
I: Integer;
|
I: Integer;
|
||||||
begin
|
begin
|
||||||
|
FStyleProc := AStyleProc;
|
||||||
|
FPanelColor := APanelColor;
|
||||||
FPopup.Color := APanelColor;
|
FPopup.Color := APanelColor;
|
||||||
for I := 0 to High(FItemBtns) do
|
for I := 0 to High(FItemBtns) do
|
||||||
if FItemBtns[I] <> nil then
|
if FItemBtns[I] <> nil then
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ object MainForm: TMainForm
|
|||||||
Color = clBlack
|
Color = clBlack
|
||||||
Font.Color = clSilver
|
Font.Color = clSilver
|
||||||
Font.Height = -13
|
Font.Height = -13
|
||||||
Font.Name = 'Courier New'
|
|
||||||
Position = poDesigned
|
Position = poDesigned
|
||||||
LCLVersion = '4.6.0.0'
|
LCLVersion = '4.6.0.0'
|
||||||
OnClose = FormClose
|
OnClose = FormClose
|
||||||
|
|||||||
+161
-103
@@ -106,6 +106,7 @@ const
|
|||||||
TOP_SMETER_GAP = 8;
|
TOP_SMETER_GAP = 8;
|
||||||
TOP_VFO_FONT = 25;
|
TOP_VFO_FONT = 25;
|
||||||
LEFT_SCROLL_GUTTER_W = 8;
|
LEFT_SCROLL_GUTTER_W = 8;
|
||||||
|
LEFT_PANEL_CONTENT_W = 232;
|
||||||
LEFT_PANEL_BTN_PAD = 3;
|
LEFT_PANEL_BTN_PAD = 3;
|
||||||
LEFT_PANEL_BTN_GAP = 2;
|
LEFT_PANEL_BTN_GAP = 2;
|
||||||
|
|
||||||
@@ -825,17 +826,18 @@ const
|
|||||||
// Высота RX-блока левой панели: с рядом ATT (openHPSDR) и без него (Pluto —
|
// Высота RX-блока левой панели: с рядом ATT (openHPSDR) и без него (Pluto —
|
||||||
// там усиление тракта в блоке RF AGC). Переключает LayoutLeftPanel, он же
|
// там усиление тракта в блоке RF AGC). Переключает LayoutLeftPanel, он же
|
||||||
// двигает панели ниже.
|
// двигает панели ниже.
|
||||||
RX_BLOCK_H = 96;
|
RX_BLOCK_H = 100;
|
||||||
RX_BLOCK_H_ATT = 120;
|
RX_BLOCK_H_ATT = 124;
|
||||||
|
|
||||||
function TMainForm.LeftPanelButtonWidth(PanelWidth, ColCount,
|
function TMainForm.LeftPanelButtonWidth(PanelWidth, ColCount,
|
||||||
ColIndex: Integer): Integer;
|
ColIndex: Integer): Integer;
|
||||||
var
|
var
|
||||||
InnerW, BaseW, Extra: Integer;
|
InnerW, BaseW, Extra, Pad, Gap: Integer;
|
||||||
begin
|
begin
|
||||||
if ColCount <= 0 then Exit(0);
|
if ColCount <= 0 then Exit(0);
|
||||||
InnerW := PanelWidth - 2 * LEFT_PANEL_BTN_PAD -
|
Pad := MulDiv(LEFT_PANEL_BTN_PAD, PanelWidth, LEFT_PANEL_CONTENT_W);
|
||||||
(ColCount - 1) * LEFT_PANEL_BTN_GAP;
|
Gap := MulDiv(LEFT_PANEL_BTN_GAP, PanelWidth, LEFT_PANEL_CONTENT_W);
|
||||||
|
InnerW := PanelWidth - 2 * Pad - (ColCount - 1) * Gap;
|
||||||
BaseW := InnerW div ColCount;
|
BaseW := InnerW div ColCount;
|
||||||
Extra := InnerW mod ColCount;
|
Extra := InnerW mod ColCount;
|
||||||
Result := BaseW;
|
Result := BaseW;
|
||||||
@@ -845,12 +847,14 @@ end;
|
|||||||
function TMainForm.LeftPanelButtonLeft(PanelWidth, ColCount,
|
function TMainForm.LeftPanelButtonLeft(PanelWidth, ColCount,
|
||||||
ColIndex: Integer): Integer;
|
ColIndex: Integer): Integer;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i, Pad, Gap: Integer;
|
||||||
begin
|
begin
|
||||||
Result := LEFT_PANEL_BTN_PAD;
|
Pad := MulDiv(LEFT_PANEL_BTN_PAD, PanelWidth, LEFT_PANEL_CONTENT_W);
|
||||||
|
Gap := MulDiv(LEFT_PANEL_BTN_GAP, PanelWidth, LEFT_PANEL_CONTENT_W);
|
||||||
|
Result := Pad;
|
||||||
for i := 0 to ColIndex - 1 do
|
for i := 0 to ColIndex - 1 do
|
||||||
Inc(Result, LeftPanelButtonWidth(PanelWidth, ColCount, i) +
|
Inc(Result, LeftPanelButtonWidth(PanelWidth, ColCount, i) +
|
||||||
LEFT_PANEL_BTN_GAP);
|
Gap);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
@@ -1864,9 +1868,9 @@ procedure TMainForm.BuildUI;
|
|||||||
const
|
const
|
||||||
BTN_H = 26;
|
BTN_H = 26;
|
||||||
BTN_SM = 24;
|
BTN_SM = 24;
|
||||||
LEFT_W = 232;
|
LEFT_W = LEFT_PANEL_CONTENT_W;
|
||||||
// Заголовок (16) + MODE_ROWS рядов с шагом 27 + нижний отступ.
|
// Заголовок с отступом (20) + MODE_ROWS рядов с шагом 27 + нижний отступ.
|
||||||
MODE_PANEL_H = 16 + (MODE_ROWS - 1) * 27 + BTN_SM + 7;
|
MODE_PANEL_H = 20 + (MODE_ROWS - 1) * 27 + BTN_SM + 3;
|
||||||
PLUTO_AGC_H = 64; // высота отдельного Pluto RF-AGC блока (под AGC)
|
PLUTO_AGC_H = 64; // высота отдельного Pluto RF-AGC блока (под AGC)
|
||||||
TOP_VFO_W = 244;
|
TOP_VFO_W = 244;
|
||||||
TOP_VFO_FREQ_H = 47;
|
TOP_VFO_FREQ_H = 47;
|
||||||
@@ -1899,8 +1903,7 @@ var
|
|||||||
L.Left := ALeft;
|
L.Left := ALeft;
|
||||||
L.Top := ATop;
|
L.Top := ATop;
|
||||||
L.Font.Color := CLR_TEXTDIM;
|
L.Font.Color := CLR_TEXTDIM;
|
||||||
L.Font.Name := 'Courier New';
|
L.Font.Size := 8;
|
||||||
L.Font.Size := 7;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@@ -1981,8 +1984,7 @@ begin
|
|||||||
PanelVfoA.BevelOuter := bvNone;
|
PanelVfoA.BevelOuter := bvNone;
|
||||||
|
|
||||||
BtnTopVfoASelect := MakeBtn(PanelVfoA, 'A', 0, 5, 20, 18, BtnTopVfoASelectClick);
|
BtnTopVfoASelect := MakeBtn(PanelVfoA, 'A', 0, 5, 20, 18, BtnTopVfoASelectClick);
|
||||||
BtnTopVfoASelect.Font.Name := 'Courier New';
|
BtnTopVfoASelect.Font.Size := 8;
|
||||||
BtnTopVfoASelect.Font.Size := 7;
|
|
||||||
BtnTopVfoASelect.Font.Bold := True;
|
BtnTopVfoASelect.Font.Bold := True;
|
||||||
BtnTopVfoASelect.ClrNorm := TColor($00303030);
|
BtnTopVfoASelect.ClrNorm := TColor($00303030);
|
||||||
BtnTopVfoASelect.ClrHot := TColor($00404040);
|
BtnTopVfoASelect.ClrHot := TColor($00404040);
|
||||||
@@ -1992,8 +1994,7 @@ begin
|
|||||||
BtnTopVfoASelect.ClrTextAct := CLR_TEXT;
|
BtnTopVfoASelect.ClrTextAct := CLR_TEXT;
|
||||||
|
|
||||||
BtnTopVfoATX := MakeBtn(PanelVfoA, 'TX', 0, 25, 20, 18, BtnTopVfoATXClick);
|
BtnTopVfoATX := MakeBtn(PanelVfoA, 'TX', 0, 25, 20, 18, BtnTopVfoATXClick);
|
||||||
BtnTopVfoATX.Font.Name := 'Courier New';
|
BtnTopVfoATX.Font.Size := 8;
|
||||||
BtnTopVfoATX.Font.Size := 7;
|
|
||||||
BtnTopVfoATX.Font.Bold := True;
|
BtnTopVfoATX.Font.Bold := True;
|
||||||
BtnTopVfoATX.ClrNorm := TColor($00303030);
|
BtnTopVfoATX.ClrNorm := TColor($00303030);
|
||||||
BtnTopVfoATX.ClrHot := TColor($00404040);
|
BtnTopVfoATX.ClrHot := TColor($00404040);
|
||||||
@@ -2006,7 +2007,7 @@ begin
|
|||||||
LblVfoALabel.Parent := PanelVfoA;
|
LblVfoALabel.Parent := PanelVfoA;
|
||||||
LblVfoALabel.Caption := 'VFO-A';
|
LblVfoALabel.Caption := 'VFO-A';
|
||||||
LblVfoALabel.Left := 0; LblVfoALabel.Top := 0;
|
LblVfoALabel.Left := 0; LblVfoALabel.Top := 0;
|
||||||
LblVfoALabel.Font.Name := 'Courier New'; LblVfoALabel.Font.Size := 7;
|
LblVfoALabel.Font.Size := 8;
|
||||||
LblVfoALabel.Font.Color := CLR_TEXTDIM;
|
LblVfoALabel.Font.Color := CLR_TEXTDIM;
|
||||||
LblVfoALabel.Visible := False;
|
LblVfoALabel.Visible := False;
|
||||||
|
|
||||||
@@ -2038,8 +2039,7 @@ begin
|
|||||||
PanelVfoB.BevelOuter := bvNone;
|
PanelVfoB.BevelOuter := bvNone;
|
||||||
|
|
||||||
BtnTopVfoBSelect := MakeBtn(PanelVfoB, 'B', 0, 5, 20, 18, BtnTopVfoBSelectClick);
|
BtnTopVfoBSelect := MakeBtn(PanelVfoB, 'B', 0, 5, 20, 18, BtnTopVfoBSelectClick);
|
||||||
BtnTopVfoBSelect.Font.Name := 'Courier New';
|
BtnTopVfoBSelect.Font.Size := 8;
|
||||||
BtnTopVfoBSelect.Font.Size := 7;
|
|
||||||
BtnTopVfoBSelect.Font.Bold := True;
|
BtnTopVfoBSelect.Font.Bold := True;
|
||||||
BtnTopVfoBSelect.ClrNorm := TColor($00303030);
|
BtnTopVfoBSelect.ClrNorm := TColor($00303030);
|
||||||
BtnTopVfoBSelect.ClrHot := TColor($00404040);
|
BtnTopVfoBSelect.ClrHot := TColor($00404040);
|
||||||
@@ -2049,8 +2049,7 @@ begin
|
|||||||
BtnTopVfoBSelect.ClrTextAct := CLR_TEXT;
|
BtnTopVfoBSelect.ClrTextAct := CLR_TEXT;
|
||||||
|
|
||||||
BtnTopVfoBTX := MakeBtn(PanelVfoB, 'TX', 0, 25, 20, 18, BtnTopVfoBTXClick);
|
BtnTopVfoBTX := MakeBtn(PanelVfoB, 'TX', 0, 25, 20, 18, BtnTopVfoBTXClick);
|
||||||
BtnTopVfoBTX.Font.Name := 'Courier New';
|
BtnTopVfoBTX.Font.Size := 8;
|
||||||
BtnTopVfoBTX.Font.Size := 7;
|
|
||||||
BtnTopVfoBTX.Font.Bold := True;
|
BtnTopVfoBTX.Font.Bold := True;
|
||||||
BtnTopVfoBTX.ClrNorm := TColor($00303030);
|
BtnTopVfoBTX.ClrNorm := TColor($00303030);
|
||||||
BtnTopVfoBTX.ClrHot := TColor($00404040);
|
BtnTopVfoBTX.ClrHot := TColor($00404040);
|
||||||
@@ -2063,7 +2062,7 @@ begin
|
|||||||
LblVfoBLabel.Parent := PanelVfoB;
|
LblVfoBLabel.Parent := PanelVfoB;
|
||||||
LblVfoBLabel.Caption := 'VFO-B';
|
LblVfoBLabel.Caption := 'VFO-B';
|
||||||
LblVfoBLabel.Left := 0; LblVfoBLabel.Top := 0;
|
LblVfoBLabel.Left := 0; LblVfoBLabel.Top := 0;
|
||||||
LblVfoBLabel.Font.Name := 'Courier New'; LblVfoBLabel.Font.Size := 7;
|
LblVfoBLabel.Font.Size := 8;
|
||||||
LblVfoBLabel.Font.Color := CLR_TEXTDIM;
|
LblVfoBLabel.Font.Color := CLR_TEXTDIM;
|
||||||
LblVfoBLabel.Visible := False;
|
LblVfoBLabel.Visible := False;
|
||||||
|
|
||||||
@@ -2096,9 +2095,9 @@ begin
|
|||||||
StyleSpanButton(BtnVfoACopyB, False);
|
StyleSpanButton(BtnVfoACopyB, False);
|
||||||
StyleSpanButton(BtnVfoSwap, False);
|
StyleSpanButton(BtnVfoSwap, False);
|
||||||
StyleSpanButton(BtnVfoBCopyA, False);
|
StyleSpanButton(BtnVfoBCopyA, False);
|
||||||
BtnVfoACopyB.Font.Size := 7;
|
BtnVfoACopyB.Font.Size := 8;
|
||||||
BtnVfoSwap.Font.Size := 7;
|
BtnVfoSwap.Font.Size := 8;
|
||||||
BtnVfoBCopyA.Font.Size := 7;
|
BtnVfoBCopyA.Font.Size := 8;
|
||||||
|
|
||||||
LayoutTopVfoBlock;
|
LayoutTopVfoBlock;
|
||||||
|
|
||||||
@@ -2110,23 +2109,23 @@ begin
|
|||||||
MakeLbl(PanelTX, 'TX', 4, 2);
|
MakeLbl(PanelTX, 'TX', 4, 2);
|
||||||
|
|
||||||
BtnMOX := MakeBtn(PanelTX, 'MOX',
|
BtnMOX := MakeBtn(PanelTX, 'MOX',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 0), 16,
|
LeftPanelButtonLeft(LEFT_W, 4, 0), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 4, 0), BTN_SM, BtnMOXClick);
|
LeftPanelButtonWidth(LEFT_W, 4, 0), BTN_SM, BtnMOXClick);
|
||||||
BtnTUN := MakeBtn(PanelTX, 'TUN',
|
BtnTUN := MakeBtn(PanelTX, 'TUN',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 1), 16,
|
LeftPanelButtonLeft(LEFT_W, 4, 1), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 4, 1), BTN_SM, BtnTUNClick);
|
LeftPanelButtonWidth(LEFT_W, 4, 1), BTN_SM, BtnTUNClick);
|
||||||
// PureSignal: ЛКМ = вкл/выкл, ПКМ = поповер настроек/управления.
|
// PureSignal: ЛКМ = вкл/выкл, ПКМ = поповер настроек/управления.
|
||||||
BtnPS := MakeBtn(PanelTX, 'PS',
|
BtnPS := MakeBtn(PanelTX, 'PS',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 2), 16,
|
LeftPanelButtonLeft(LEFT_W, 4, 2), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 4, 2), BTN_SM, BtnPSClick);
|
LeftPanelButtonWidth(LEFT_W, 4, 2), BTN_SM, BtnPSClick);
|
||||||
BtnPS.OnMouseDown := BtnPSMouseDown;
|
BtnPS.OnMouseDown := BtnPSMouseDown;
|
||||||
Btn2Ton := MakeBtn(PanelTX, '2TON',
|
Btn2Ton := MakeBtn(PanelTX, '2TON',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 3), 16,
|
LeftPanelButtonLeft(LEFT_W, 4, 3), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 4, 3), BTN_SM, Btn2TonClick);
|
LeftPanelButtonWidth(LEFT_W, 4, 3), BTN_SM, Btn2TonClick);
|
||||||
UpdateTXControlAvailability;
|
UpdateTXControlAvailability;
|
||||||
|
|
||||||
BtnDUP := MakeBtn(PanelTX, 'DUP',
|
BtnDUP := MakeBtn(PanelTX, 'DUP',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 0), 44,
|
LeftPanelButtonLeft(LEFT_W, 4, 0), 48,
|
||||||
LeftPanelButtonWidth(LEFT_W, 4, 0), BTN_SM, BtnDUPClick);
|
LeftPanelButtonWidth(LEFT_W, 4, 0), BTN_SM, BtnDUPClick);
|
||||||
BtnDUP.Tag := 0;
|
BtnDUP.Tag := 0;
|
||||||
StyleButton(BtnDUP, FController.FDisplayDuplex);
|
StyleButton(BtnDUP, FController.FDisplayDuplex);
|
||||||
@@ -2135,7 +2134,7 @@ begin
|
|||||||
// активна только в DUP (см. UpdateRxMuteButton). ON (подсвечена, умолч.) =
|
// активна только в DUP (см. UpdateRxMuteButton). ON (подсвечена, умолч.) =
|
||||||
// RX-аудио глушится на TX; OFF = слышим свой downlink во время передачи.
|
// RX-аудио глушится на TX; OFF = слышим свой downlink во время передачи.
|
||||||
BtnRxMute := MakeBtn(PanelTX, 'RX MUTE',
|
BtnRxMute := MakeBtn(PanelTX, 'RX MUTE',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 1), 44,
|
LeftPanelButtonLeft(LEFT_W, 4, 1), 48,
|
||||||
LeftPanelButtonWidth(LEFT_W, 4, 1), BTN_SM, BtnRxMuteClick);
|
LeftPanelButtonWidth(LEFT_W, 4, 1), BTN_SM, BtnRxMuteClick);
|
||||||
StyleButton(BtnRxMute, FController.FRxMuteOnTx);
|
StyleButton(BtnRxMute, FController.FRxMuteOnTx);
|
||||||
UpdateRxMuteButton; // видимость/активность по DUP
|
UpdateRxMuteButton; // видимость/активность по DUP
|
||||||
@@ -2143,7 +2142,7 @@ begin
|
|||||||
// TX-профиль — свободные колонки 2..3 того же ряда (панель не растёт по
|
// TX-профиль — свободные колонки 2..3 того же ряда (панель не растёт по
|
||||||
// высоте). Подпись = имя активного профиля, ЛКМ — список, ПКМ — настройки.
|
// высоте). Подпись = имя активного профиля, ЛКМ — список, ПКМ — настройки.
|
||||||
BtnTXProfile := MakeBtn(PanelTX, 'Default',
|
BtnTXProfile := MakeBtn(PanelTX, 'Default',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 2), 44,
|
LeftPanelButtonLeft(LEFT_W, 4, 2), 48,
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 3)
|
LeftPanelButtonLeft(LEFT_W, 4, 3)
|
||||||
+ LeftPanelButtonWidth(LEFT_W, 4, 3)
|
+ LeftPanelButtonWidth(LEFT_W, 4, 3)
|
||||||
- LeftPanelButtonLeft(LEFT_W, 4, 2),
|
- LeftPanelButtonLeft(LEFT_W, 4, 2),
|
||||||
@@ -2159,10 +2158,10 @@ begin
|
|||||||
LblDrv := TLabel.Create(Self);
|
LblDrv := TLabel.Create(Self);
|
||||||
LblDrv.Parent := PanelTX; LblDrv.Left := 4; LblDrv.Top := 77;
|
LblDrv.Parent := PanelTX; LblDrv.Left := 4; LblDrv.Top := 77;
|
||||||
LblDrv.Caption := 'DRV'; LblDrv.Font.Color := CLR_TEXTDIM;
|
LblDrv.Caption := 'DRV'; LblDrv.Font.Color := CLR_TEXTDIM;
|
||||||
LblDrv.Font.Name := 'Courier New'; LblDrv.Font.Size := 7;
|
LblDrv.Font.Size := 8;
|
||||||
|
|
||||||
TrkDrive := TFlatSlider.Create(Self);
|
TrkDrive := TFlatSlider.Create(Self);
|
||||||
TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 74;
|
TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 78;
|
||||||
TrkDrive.Width := 120; TrkDrive.Height := 16;
|
TrkDrive.Width := 120; TrkDrive.Height := 16;
|
||||||
TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50;
|
TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50;
|
||||||
TrkDrive.OnChange := TrkDriveChange;
|
TrkDrive.OnChange := TrkDriveChange;
|
||||||
@@ -2170,8 +2169,8 @@ begin
|
|||||||
LblDrvVal := TLabel.Create(Self);
|
LblDrvVal := TLabel.Create(Self);
|
||||||
LblDrvVal.Parent := PanelTX;
|
LblDrvVal.Parent := PanelTX;
|
||||||
LblDrvVal.Left := 158; LblDrvVal.Top := 77;
|
LblDrvVal.Left := 158; LblDrvVal.Top := 77;
|
||||||
LblDrvVal.Font.Color := CLR_TEXT; LblDrvVal.Font.Name := 'Courier New';
|
LblDrvVal.Font.Color := CLR_TEXT;
|
||||||
LblDrvVal.Font.Size := 7;
|
LblDrvVal.Font.Size := 8;
|
||||||
UpdateDriveLabel;
|
UpdateDriveLabel;
|
||||||
|
|
||||||
Inc(Y, 100);
|
Inc(Y, 100);
|
||||||
@@ -2184,14 +2183,14 @@ begin
|
|||||||
MakeLbl(PanelRXBlock, 'RX', 4, 2);
|
MakeLbl(PanelRXBlock, 'RX', 4, 2);
|
||||||
|
|
||||||
BtnCTun := MakeBtn(PanelRXBlock, 'CTUN',
|
BtnCTun := MakeBtn(PanelRXBlock, 'CTUN',
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 0), 16,
|
LeftPanelButtonLeft(LEFT_W, 3, 0), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 3, 0),
|
LeftPanelButtonWidth(LEFT_W, 3, 0),
|
||||||
BTN_H, BtnCTunClick);
|
BTN_H, BtnCTunClick);
|
||||||
BtnCTun.Tag := 0;
|
BtnCTun.Tag := 0;
|
||||||
StyleButton(BtnCTun, FController.FCTun);
|
StyleButton(BtnCTun, FController.FCTun);
|
||||||
|
|
||||||
BtnChannels := MakeBtn(PanelRXBlock, 'Channel',
|
BtnChannels := MakeBtn(PanelRXBlock, 'Channel',
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 1), 16,
|
LeftPanelButtonLeft(LEFT_W, 3, 1), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 3, 1),
|
LeftPanelButtonWidth(LEFT_W, 3, 1),
|
||||||
BTN_H, BtnChannelsClick);
|
BTN_H, BtnChannelsClick);
|
||||||
BtnChannels.OnMouseDown := BtnChannelsMouseDown;
|
BtnChannels.OnMouseDown := BtnChannelsMouseDown;
|
||||||
@@ -2205,7 +2204,7 @@ begin
|
|||||||
// QO-100 beacon lock — 3-я колонка ряда. Видима только в XVTR-режиме
|
// QO-100 beacon lock — 3-я колонка ряда. Видима только в XVTR-режиме
|
||||||
// (см. рендер rfXvtr ниже). Подпись/подсветка обновляются по rfBeaconLock.
|
// (см. рендер rfXvtr ниже). Подпись/подсветка обновляются по rfBeaconLock.
|
||||||
BtnBeacon := MakeBtn(PanelRXBlock, 'BEACON',
|
BtnBeacon := MakeBtn(PanelRXBlock, 'BEACON',
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 2), 16,
|
LeftPanelButtonLeft(LEFT_W, 3, 2), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 3, 2),
|
LeftPanelButtonWidth(LEFT_W, 3, 2),
|
||||||
BTN_H, BtnBeaconClick);
|
BTN_H, BtnBeaconClick);
|
||||||
BtnBeacon.Visible := False;
|
BtnBeacon.Visible := False;
|
||||||
@@ -2214,26 +2213,26 @@ begin
|
|||||||
|
|
||||||
MakeLbl(PanelRXBlock, 'VOL', 4, 50);
|
MakeLbl(PanelRXBlock, 'VOL', 4, 50);
|
||||||
TrkVolume := TFlatSlider.Create(Self);
|
TrkVolume := TFlatSlider.Create(Self);
|
||||||
TrkVolume.Parent := PanelRXBlock; TrkVolume.Left := 34; TrkVolume.Top := 46;
|
TrkVolume.Parent := PanelRXBlock; TrkVolume.Left := 34; TrkVolume.Top := 50;
|
||||||
TrkVolume.Width := LEFT_W - 38; TrkVolume.Height := 16;
|
TrkVolume.Width := LEFT_W - 38; TrkVolume.Height := 16;
|
||||||
TrkVolume.Min := 0; TrkVolume.Max := 100;
|
TrkVolume.Min := 0; TrkVolume.Max := 100;
|
||||||
TrkVolume.Position := FController.FVolume;
|
TrkVolume.Position := FController.FVolume;
|
||||||
TrkVolume.OnChange := TrkVolumeChange;
|
TrkVolume.OnChange := TrkVolumeChange;
|
||||||
|
|
||||||
BtnNR := MakeBtn(PanelRXBlock, 'NR',
|
BtnNR := MakeBtn(PanelRXBlock, 'NR',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 0), 70,
|
LeftPanelButtonLeft(LEFT_W, 5, 0), 74,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 0), BTN_SM, BtnNRClick);
|
LeftPanelButtonWidth(LEFT_W, 5, 0), BTN_SM, BtnNRClick);
|
||||||
BtnNB := MakeBtn(PanelRXBlock, 'NB',
|
BtnNB := MakeBtn(PanelRXBlock, 'NB',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 1), 70,
|
LeftPanelButtonLeft(LEFT_W, 5, 1), 74,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 1), BTN_SM, BtnNBClick);
|
LeftPanelButtonWidth(LEFT_W, 5, 1), BTN_SM, BtnNBClick);
|
||||||
BtnSNB := MakeBtn(PanelRXBlock, 'SNB',
|
BtnSNB := MakeBtn(PanelRXBlock, 'SNB',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 2), 70,
|
LeftPanelButtonLeft(LEFT_W, 5, 2), 74,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 2), BTN_SM, BtnSNBClick);
|
LeftPanelButtonWidth(LEFT_W, 5, 2), BTN_SM, BtnSNBClick);
|
||||||
BtnANF := MakeBtn(PanelRXBlock, 'ANF',
|
BtnANF := MakeBtn(PanelRXBlock, 'ANF',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 3), 70,
|
LeftPanelButtonLeft(LEFT_W, 5, 3), 74,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 3), BTN_SM, BtnANFClick);
|
LeftPanelButtonWidth(LEFT_W, 5, 3), BTN_SM, BtnANFClick);
|
||||||
BtnMute := MakeBtn(PanelRXBlock, 'MUTE',
|
BtnMute := MakeBtn(PanelRXBlock, 'MUTE',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 4), 70,
|
LeftPanelButtonLeft(LEFT_W, 5, 4), 74,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 4), BTN_SM, BtnMuteClick);
|
LeftPanelButtonWidth(LEFT_W, 5, 4), BTN_SM, BtnMuteClick);
|
||||||
|
|
||||||
// Шаговый аттенюатор ADC — плавный 0..31 дБ (железо openHPSDR так и умеет,
|
// Шаговый аттенюатор ADC — плавный 0..31 дБ (железо openHPSDR так и умеет,
|
||||||
@@ -2242,10 +2241,10 @@ begin
|
|||||||
LblAtt := TLabel.Create(Self);
|
LblAtt := TLabel.Create(Self);
|
||||||
LblAtt.Parent := PanelRXBlock; LblAtt.Left := 4; LblAtt.Top := 106;
|
LblAtt.Parent := PanelRXBlock; LblAtt.Left := 4; LblAtt.Top := 106;
|
||||||
LblAtt.Caption := 'ATT'; LblAtt.Font.Color := CLR_TEXTDIM;
|
LblAtt.Caption := 'ATT'; LblAtt.Font.Color := CLR_TEXTDIM;
|
||||||
LblAtt.Font.Name := 'Courier New'; LblAtt.Font.Size := 7;
|
LblAtt.Font.Size := 8;
|
||||||
|
|
||||||
TrkAtt := TFlatSlider.Create(Self);
|
TrkAtt := TFlatSlider.Create(Self);
|
||||||
TrkAtt.Parent := PanelRXBlock; TrkAtt.Left := 34; TrkAtt.Top := 102;
|
TrkAtt.Parent := PanelRXBlock; TrkAtt.Left := 34; TrkAtt.Top := 106;
|
||||||
TrkAtt.Width := LEFT_W - 76; TrkAtt.Height := 16;
|
TrkAtt.Width := LEFT_W - 76; TrkAtt.Height := 16;
|
||||||
TrkAtt.Min := 0; TrkAtt.Max := 31; // ADC step attenuator, дБ
|
TrkAtt.Min := 0; TrkAtt.Max := 31; // ADC step attenuator, дБ
|
||||||
TrkAtt.Position := FController.FAtten;
|
TrkAtt.Position := FController.FAtten;
|
||||||
@@ -2254,8 +2253,8 @@ begin
|
|||||||
LblAttVal := TLabel.Create(Self);
|
LblAttVal := TLabel.Create(Self);
|
||||||
LblAttVal.Parent := PanelRXBlock;
|
LblAttVal.Parent := PanelRXBlock;
|
||||||
LblAttVal.Left := LEFT_W - 38; LblAttVal.Top := 106;
|
LblAttVal.Left := LEFT_W - 38; LblAttVal.Top := 106;
|
||||||
LblAttVal.Font.Color := CLR_TEXT; LblAttVal.Font.Name := 'Courier New';
|
LblAttVal.Font.Color := CLR_TEXT;
|
||||||
LblAttVal.Font.Size := 7;
|
LblAttVal.Font.Size := 8;
|
||||||
UpdateAttLabel;
|
UpdateAttLabel;
|
||||||
|
|
||||||
Inc(Y, RX_BLOCK_H_ATT + 4);
|
Inc(Y, RX_BLOCK_H_ATT + 4);
|
||||||
@@ -2269,27 +2268,27 @@ begin
|
|||||||
// AGC mode — 5 кнопок в ряд
|
// AGC mode — 5 кнопок в ряд
|
||||||
MakeLbl(PanelAGC, 'AGC', 4, 2);
|
MakeLbl(PanelAGC, 'AGC', 4, 2);
|
||||||
BtnAGCMode[0] := MakeBtn(PanelAGC, 'FAST',
|
BtnAGCMode[0] := MakeBtn(PanelAGC, 'FAST',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 0), 16,
|
LeftPanelButtonLeft(LEFT_W, 5, 0), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 0),
|
LeftPanelButtonWidth(LEFT_W, 5, 0),
|
||||||
BTN_SM, BtnAGCModeClick);
|
BTN_SM, BtnAGCModeClick);
|
||||||
BtnAGCMode[0].Tag := 0;
|
BtnAGCMode[0].Tag := 0;
|
||||||
BtnAGCMode[1] := MakeBtn(PanelAGC, 'MED',
|
BtnAGCMode[1] := MakeBtn(PanelAGC, 'MED',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 1), 16,
|
LeftPanelButtonLeft(LEFT_W, 5, 1), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 1),
|
LeftPanelButtonWidth(LEFT_W, 5, 1),
|
||||||
BTN_SM, BtnAGCModeClick);
|
BTN_SM, BtnAGCModeClick);
|
||||||
BtnAGCMode[1].Tag := 1;
|
BtnAGCMode[1].Tag := 1;
|
||||||
BtnAGCMode[2] := MakeBtn(PanelAGC, 'SLOW',
|
BtnAGCMode[2] := MakeBtn(PanelAGC, 'SLOW',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 2), 16,
|
LeftPanelButtonLeft(LEFT_W, 5, 2), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 2),
|
LeftPanelButtonWidth(LEFT_W, 5, 2),
|
||||||
BTN_SM, BtnAGCModeClick);
|
BTN_SM, BtnAGCModeClick);
|
||||||
BtnAGCMode[2].Tag := 2;
|
BtnAGCMode[2].Tag := 2;
|
||||||
BtnAGCMode[3] := MakeBtn(PanelAGC, 'LONG',
|
BtnAGCMode[3] := MakeBtn(PanelAGC, 'LONG',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 3), 16,
|
LeftPanelButtonLeft(LEFT_W, 5, 3), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 3),
|
LeftPanelButtonWidth(LEFT_W, 5, 3),
|
||||||
BTN_SM, BtnAGCModeClick);
|
BTN_SM, BtnAGCModeClick);
|
||||||
BtnAGCMode[3].Tag := 3;
|
BtnAGCMode[3].Tag := 3;
|
||||||
BtnAGCMode[4] := MakeBtn(PanelAGC, 'OFF',
|
BtnAGCMode[4] := MakeBtn(PanelAGC, 'OFF',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 4), 16,
|
LeftPanelButtonLeft(LEFT_W, 5, 4), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 4),
|
LeftPanelButtonWidth(LEFT_W, 5, 4),
|
||||||
BTN_SM, BtnAGCModeClick);
|
BTN_SM, BtnAGCModeClick);
|
||||||
BtnAGCMode[4].Tag := 4;
|
BtnAGCMode[4].Tag := 4;
|
||||||
@@ -2298,7 +2297,7 @@ begin
|
|||||||
// AGC level slider
|
// AGC level slider
|
||||||
MakeLbl(PanelAGC, 'THRESH', 4, 44);
|
MakeLbl(PanelAGC, 'THRESH', 4, 44);
|
||||||
TrkAGC := TFlatSlider.Create(Self);
|
TrkAGC := TFlatSlider.Create(Self);
|
||||||
TrkAGC.Parent := PanelAGC; TrkAGC.Left := 56; TrkAGC.Top := 40;
|
TrkAGC.Parent := PanelAGC; TrkAGC.Left := 56; TrkAGC.Top := 44;
|
||||||
TrkAGC.Width := LEFT_W - 96; TrkAGC.Height := 16;
|
TrkAGC.Width := LEFT_W - 96; TrkAGC.Height := 16;
|
||||||
TrkAGC.Min := 20; TrkAGC.Max := 120; // 20..120 → −20..-120 dBm
|
TrkAGC.Min := 20; TrkAGC.Max := 120; // 20..120 → −20..-120 dBm
|
||||||
TrkAGC.Position := FController.FAGCTop;
|
TrkAGC.Position := FController.FAGCTop;
|
||||||
@@ -2309,8 +2308,8 @@ begin
|
|||||||
LblAGCTop.Parent := PanelAGC;
|
LblAGCTop.Parent := PanelAGC;
|
||||||
LblAGCTop.Left := LEFT_W - 38; LblAGCTop.Top := 44;
|
LblAGCTop.Left := LEFT_W - 38; LblAGCTop.Top := 44;
|
||||||
LblAGCTop.Caption := Format('-%ddB', [FController.FAGCTop]);
|
LblAGCTop.Caption := Format('-%ddB', [FController.FAGCTop]);
|
||||||
LblAGCTop.Font.Color := CLR_TEXT; LblAGCTop.Font.Name := 'Courier New';
|
LblAGCTop.Font.Color := CLR_TEXT;
|
||||||
LblAGCTop.Font.Size := 7;
|
LblAGCTop.Font.Size := 8;
|
||||||
|
|
||||||
Inc(Y, 74);
|
Inc(Y, 74);
|
||||||
|
|
||||||
@@ -2324,25 +2323,25 @@ begin
|
|||||||
MakeLbl(PanelPlutoAGC, 'RF AGC', 4, 2);
|
MakeLbl(PanelPlutoAGC, 'RF AGC', 4, 2);
|
||||||
// Режимы AD936x: FAST/SLOW/HYB/MAN. Tag = индекс режима (1/2/3/0).
|
// Режимы AD936x: FAST/SLOW/HYB/MAN. Tag = индекс режима (1/2/3/0).
|
||||||
BtnPlutoGain[0] := MakeBtn(PanelPlutoAGC, 'FAST',
|
BtnPlutoGain[0] := MakeBtn(PanelPlutoAGC, 'FAST',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 0), 16, LeftPanelButtonWidth(LEFT_W, 4, 0),
|
LeftPanelButtonLeft(LEFT_W, 4, 0), 20, LeftPanelButtonWidth(LEFT_W, 4, 0),
|
||||||
BTN_SM, BtnPlutoGainClick);
|
BTN_SM, BtnPlutoGainClick);
|
||||||
BtnPlutoGain[0].Tag := 1;
|
BtnPlutoGain[0].Tag := 1;
|
||||||
BtnPlutoGain[1] := MakeBtn(PanelPlutoAGC, 'SLOW',
|
BtnPlutoGain[1] := MakeBtn(PanelPlutoAGC, 'SLOW',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 1), 16, LeftPanelButtonWidth(LEFT_W, 4, 1),
|
LeftPanelButtonLeft(LEFT_W, 4, 1), 20, LeftPanelButtonWidth(LEFT_W, 4, 1),
|
||||||
BTN_SM, BtnPlutoGainClick);
|
BTN_SM, BtnPlutoGainClick);
|
||||||
BtnPlutoGain[1].Tag := 2;
|
BtnPlutoGain[1].Tag := 2;
|
||||||
BtnPlutoGain[2] := MakeBtn(PanelPlutoAGC, 'HYB',
|
BtnPlutoGain[2] := MakeBtn(PanelPlutoAGC, 'HYB',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 2), 16, LeftPanelButtonWidth(LEFT_W, 4, 2),
|
LeftPanelButtonLeft(LEFT_W, 4, 2), 20, LeftPanelButtonWidth(LEFT_W, 4, 2),
|
||||||
BTN_SM, BtnPlutoGainClick);
|
BTN_SM, BtnPlutoGainClick);
|
||||||
BtnPlutoGain[2].Tag := 3;
|
BtnPlutoGain[2].Tag := 3;
|
||||||
BtnPlutoGain[3] := MakeBtn(PanelPlutoAGC, 'MAN',
|
BtnPlutoGain[3] := MakeBtn(PanelPlutoAGC, 'MAN',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 3), 16, LeftPanelButtonWidth(LEFT_W, 4, 3),
|
LeftPanelButtonLeft(LEFT_W, 4, 3), 20, LeftPanelButtonWidth(LEFT_W, 4, 3),
|
||||||
BTN_SM, BtnPlutoGainClick);
|
BTN_SM, BtnPlutoGainClick);
|
||||||
BtnPlutoGain[3].Tag := 0;
|
BtnPlutoGain[3].Tag := 0;
|
||||||
// Manual gain slider.
|
// Manual gain slider.
|
||||||
MakeLbl(PanelPlutoAGC, 'GAIN', 4, 44);
|
MakeLbl(PanelPlutoAGC, 'GAIN', 4, 44);
|
||||||
TrkRxGain := TFlatSlider.Create(Self);
|
TrkRxGain := TFlatSlider.Create(Self);
|
||||||
TrkRxGain.Parent := PanelPlutoAGC; TrkRxGain.Left := 56; TrkRxGain.Top := 40;
|
TrkRxGain.Parent := PanelPlutoAGC; TrkRxGain.Left := 56; TrkRxGain.Top := 44;
|
||||||
TrkRxGain.Width := LEFT_W - 96; TrkRxGain.Height := 16;
|
TrkRxGain.Width := LEFT_W - 96; TrkRxGain.Height := 16;
|
||||||
TrkRxGain.Min := 0; TrkRxGain.Max := 73; // AD936x hardwaregain dB
|
TrkRxGain.Min := 0; TrkRxGain.Max := 73; // AD936x hardwaregain dB
|
||||||
TrkRxGain.Position := FController.FRxGainDb;
|
TrkRxGain.Position := FController.FRxGainDb;
|
||||||
@@ -2351,8 +2350,8 @@ begin
|
|||||||
LblRxGain.Parent := PanelPlutoAGC;
|
LblRxGain.Parent := PanelPlutoAGC;
|
||||||
LblRxGain.Left := LEFT_W - 38; LblRxGain.Top := 44;
|
LblRxGain.Left := LEFT_W - 38; LblRxGain.Top := 44;
|
||||||
LblRxGain.Caption := Format('%ddB', [FController.FRxGainDb]);
|
LblRxGain.Caption := Format('%ddB', [FController.FRxGainDb]);
|
||||||
LblRxGain.Font.Color := CLR_TEXT; LblRxGain.Font.Name := 'Courier New';
|
LblRxGain.Font.Color := CLR_TEXT;
|
||||||
LblRxGain.Font.Size := 7;
|
LblRxGain.Font.Size := 8;
|
||||||
// НЕ Inc(Y): панель скрыта и наложена на позицию Bands; LayoutLeftPanel сдвинет.
|
// НЕ Inc(Y): панель скрыта и наложена на позицию Bands; LayoutLeftPanel сдвинет.
|
||||||
|
|
||||||
// Band selector. Высота резервирует 2 дополнительных ряда под XVTR-кнопки
|
// Band selector. Высота резервирует 2 дополнительных ряда под XVTR-кнопки
|
||||||
@@ -2367,7 +2366,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
B := MakeBtn(PanelBands, BAND_NAMES[i],
|
B := MakeBtn(PanelBands, BAND_NAMES[i],
|
||||||
LeftPanelButtonLeft(LEFT_W, 6, i mod 6),
|
LeftPanelButtonLeft(LEFT_W, 6, i mod 6),
|
||||||
16 + (i div 6) * 27,
|
20 + (i div 6) * 27,
|
||||||
LeftPanelButtonWidth(LEFT_W, 6, i mod 6),
|
LeftPanelButtonWidth(LEFT_W, 6, i mod 6),
|
||||||
BTN_SM, BtnBandClick);
|
BTN_SM, BtnBandClick);
|
||||||
B.Tag := i;
|
B.Tag := i;
|
||||||
@@ -2391,7 +2390,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
B := MakeBtn(PanelMode, MODE_NAMES[i],
|
B := MakeBtn(PanelMode, MODE_NAMES[i],
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, i mod 4),
|
LeftPanelButtonLeft(LEFT_W, 4, i mod 4),
|
||||||
16 + (i div 4) * 27,
|
20 + (i div 4) * 27,
|
||||||
LeftPanelButtonWidth(LEFT_W, 4, i mod 4),
|
LeftPanelButtonWidth(LEFT_W, 4, i mod 4),
|
||||||
BTN_SM, BtnModeClick);
|
BTN_SM, BtnModeClick);
|
||||||
B.Tag := i;
|
B.Tag := i;
|
||||||
@@ -2412,7 +2411,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
B := MakeBtn(PanelFilter, '---',
|
B := MakeBtn(PanelFilter, '---',
|
||||||
LeftPanelButtonLeft(LEFT_W, FILT_GRID_COLS, i mod FILT_GRID_COLS),
|
LeftPanelButtonLeft(LEFT_W, FILT_GRID_COLS, i mod FILT_GRID_COLS),
|
||||||
16 + (i div FILT_GRID_COLS) * 27,
|
20 + (i div FILT_GRID_COLS) * 27,
|
||||||
LeftPanelButtonWidth(LEFT_W, FILT_GRID_COLS, i mod FILT_GRID_COLS),
|
LeftPanelButtonWidth(LEFT_W, FILT_GRID_COLS, i mod FILT_GRID_COLS),
|
||||||
BTN_SM, BtnFilterClick);
|
BTN_SM, BtnFilterClick);
|
||||||
B.Tag := i;
|
B.Tag := i;
|
||||||
@@ -2448,7 +2447,6 @@ begin
|
|||||||
LblRawDev.Alignment := taRightJustify;
|
LblRawDev.Alignment := taRightJustify;
|
||||||
LblRawDev.Caption := Format('%.2f k', [FController.FRawFMDeviation / 1000.0]);
|
LblRawDev.Caption := Format('%.2f k', [FController.FRawFMDeviation / 1000.0]);
|
||||||
LblRawDev.Font.Color := CLR_TEXT;
|
LblRawDev.Font.Color := CLR_TEXT;
|
||||||
LblRawDev.Font.Name := 'Courier New';
|
|
||||||
LblRawDev.Font.Size := 8;
|
LblRawDev.Font.Size := 8;
|
||||||
|
|
||||||
// FM Squelch panel (visible only in FM mode, above CTCSS)
|
// FM Squelch panel (visible only in FM mode, above CTCSS)
|
||||||
@@ -2460,15 +2458,15 @@ begin
|
|||||||
MakeLbl(PanelFMSQ, 'SQL', 4, 2);
|
MakeLbl(PanelFMSQ, 'SQL', 4, 2);
|
||||||
W := LeftPanelButtonWidth(LEFT_W, 4, 0);
|
W := LeftPanelButtonWidth(LEFT_W, 4, 0);
|
||||||
BtnFMSQ := MakeBtn(PanelFMSQ, 'SQL',
|
BtnFMSQ := MakeBtn(PanelFMSQ, 'SQL',
|
||||||
LeftPanelButtonLeft(LEFT_W, 4, 0), 16,
|
LeftPanelButtonLeft(LEFT_W, 4, 0), 20,
|
||||||
W, BTN_SM, BtnFMSQClick);
|
W, BTN_SM, BtnFMSQClick);
|
||||||
StyleButton(BtnFMSQ, False);
|
StyleButton(BtnFMSQ, False);
|
||||||
// Slider: vertically centred with button text (button top=16, h=24 → center=28)
|
// Slider vertically centred with the button row.
|
||||||
// Reserve 28px on the right for the numeric label
|
// Reserve 28px on the right for the numeric label
|
||||||
TrkFMSQ := TFlatSlider.Create(Self);
|
TrkFMSQ := TFlatSlider.Create(Self);
|
||||||
TrkFMSQ.Parent := PanelFMSQ;
|
TrkFMSQ.Parent := PanelFMSQ;
|
||||||
TrkFMSQ.Left := BtnFMSQ.Left + BtnFMSQ.Width + 3;
|
TrkFMSQ.Left := BtnFMSQ.Left + BtnFMSQ.Width + 3;
|
||||||
TrkFMSQ.Top := 21; // 28 - 14/2 = 21
|
TrkFMSQ.Top := 25;
|
||||||
TrkFMSQ.Width := LEFT_W - TrkFMSQ.Left - 30 - 4; // leave 30px for label + margins
|
TrkFMSQ.Width := LEFT_W - TrkFMSQ.Left - 30 - 4; // leave 30px for label + margins
|
||||||
TrkFMSQ.Height := 14;
|
TrkFMSQ.Height := 14;
|
||||||
TrkFMSQ.Min := 0; TrkFMSQ.Max := 100;
|
TrkFMSQ.Min := 0; TrkFMSQ.Max := 100;
|
||||||
@@ -2478,11 +2476,10 @@ begin
|
|||||||
LblFMSQ := TLabel.Create(Self);
|
LblFMSQ := TLabel.Create(Self);
|
||||||
LblFMSQ.Parent := PanelFMSQ;
|
LblFMSQ.Parent := PanelFMSQ;
|
||||||
LblFMSQ.Left := TrkFMSQ.Left + TrkFMSQ.Width + 3;
|
LblFMSQ.Left := TrkFMSQ.Left + TrkFMSQ.Width + 3;
|
||||||
LblFMSQ.Top := 21;
|
LblFMSQ.Top := 23;
|
||||||
LblFMSQ.Width := 26;
|
LblFMSQ.Width := 26;
|
||||||
LblFMSQ.Caption := IntToStr(FController.FFMSQLevel);
|
LblFMSQ.Caption := IntToStr(FController.FFMSQLevel);
|
||||||
LblFMSQ.Font.Color := CLR_TEXT;
|
LblFMSQ.Font.Color := CLR_TEXT;
|
||||||
LblFMSQ.Font.Name := 'Courier New';
|
|
||||||
LblFMSQ.Font.Size := 8;
|
LblFMSQ.Font.Size := 8;
|
||||||
|
|
||||||
// FM CTCSS panel (visible only when FM mode is active)
|
// FM CTCSS panel (visible only when FM mode is active)
|
||||||
@@ -2493,12 +2490,12 @@ begin
|
|||||||
PanelFMCTCSS.Visible := False;
|
PanelFMCTCSS.Visible := False;
|
||||||
MakeLbl(PanelFMCTCSS, 'CTCSS', 4, 2);
|
MakeLbl(PanelFMCTCSS, 'CTCSS', 4, 2);
|
||||||
BtnFMCTCSS := MakeBtn(PanelFMCTCSS, 'CTCSS',
|
BtnFMCTCSS := MakeBtn(PanelFMCTCSS, 'CTCSS',
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 0), 16,
|
LeftPanelButtonLeft(LEFT_W, 3, 0), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 3, 0),
|
LeftPanelButtonWidth(LEFT_W, 3, 0),
|
||||||
BTN_H, BtnFMCTCSSClick);
|
BTN_H, BtnFMCTCSSClick);
|
||||||
StyleButton(BtnFMCTCSS, False);
|
StyleButton(BtnFMCTCSS, False);
|
||||||
BtnFMCTCSSTone := MakeBtn(PanelFMCTCSS, CTCSS_NAMES[0],
|
BtnFMCTCSSTone := MakeBtn(PanelFMCTCSS, CTCSS_NAMES[0],
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 1), 16,
|
LeftPanelButtonLeft(LEFT_W, 3, 1), 20,
|
||||||
LEFT_W - LEFT_PANEL_BTN_PAD -
|
LEFT_W - LEFT_PANEL_BTN_PAD -
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 1),
|
LeftPanelButtonLeft(LEFT_W, 3, 1),
|
||||||
BTN_H, BtnFMCTCSSToneClick);
|
BTN_H, BtnFMCTCSSToneClick);
|
||||||
@@ -2518,12 +2515,12 @@ begin
|
|||||||
PanelFMStep.Visible := False;
|
PanelFMStep.Visible := False;
|
||||||
MakeLbl(PanelFMStep, 'STEP', 4, 2);
|
MakeLbl(PanelFMStep, 'STEP', 4, 2);
|
||||||
BtnFMStep := MakeBtn(PanelFMStep, 'STEP',
|
BtnFMStep := MakeBtn(PanelFMStep, 'STEP',
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 0), 16,
|
LeftPanelButtonLeft(LEFT_W, 3, 0), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 3, 0),
|
LeftPanelButtonWidth(LEFT_W, 3, 0),
|
||||||
BTN_H, BtnFMStepClick);
|
BTN_H, BtnFMStepClick);
|
||||||
StyleButton(BtnFMStep, FController.FFMStepOn);
|
StyleButton(BtnFMStep, FController.FFMStepOn);
|
||||||
BtnFMStepSel := MakeBtn(PanelFMStep, FM_STEP_NAMES[FController.FFMStepIdx],
|
BtnFMStepSel := MakeBtn(PanelFMStep, FM_STEP_NAMES[FController.FFMStepIdx],
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 1), 16,
|
LeftPanelButtonLeft(LEFT_W, 3, 1), 20,
|
||||||
LEFT_W - LEFT_PANEL_BTN_PAD -
|
LEFT_W - LEFT_PANEL_BTN_PAD -
|
||||||
LeftPanelButtonLeft(LEFT_W, 3, 1),
|
LeftPanelButtonLeft(LEFT_W, 3, 1),
|
||||||
BTN_H, BtnFMStepSelClick);
|
BTN_H, BtnFMStepSelClick);
|
||||||
@@ -2543,18 +2540,18 @@ begin
|
|||||||
PanelFMRpt.Visible := False;
|
PanelFMRpt.Visible := False;
|
||||||
MakeLbl(PanelFMRpt, 'RPT', 4, 2);
|
MakeLbl(PanelFMRpt, 'RPT', 4, 2);
|
||||||
BtnFMRptMinus := MakeBtn(PanelFMRpt, '-',
|
BtnFMRptMinus := MakeBtn(PanelFMRpt, '-',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 0), 16,
|
LeftPanelButtonLeft(LEFT_W, 5, 0), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 0), BTN_H, BtnFMRptMinusClick);
|
LeftPanelButtonWidth(LEFT_W, 5, 0), BTN_H, BtnFMRptMinusClick);
|
||||||
StyleButton(BtnFMRptMinus, False);
|
StyleButton(BtnFMRptMinus, False);
|
||||||
BtnFMRptPlus := MakeBtn(PanelFMRpt, '+',
|
BtnFMRptPlus := MakeBtn(PanelFMRpt, '+',
|
||||||
LeftPanelButtonLeft(LEFT_W, 5, 4), 16,
|
LeftPanelButtonLeft(LEFT_W, 5, 4), 20,
|
||||||
LeftPanelButtonWidth(LEFT_W, 5, 4), BTN_H, BtnFMRptPlusClick);
|
LeftPanelButtonWidth(LEFT_W, 5, 4), BTN_H, BtnFMRptPlusClick);
|
||||||
StyleButton(BtnFMRptPlus, False);
|
StyleButton(BtnFMRptPlus, False);
|
||||||
W := LeftPanelButtonLeft(LEFT_W, 5, 1);
|
W := LeftPanelButtonLeft(LEFT_W, 5, 1);
|
||||||
EdFMRptOffset := TFlatEdit.Create(Self);
|
EdFMRptOffset := TFlatEdit.Create(Self);
|
||||||
EdFMRptOffset.Parent := PanelFMRpt;
|
EdFMRptOffset.Parent := PanelFMRpt;
|
||||||
EdFMRptOffset.Left := W;
|
EdFMRptOffset.Left := W;
|
||||||
EdFMRptOffset.Top := 18;
|
EdFMRptOffset.Top := 22;
|
||||||
EdFMRptOffset.Width := LeftPanelButtonLeft(LEFT_W, 5, 4) - W - LEFT_PANEL_BTN_GAP;
|
EdFMRptOffset.Width := LeftPanelButtonLeft(LEFT_W, 5, 4) - W - LEFT_PANEL_BTN_GAP;
|
||||||
EdFMRptOffset.Height := BTN_H - 4;
|
EdFMRptOffset.Height := BTN_H - 4;
|
||||||
EdFMRptOffset.Text := RptFormatOffset(FController.FFMRptOffsetHz);
|
EdFMRptOffset.Text := RptFormatOffset(FController.FFMRptOffsetHz);
|
||||||
@@ -3159,6 +3156,15 @@ procedure TMainForm.ApplyDarkTheme;
|
|||||||
var T: TAppTheme; i: Integer;
|
var T: TAppTheme; i: Integer;
|
||||||
procedure DP(P: TPanel);
|
procedure DP(P: TPanel);
|
||||||
begin P.Color := T.Panel; P.Font.Color := T.Text; end;
|
begin P.Color := T.Panel; P.Font.Color := T.Text; end;
|
||||||
|
procedure DPL(P: TPanel);
|
||||||
|
var
|
||||||
|
J: Integer;
|
||||||
|
begin
|
||||||
|
if P = nil then Exit;
|
||||||
|
for J := 0 to P.ControlCount - 1 do
|
||||||
|
if P.Controls[J] is TLabel then
|
||||||
|
TLabel(P.Controls[J]).Font.Color := T.TextDim;
|
||||||
|
end;
|
||||||
procedure DL(L: TLabel; Dim: Boolean = True);
|
procedure DL(L: TLabel; Dim: Boolean = True);
|
||||||
begin if Dim then L.Font.Color := T.TextDim else L.Font.Color := T.Text; end;
|
begin if Dim then L.Font.Color := T.TextDim else L.Font.Color := T.Text; end;
|
||||||
procedure DS(S: TFlatSlider);
|
procedure DS(S: TFlatSlider);
|
||||||
@@ -3177,6 +3183,7 @@ begin
|
|||||||
DP(PanelTopVfoGroup); DP(PanelTopVfoA); DP(PanelTopVfoB);
|
DP(PanelTopVfoGroup); DP(PanelTopVfoA); DP(PanelTopVfoB);
|
||||||
DP(PanelVfoA); DP(PanelVfoB); DP(PanelVfoButtons);
|
DP(PanelVfoA); DP(PanelVfoB); DP(PanelVfoButtons);
|
||||||
DP(PanelBands); DP(PanelMode); DP(PanelFilter);
|
DP(PanelBands); DP(PanelMode); DP(PanelFilter);
|
||||||
|
if PanelPlutoAGC <> nil then DP(PanelPlutoAGC);
|
||||||
if PanelFMSQ <> nil then DP(PanelFMSQ);
|
if PanelFMSQ <> nil then DP(PanelFMSQ);
|
||||||
if PanelRawDev <> nil then DP(PanelRawDev);
|
if PanelRawDev <> nil then DP(PanelRawDev);
|
||||||
if PanelFMCTCSS <> nil then DP(PanelFMCTCSS);
|
if PanelFMCTCSS <> nil then DP(PanelFMCTCSS);
|
||||||
@@ -3186,17 +3193,30 @@ begin
|
|||||||
DP(PanelRXBlock); DP(PanelAGC); DP(PanelTX);
|
DP(PanelRXBlock); DP(PanelAGC); DP(PanelTX);
|
||||||
DP(PanelRight);
|
DP(PanelRight);
|
||||||
|
|
||||||
if PbSpectrum is TPaintBox then
|
|
||||||
TPaintBox(PbSpectrum).Color := T.BG;
|
|
||||||
if PbWaterfall is TPaintBox then
|
|
||||||
TPaintBox(PbWaterfall).Color := T.BG;
|
|
||||||
if PanelSMeterRight <> nil then PanelSMeterRight.Color := T.Panel;
|
if PanelSMeterRight <> nil then PanelSMeterRight.Color := T.Panel;
|
||||||
if PbSMeterRight <> nil then PbSMeterRight.Color := T.Panel;
|
if PbSMeterRight <> nil then PbSMeterRight.Color := T.Panel;
|
||||||
ApplyStatusTheme(T);
|
ApplyStatusTheme(T);
|
||||||
|
|
||||||
// Метки
|
// Заголовки групп и подписи строк.
|
||||||
|
DPL(PanelTX);
|
||||||
|
DPL(PanelRXBlock);
|
||||||
|
DPL(PanelAGC);
|
||||||
|
DPL(PanelPlutoAGC);
|
||||||
|
DPL(PanelBands);
|
||||||
|
DPL(PanelMode);
|
||||||
|
DPL(PanelFilter);
|
||||||
|
DPL(PanelRawDev);
|
||||||
|
DPL(PanelFMStep);
|
||||||
|
DPL(PanelFMSQ);
|
||||||
|
DPL(PanelFMCTCSS);
|
||||||
|
DPL(PanelFMRpt);
|
||||||
|
// Значения справа от ползунков ярче обычных подписей.
|
||||||
DL(LblAGCTop, False);
|
DL(LblAGCTop, False);
|
||||||
DL(LblDrv);
|
DL(LblDrv);
|
||||||
|
DL(LblDrvVal, False);
|
||||||
|
DL(LblAttVal, False);
|
||||||
|
DL(LblRxGain, False);
|
||||||
|
DL(LblRawDev, False);
|
||||||
if LblFMSQ <> nil then DL(LblFMSQ, False);
|
if LblFMSQ <> nil then DL(LblFMSQ, False);
|
||||||
|
|
||||||
// Кнопки тулбара
|
// Кнопки тулбара
|
||||||
@@ -3208,23 +3228,39 @@ begin
|
|||||||
BtnDiscover.ClrTextAct := T.TbDiscoverText;
|
BtnDiscover.ClrTextAct := T.TbDiscoverText;
|
||||||
BtnDiscover.Invalidate;
|
BtnDiscover.Invalidate;
|
||||||
BtnStartStop.ClrNorm := T.TbStartNorm;
|
BtnStartStop.ClrNorm := T.TbStartNorm;
|
||||||
|
BtnStartStop.ClrActive := T.TbStartNorm;
|
||||||
|
BtnStartStop.ClrHot := T.TbStartNorm;
|
||||||
BtnStartStop.ClrBorder := T.TbStartBorder;
|
BtnStartStop.ClrBorder := T.TbStartBorder;
|
||||||
BtnStartStop.ClrText := T.TbStartText;
|
BtnStartStop.ClrText := T.TbStartText;
|
||||||
|
BtnStartStop.ClrTextAct:= T.TbStartText;
|
||||||
BtnStartStop.Invalidate;
|
BtnStartStop.Invalidate;
|
||||||
|
StyleButton(BtnSettings, False);
|
||||||
|
|
||||||
// Обычные кнопки — все массивы
|
// Обычные кнопки — все массивы
|
||||||
for i := 0 to BAND_COUNT-1 do StyleButton(BtnBand[i], BtnBand[i].Active);
|
for i := 0 to BAND_COUNT-1 do StyleButton(BtnBand[i], BtnBand[i].Active);
|
||||||
|
for i := 0 to CFG_XVTR_COUNT - 1 do
|
||||||
|
if BtnXvtrBand[i] <> nil then
|
||||||
|
StyleButton(BtnXvtrBand[i], BtnXvtrBand[i].Active);
|
||||||
for i := 0 to MODE_COUNT-1 do StyleButton(BtnMode[i], BtnMode[i].Active);
|
for i := 0 to MODE_COUNT-1 do StyleButton(BtnMode[i], BtnMode[i].Active);
|
||||||
for i := 0 to FILT_SLOTS-1 do StyleButton(BtnFilter[i], BtnFilter[i].Active);
|
for i := 0 to FILT_SLOTS-1 do StyleButton(BtnFilter[i], BtnFilter[i].Active);
|
||||||
for i := 0 to 4 do StyleButton(BtnAGCMode[i],BtnAGCMode[i].Active);
|
for i := 0 to 4 do StyleButton(BtnAGCMode[i],BtnAGCMode[i].Active);
|
||||||
StyleButton(BtnCTun, BtnCTun.Active);
|
StyleButton(BtnCTun, BtnCTun.Active);
|
||||||
StyleButton(BtnDUP, BtnDUP.Active);
|
StyleButton(BtnDUP, BtnDUP.Active);
|
||||||
|
StyleButton(BtnPS, BtnPS.Active);
|
||||||
|
StyleButton(Btn2Ton, Btn2Ton.Active);
|
||||||
|
StyleButton(BtnRxMute, BtnRxMute.Active);
|
||||||
|
StyleButton(BtnBeacon, BtnBeacon.Active);
|
||||||
if BtnFMSQ <> nil then StyleButton(BtnFMSQ, BtnFMSQ.Active);
|
if BtnFMSQ <> nil then StyleButton(BtnFMSQ, BtnFMSQ.Active);
|
||||||
if TrkFMSQ <> nil then DS(TrkFMSQ);
|
if TrkFMSQ <> nil then DS(TrkFMSQ);
|
||||||
if BtnFMCTCSS <> nil then StyleButton(BtnFMCTCSS, BtnFMCTCSS.Active);
|
if BtnFMCTCSS <> nil then StyleButton(BtnFMCTCSS, BtnFMCTCSS.Active);
|
||||||
if BtnFMCTCSSTone <> nil then StyleButton(BtnFMCTCSSTone, False);
|
if BtnFMCTCSSTone <> nil then StyleButton(BtnFMCTCSSTone, False);
|
||||||
|
if BtnFMStep <> nil then StyleButton(BtnFMStep, BtnFMStep.Active);
|
||||||
|
if BtnFMStepSel <> nil then StyleButton(BtnFMStepSel, False);
|
||||||
if BtnFMRptMinus <> nil then StyleButton(BtnFMRptMinus, BtnFMRptMinus.Active);
|
if BtnFMRptMinus <> nil then StyleButton(BtnFMRptMinus, BtnFMRptMinus.Active);
|
||||||
if BtnFMRptPlus <> nil then StyleButton(BtnFMRptPlus, BtnFMRptPlus.Active);
|
if BtnFMRptPlus <> nil then StyleButton(BtnFMRptPlus, BtnFMRptPlus.Active);
|
||||||
|
for i := 0 to 3 do
|
||||||
|
if BtnPlutoGain[i] <> nil then
|
||||||
|
StyleButton(BtnPlutoGain[i], BtnPlutoGain[i].Active);
|
||||||
if FCTCSSDropDown <> nil then FCTCSSDropDown.ApplyStyle(StyleButton, T.Panel);
|
if FCTCSSDropDown <> nil then FCTCSSDropDown.ApplyStyle(StyleButton, T.Panel);
|
||||||
if FStepDropDown <> nil then FStepDropDown.ApplyStyle(StyleButton, T.Panel);
|
if FStepDropDown <> nil then FStepDropDown.ApplyStyle(StyleButton, T.Panel);
|
||||||
if BtnZoomIn <> nil then StyleButton(BtnZoomIn, False);
|
if BtnZoomIn <> nil then StyleButton(BtnZoomIn, False);
|
||||||
@@ -3234,6 +3270,15 @@ begin
|
|||||||
for i := 0 to MAX_PANS - 1 do
|
for i := 0 to MAX_PANS - 1 do
|
||||||
if FPans[i] <> nil then
|
if FPans[i] <> nil then
|
||||||
begin
|
begin
|
||||||
|
FPans[i].View.SetTheme(T);
|
||||||
|
if FPans[i].PbSpectrum is TPaintBox then
|
||||||
|
TPaintBox(FPans[i].PbSpectrum).Color := T.BG;
|
||||||
|
if FPans[i].PbWaterfall is TPaintBox then
|
||||||
|
TPaintBox(FPans[i].PbWaterfall).Color := T.BG;
|
||||||
|
if FPans[i].Splitter <> nil then FPans[i].Splitter.Color := T.Border;
|
||||||
|
if FPans[i].BtnZoomIn <> nil then StyleButton(FPans[i].BtnZoomIn, False);
|
||||||
|
if FPans[i].BtnZoomDef <> nil then StyleButton(FPans[i].BtnZoomDef, False);
|
||||||
|
if FPans[i].BtnZoomOut <> nil then StyleButton(FPans[i].BtnZoomOut, False);
|
||||||
if FPans[i].BtnAddPan <> nil then StyleButton(FPans[i].BtnAddPan, False);
|
if FPans[i].BtnAddPan <> nil then StyleButton(FPans[i].BtnAddPan, False);
|
||||||
if FPans[i].BtnGrid <> nil then StyleButton(FPans[i].BtnGrid, False);
|
if FPans[i].BtnGrid <> nil then StyleButton(FPans[i].BtnGrid, False);
|
||||||
if FPans[i].BtnPopPan <> nil then StyleButton(FPans[i].BtnPopPan, False);
|
if FPans[i].BtnPopPan <> nil then StyleButton(FPans[i].BtnPopPan, False);
|
||||||
@@ -3250,6 +3295,8 @@ begin
|
|||||||
if FPans[i].ZoomBar <> nil then FPans[i].ZoomBar.SetTheme(T);
|
if FPans[i].ZoomBar <> nil then FPans[i].ZoomBar.SetTheme(T);
|
||||||
if FPans[i].PbPanZoom <> nil then FPans[i].PbPanZoom.Color := T.SliderBG;
|
if FPans[i].PbPanZoom <> nil then FPans[i].PbPanZoom.Color := T.SliderBG;
|
||||||
end;
|
end;
|
||||||
|
// Тема инвалидирует кэши и GL-текстуры сама; историю водопада сохраняем.
|
||||||
|
MarkPanDisplayDirty(FPans[i], False);
|
||||||
end;
|
end;
|
||||||
if FPanZoomBar <> nil then
|
if FPanZoomBar <> nil then
|
||||||
begin
|
begin
|
||||||
@@ -3275,9 +3322,9 @@ begin
|
|||||||
|
|
||||||
// Ползунки
|
// Ползунки
|
||||||
DS(TrkAGC); DS(TrkVolume); DS(TrkDrive);
|
DS(TrkAGC); DS(TrkVolume); DS(TrkDrive);
|
||||||
|
DS(TrkAtt); DS(TrkRxGain); DS(TrkRawDev);
|
||||||
|
|
||||||
// Спектр
|
// Wideband не входит в стек обычных панов.
|
||||||
FSpecView.SetTheme(T);
|
|
||||||
if Assigned(FWidebandView) then FWidebandView.SetTheme(T);
|
if Assigned(FWidebandView) then FWidebandView.SetTheme(T);
|
||||||
|
|
||||||
// Флаги слайсов (оверлеи) — цвета кнопок из темы, как левая панель.
|
// Флаги слайсов (оверлеи) — цвета кнопок из темы, как левая панель.
|
||||||
@@ -3325,11 +3372,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.SetLightTheme(V: Boolean);
|
procedure TMainForm.SetLightTheme(V: Boolean);
|
||||||
|
var
|
||||||
|
T: TAppTheme;
|
||||||
begin
|
begin
|
||||||
if FLightTheme = V then Exit;
|
if FLightTheme = V then Exit;
|
||||||
FLightTheme := V;
|
FLightTheme := V;
|
||||||
FController.FLoadedGlobal.LightTheme := V; // зеркало в persist-буфер контроллера
|
FController.FLoadedGlobal.LightTheme := V; // зеркало в persist-буфер контроллера
|
||||||
ApplyDarkTheme;
|
ApplyDarkTheme;
|
||||||
|
T := CurrentAppTheme;
|
||||||
|
if FDeviceDialog <> nil then FDeviceDialog.SetTheme(T);
|
||||||
|
if FChannelsForm <> nil then TChannelsForm(FChannelsForm).ApplyTheme(T);
|
||||||
|
if FBeaconScopeForm <> nil then FBeaconScopeForm.ApplyTheme(T);
|
||||||
FController.FSettings.SaveTheme(V);
|
FController.FSettings.SaveTheme(V);
|
||||||
FController.FSettings.Save;
|
FController.FSettings.Save;
|
||||||
if (FSettingsForm <> nil) and TSettingsForm(FSettingsForm).Visible then
|
if (FSettingsForm <> nil) and TSettingsForm(FSettingsForm).Visible then
|
||||||
@@ -3348,7 +3401,6 @@ begin
|
|||||||
else B.ClrBorder := T.BtnBorderNorm;
|
else B.ClrBorder := T.BtnBorderNorm;
|
||||||
B.ClrText := T.BtnText;
|
B.ClrText := T.BtnText;
|
||||||
B.ClrTextAct := T.BtnTextActive;
|
B.ClrTextAct := T.BtnTextActive;
|
||||||
B.Font.Name := 'Courier New';
|
|
||||||
B.Font.Size := 8;
|
B.Font.Size := 8;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -3363,8 +3415,7 @@ begin
|
|||||||
B.ClrBorder := T.SpanBorder;
|
B.ClrBorder := T.SpanBorder;
|
||||||
B.ClrText := T.SpanText;
|
B.ClrText := T.SpanText;
|
||||||
B.ClrTextAct := T.SpanText;
|
B.ClrTextAct := T.SpanText;
|
||||||
B.Font.Name := 'Courier New';
|
B.Font.Size := 8;
|
||||||
B.Font.Size := 7;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.PositionSampleRateOverlay;
|
procedure TMainForm.PositionSampleRateOverlay;
|
||||||
@@ -4568,11 +4619,15 @@ end;
|
|||||||
procedure TMainForm.LayoutFilterButtons(PresetCount: Integer);
|
procedure TMainForm.LayoutFilterButtons(PresetCount: Integer);
|
||||||
var
|
var
|
||||||
i, Total, Cols, Rows, RowOf, ColOf, InRow: Integer;
|
i, Total, Cols, Rows, RowOf, ColOf, InRow: Integer;
|
||||||
|
HeaderH, RowStep, BottomPad: Integer;
|
||||||
begin
|
begin
|
||||||
Total := PresetCount + 2; // + VAR1/VAR2
|
Total := PresetCount + 2; // + VAR1/VAR2
|
||||||
if Total <= FILT_GRID_COLS then Cols := Total // FM/WFM: всё в один ряд
|
if Total <= FILT_GRID_COLS then Cols := Total // FM/WFM: всё в один ряд
|
||||||
else Cols := FILT_GRID_COLS;
|
else Cols := FILT_GRID_COLS;
|
||||||
Rows := (Total + Cols - 1) div Cols;
|
Rows := (Total + Cols - 1) div Cols;
|
||||||
|
HeaderH := PanelFilter.Scale96ToForm(20);
|
||||||
|
RowStep := PanelFilter.Scale96ToForm(27);
|
||||||
|
BottomPad := PanelFilter.Scale96ToForm(4);
|
||||||
for i := 0 to FILT_SLOTS - 1 do
|
for i := 0 to FILT_SLOTS - 1 do
|
||||||
begin
|
begin
|
||||||
if i < PresetCount then InRow := i // пресет на своём месте
|
if i < PresetCount then InRow := i // пресет на своём месте
|
||||||
@@ -4583,12 +4638,12 @@ begin
|
|||||||
ColOf := InRow mod Cols;
|
ColOf := InRow mod Cols;
|
||||||
BtnFilter[i].Left := LeftPanelButtonLeft(PanelFilter.Width, Cols, ColOf);
|
BtnFilter[i].Left := LeftPanelButtonLeft(PanelFilter.Width, Cols, ColOf);
|
||||||
BtnFilter[i].Width := LeftPanelButtonWidth(PanelFilter.Width, Cols, ColOf);
|
BtnFilter[i].Width := LeftPanelButtonWidth(PanelFilter.Width, Cols, ColOf);
|
||||||
BtnFilter[i].Top := 16 + RowOf * 27;
|
BtnFilter[i].Top := HeaderH + RowOf * RowStep;
|
||||||
BtnFilter[i].Caption := FController.FilterSlot(FController.FMode, i).Name;
|
BtnFilter[i].Caption := FController.FilterSlot(FController.FMode, i).Name;
|
||||||
BtnFilter[i].Visible := True;
|
BtnFilter[i].Visible := True;
|
||||||
StyleButton(BtnFilter[i], i = FController.FFilter);
|
StyleButton(BtnFilter[i], i = FController.FFilter);
|
||||||
end;
|
end;
|
||||||
PanelFilter.Height := 16 + Rows * 27 + 4;
|
PanelFilter.Height := HeaderH + Rows * RowStep + BottomPad;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.UpdateFilterButtons;
|
procedure TMainForm.UpdateFilterButtons;
|
||||||
@@ -4634,7 +4689,7 @@ begin
|
|||||||
|
|
||||||
// Non-FM: restore full 2-row height and 5-column layout, hide FM panels.
|
// Non-FM: restore full 2-row height and 5-column layout, hide FM panels.
|
||||||
// DMR reuses only the tuning STEP panel; SQL/CTCSS/repeater stay FM-only.
|
// DMR reuses only the tuning STEP panel; SQL/CTCSS/repeater stay FM-only.
|
||||||
PanelFilter.Height := 74;
|
PanelFilter.Height := PanelFilter.Scale96ToForm(74);
|
||||||
if PanelFMSQ <> nil then PanelFMSQ.Visible := False;
|
if PanelFMSQ <> nil then PanelFMSQ.Visible := False;
|
||||||
if PanelFMCTCSS <> nil then PanelFMCTCSS.Visible := False;
|
if PanelFMCTCSS <> nil then PanelFMCTCSS.Visible := False;
|
||||||
if PanelFMStep <> nil then
|
if PanelFMStep <> nil then
|
||||||
@@ -4691,7 +4746,7 @@ begin
|
|||||||
|
|
||||||
// Прочие режимы: смена режима возвращает заводской индекс фильтра (как было
|
// Прочие режимы: смена режима возвращает заводской индекс фильтра (как было
|
||||||
// до таблицы), кромки и подписи приезжают из таблицы контроллера.
|
// до таблицы), кромки и подписи приезжают из таблицы контроллера.
|
||||||
PanelFilter.Height := 74;
|
PanelFilter.Height := PanelFilter.Scale96ToForm(74);
|
||||||
DefIdx := FilterDefIdx(FController.FMode);
|
DefIdx := FilterDefIdx(FController.FMode);
|
||||||
FController.SelectFilterSlotState(DefIdx);
|
FController.SelectFilterSlotState(DefIdx);
|
||||||
LayoutFilterButtons(FILT_COUNT);
|
LayoutFilterButtons(FILT_COUNT);
|
||||||
@@ -4740,7 +4795,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
if FBeaconScopeForm = nil then
|
if FBeaconScopeForm = nil then
|
||||||
FBeaconScopeForm := TBeaconScopeForm.CreateWith(Self, FController);
|
FBeaconScopeForm := TBeaconScopeForm.CreateWith(Self, FController);
|
||||||
FBeaconScopeForm.ApplyTheme(DarkTheme);
|
FBeaconScopeForm.ApplyTheme(CurrentAppTheme);
|
||||||
FBeaconScopeForm.Show;
|
FBeaconScopeForm.Show;
|
||||||
end;
|
end;
|
||||||
UpdateBeaconButton;
|
UpdateBeaconButton;
|
||||||
@@ -4755,7 +4810,7 @@ begin
|
|||||||
if not FController.BeaconLockEnabled then Exit;
|
if not FController.BeaconLockEnabled then Exit;
|
||||||
if FBeaconScopeForm = nil then
|
if FBeaconScopeForm = nil then
|
||||||
FBeaconScopeForm := TBeaconScopeForm.CreateWith(Self, FController);
|
FBeaconScopeForm := TBeaconScopeForm.CreateWith(Self, FController);
|
||||||
FBeaconScopeForm.ApplyTheme(DarkTheme);
|
FBeaconScopeForm.ApplyTheme(CurrentAppTheme);
|
||||||
if FBeaconScopeForm.Visible then FBeaconScopeForm.Hide
|
if FBeaconScopeForm.Visible then FBeaconScopeForm.Hide
|
||||||
else FBeaconScopeForm.Show;
|
else FBeaconScopeForm.Show;
|
||||||
end;
|
end;
|
||||||
@@ -5712,7 +5767,7 @@ begin
|
|||||||
Def.Power := 100;
|
Def.Power := 100;
|
||||||
Def.Name := '';
|
Def.Name := '';
|
||||||
TChannelsForm(FChannelsForm).SetCurrentDefaults(Def);
|
TChannelsForm(FChannelsForm).SetCurrentDefaults(Def);
|
||||||
TChannelsForm(FChannelsForm).ApplyTheme(DarkTheme);
|
TChannelsForm(FChannelsForm).ApplyTheme(CurrentAppTheme);
|
||||||
TChannelsForm(FChannelsForm).Show;
|
TChannelsForm(FChannelsForm).Show;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -8239,7 +8294,7 @@ end;
|
|||||||
procedure TMainForm.RebuildXvtrButtons;
|
procedure TMainForm.RebuildXvtrButtons;
|
||||||
var
|
var
|
||||||
i, Pos, XvtrRows: Integer;
|
i, Pos, XvtrRows: Integer;
|
||||||
BtnH, RowH, MaxBottom: Integer;
|
BtnH, RowH, MaxBottom, RowGap, TopGap, BottomPad: Integer;
|
||||||
B: TFlatButton;
|
B: TFlatButton;
|
||||||
Cap: string;
|
Cap: string;
|
||||||
begin
|
begin
|
||||||
@@ -8264,7 +8319,10 @@ begin
|
|||||||
BtnH := BtnBand[i].Height;
|
BtnH := BtnBand[i].Height;
|
||||||
end;
|
end;
|
||||||
if BtnH = 0 then BtnH := DpiScale(24);
|
if BtnH = 0 then BtnH := DpiScale(24);
|
||||||
RowH := BtnH + 3; // шаг ряда: высота кнопки + 3px зазор (как 27=24+3 при 1x)
|
RowGap := PanelBands.Scale96ToForm(3);
|
||||||
|
TopGap := PanelBands.Scale96ToForm(4);
|
||||||
|
BottomPad := PanelBands.Scale96ToForm(6);
|
||||||
|
RowH := BtnH + RowGap;
|
||||||
|
|
||||||
Pos := 0; // позиция среди enabled слотов
|
Pos := 0; // позиция среди enabled слотов
|
||||||
for i := 0 to CFG_XVTR_COUNT - 1 do
|
for i := 0 to CFG_XVTR_COUNT - 1 do
|
||||||
@@ -8277,7 +8335,7 @@ begin
|
|||||||
B.Parent := PanelBands;
|
B.Parent := PanelBands;
|
||||||
B.Caption := Cap;
|
B.Caption := Cap;
|
||||||
B.Left := LeftPanelButtonLeft(PanelBands.Width, 6, Pos mod 6);
|
B.Left := LeftPanelButtonLeft(PanelBands.Width, 6, Pos mod 6);
|
||||||
B.Top := MaxBottom + 4 + (Pos div 6) * RowH;
|
B.Top := MaxBottom + TopGap + (Pos div 6) * RowH;
|
||||||
B.Width := LeftPanelButtonWidth(PanelBands.Width, 6, Pos mod 6);
|
B.Width := LeftPanelButtonWidth(PanelBands.Width, 6, Pos mod 6);
|
||||||
B.Height := BtnH;
|
B.Height := BtnH;
|
||||||
B.OnClick := BtnXvtrBandClick;
|
B.OnClick := BtnXvtrBandClick;
|
||||||
@@ -8291,9 +8349,9 @@ begin
|
|||||||
else if Pos <= 6 then XvtrRows := 1
|
else if Pos <= 6 then XvtrRows := 1
|
||||||
else XvtrRows := 2;
|
else XvtrRows := 2;
|
||||||
if XvtrRows = 0 then
|
if XvtrRows = 0 then
|
||||||
PanelBands.Height := MaxBottom + 6
|
PanelBands.Height := MaxBottom + BottomPad
|
||||||
else
|
else
|
||||||
PanelBands.Height := MaxBottom + 4 + XvtrRows * RowH + 6;
|
PanelBands.Height := MaxBottom + TopGap + XvtrRows * RowH + BottomPad;
|
||||||
RelayoutBelowBands;
|
RelayoutBelowBands;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user