ui(settings): align cards and spacing

This commit is contained in:
2026-08-04 21:02:15 +03:00
parent adf5c5016e
commit 9047dc586d
+86 -29
View File
@@ -42,6 +42,7 @@ const
TAG_RESPONSIVE_HALF_LEFT = 912; TAG_RESPONSIVE_HALF_LEFT = 912;
TAG_RESPONSIVE_HALF_RIGHT = 913; TAG_RESPONSIVE_HALF_RIGHT = 913;
TAG_RESPONSIVE_INSET = 914; TAG_RESPONSIVE_INSET = 914;
TAG_BOTTOM_SPACER = 915;
type type
// PA: MaxPower в Вт, BandCal[0..10] — калибровка 38.8..100.0 на диапазон // PA: MaxPower в Вт, BandCal[0..10] — калибровка 38.8..100.0 на диапазон
@@ -522,6 +523,8 @@ type
function MakeGroupPanel(AParent: TWinControl; const Cap: string; function MakeGroupPanel(AParent: TWinControl; const Cap: string;
ALeft, ATop, AW, AH: Integer): TPanel; ALeft, ATop, AW, AH: Integer): TPanel;
function MakeScrollPage: TScrollBox; function MakeScrollPage: TScrollBox;
procedure AddPageBottomSpace(APage: TScrollBox);
procedure UpdatePageBottomSpace(APage: TScrollBox);
procedure MakeNavSection(const Cap: string; ATop: Integer); procedure MakeNavSection(const Cap: string; ATop: Integer);
function MakeNavButton(const Cap: string; ATop: Integer): TFlatButton; function MakeNavButton(const Cap: string; ATop: Integer): TFlatButton;
@@ -694,6 +697,7 @@ const
SETTINGS_CARD_W = 760; SETTINGS_CARD_W = 760;
SETTINGS_CARD_MAX_W = 934; SETTINGS_CARD_MAX_W = 934;
SETTINGS_FOOTER_H = 52; SETTINGS_FOOTER_H = 52;
SETTINGS_BOTTOM_SPACE = 24;
// Первый пункт комбо аудио слайса = «как у приложения» (пустое имя в конфиге). // Первый пункт комбо аудио слайса = «как у приложения» (пустое имя в конфиге).
SLICE_DEV_DEFAULT = 'Default (app output)'; SLICE_DEV_DEFAULT = 'Default (app output)';
@@ -920,6 +924,42 @@ begin
Result.Visible := False; Result.Visible := False;
end; end;
procedure TSettingsForm.AddPageBottomSpace(APage: TScrollBox);
var
Spacer: TPanel;
begin
if APage = nil then Exit;
Spacer := TPanel.Create(Self);
Spacer.Parent := APage;
Spacer.Tag := TAG_BOTTOM_SPACER;
Spacer.BevelOuter := bvNone;
Spacer.Color := CLR_BG;
Spacer.Height := DpiScale(SETTINGS_BOTTOM_SPACE);
UpdatePageBottomSpace(APage);
end;
procedure TSettingsForm.UpdatePageBottomSpace(APage: TScrollBox);
var
i, ContentBottom: Integer;
Ctrl: TControl;
Spacer: TPanel;
begin
if APage = nil then Exit;
Spacer := nil;
ContentBottom := 0;
for i := 0 to APage.ControlCount - 1 do
begin
Ctrl := APage.Controls[i];
if Ctrl.Tag = TAG_BOTTOM_SPACER then
Spacer := TPanel(Ctrl)
else if Ctrl.Visible then
ContentBottom := Max(ContentBottom, Ctrl.Top + Ctrl.Height);
end;
if Spacer = nil then Exit;
Spacer.SetBounds(0, ContentBottom, Max(APage.ClientWidth, DpiScale(804)),
DpiScale(SETTINGS_BOTTOM_SPACE));
end;
procedure TSettingsForm.MakeNavSection(const Cap: string; ATop: Integer); procedure TSettingsForm.MakeNavSection(const Cap: string; ATop: Integer);
begin begin
with TLabel.Create(Self) do with TLabel.Create(Self) do
@@ -1056,6 +1096,15 @@ begin
BuildOCTab; BuildOCTab;
BuildQOTab; BuildQOTab;
// Страницы, заканчивающиеся карточкой, получают небольшой участок фона
// после последнего блока. Иначе при прокрутке блок визуально слипается
// с закреплённой нижней панелью Close.
AddPageBottomSpace(FPageSpectrum);
AddPageBottomSpace(FPageWaterfall);
AddPageBottomSpace(FPageCalib);
AddPageBottomSpace(FPageCAT);
AddPageBottomSpace(FPageOC);
FBtnClose := TFlatButton.Create(Self); FBtnClose := TFlatButton.Create(Self);
FBtnClose.Parent := FFooterPanel; FBtnClose.Parent := FFooterPanel;
FBtnClose.Caption := 'Close'; FBtnClose.Caption := 'Close';
@@ -1180,38 +1229,42 @@ procedure TSettingsForm.RelayoutResponsiveCards;
AsideWidth, FOCXvtrActGrp.Height); AsideWidth, FOCXvtrActGrp.Height);
end; end;
procedure ResizePage(APage: TScrollBox); procedure ResizePage(APage: TScrollBox; ACardWidth: Integer);
var
CardWidth: Integer;
begin begin
if (APage = nil) or (APage.ClientWidth <= 0) then Exit; if (APage = nil) or (APage.ClientWidth <= 0) then Exit;
CardWidth := APage.ClientWidth ResizeTree(APage, ACardWidth);
- DpiScale(2 * SETTINGS_MARGIN) - DpiScale(20);
CardWidth := EnsureRange(CardWidth, DpiScale(SETTINGS_CARD_W),
DpiScale(SETTINGS_CARD_MAX_W));
ResizeTree(APage, CardWidth);
if APage = FPageTransmit then if APage = FPageTransmit then
ResizeTransmit(CardWidth); ResizeTransmit(ACardWidth);
if APage = FPageOC then if APage = FPageOC then
ResizeOC(CardWidth); ResizeOC(ACardWidth);
UpdatePageBottomSpace(APage);
end; end;
var
CardWidth: Integer;
begin begin
if FContentPanel = nil then Exit; if FContentPanel = nil then Exit;
ResizePage(FPageAudio); // Ширина берётся от общего контейнера, а не от отдельной страницы:
ResizePage(FPageDisplay); // появившийся на длинной вкладке scrollbar не должен сужать её карточки.
ResizePage(FPageSpectrum); CardWidth := FContentPanel.ClientWidth
ResizePage(FPageWaterfall); - DpiScale(2 * SETTINGS_MARGIN) - DpiScale(20);
ResizePage(FPageTransmit); CardWidth := EnsureRange(CardWidth, DpiScale(SETTINGS_CARD_W),
ResizePage(FPagePA); DpiScale(SETTINGS_CARD_MAX_W));
ResizePage(FPageCalib);
ResizePage(FPageAdvanced); ResizePage(FPageAudio, CardWidth);
ResizePage(FPageCAT); ResizePage(FPageDisplay, CardWidth);
ResizePage(FPageSlices); ResizePage(FPageSpectrum, CardWidth);
ResizePage(FPageAlex); ResizePage(FPageWaterfall, CardWidth);
ResizePage(FPageXvtr); ResizePage(FPageTransmit, CardWidth);
ResizePage(FPageOC); ResizePage(FPagePA, CardWidth);
ResizePage(FPageQO); ResizePage(FPageCalib, CardWidth);
ResizePage(FPageAdvanced, CardWidth);
ResizePage(FPageCAT, CardWidth);
ResizePage(FPageSlices, CardWidth);
ResizePage(FPageAlex, CardWidth);
ResizePage(FPageXvtr, CardWidth);
ResizePage(FPageOC, CardWidth);
ResizePage(FPageQO, CardWidth);
end; end;
procedure TSettingsForm.NavClick(Sender: TObject); procedure TSettingsForm.NavClick(Sender: TObject);
@@ -2582,8 +2635,9 @@ begin
FBtnDispFromSM := TFlatButton.Create(Self); FBtnDispFromSM := TFlatButton.Create(Self);
FBtnDispFromSM.Parent := Grp; FBtnDispFromSM.Parent := Grp;
FBtnDispFromSM.Caption := '= S-meter'; FBtnDispFromSM.Caption := 'Copy all from S-meter';
FBtnDispFromSM.SetBounds(DpiScale(CAL_GRP_W - 130), DpiScale(24), DpiScale(112), DpiScale(BTN_H)); FBtnDispFromSM.SetBounds(DpiScale(CAL_PAD), DpiScale(54),
DpiScale(190), DpiScale(BTN_H));
FBtnDispFromSM.OnClick := OnCalDispFromSMClick; FBtnDispFromSM.OnClick := OnCalDispFromSMClick;
FBtnDispFromSM.ClrNorm := CLR_PANEL; FBtnDispFromSM.ClrNorm := CLR_PANEL;
FBtnDispFromSM.ClrBorder := TColor($00404040); FBtnDispFromSM.ClrBorder := TColor($00404040);
@@ -2592,7 +2646,8 @@ begin
FBtnDispFromSM.ClrText := CLR_TEXT; FBtnDispFromSM.ClrText := CLR_TEXT;
FBtnDispFromSM.ClrTextAct := CLR_ACCENT; FBtnDispFromSM.ClrTextAct := CLR_ACCENT;
FBtnDispFromSM.Font.Size := 9; FBtnDispFromSM.Font.Size := 9;
FBtnDispFromSM.Hint := 'Copy the S-meter offsets into this table'; FBtnDispFromSM.Hint :=
'Copy all band and transverter offsets from the S-meter table above';
FBtnDispFromSM.ShowHint := True; FBtnDispFromSM.ShowHint := True;
for i := 0 to CFG_BAND_COUNT - 1 do for i := 0 to CFG_BAND_COUNT - 1 do
@@ -2686,7 +2741,7 @@ begin
HSM := LayoutCalOffsets(FLblSMBand, FEdSMBand, FLblSMXvtrHdr, HSM := LayoutCalOffsets(FLblSMBand, FEdSMBand, FLblSMXvtrHdr,
FLblSMXvtr, FEdSMXvtr, 52); FLblSMXvtr, FEdSMXvtr, 52);
HDisp := LayoutCalOffsets(FLblDispBand, FEdDispBand, FLblDispXvtrHdr, HDisp := LayoutCalOffsets(FLblDispBand, FEdDispBand, FLblDispXvtrHdr,
FLblDispXvtr, FEdDispXvtr, 52); FLblDispXvtr, FEdDispXvtr, 90);
// ---- вертикальная укладка групп ---- // ---- вертикальная укладка групп ----
GTop := 86; GTop := 86;
@@ -2704,6 +2759,7 @@ begin
FCalGrpDisp.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(HDisp)); FCalGrpDisp.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(HDisp));
GTop := GTop + HDisp + 14; GTop := GTop + HDisp + 14;
FCalGrpFreq.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(CAL_GRP2_H)); FCalGrpFreq.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(CAL_GRP2_H));
UpdatePageBottomSpace(FPageCalib);
end; end;
function TSettingsForm.LayoutCalOffsets(const BandLbl: array of TLabel; function TSettingsForm.LayoutCalOffsets(const BandLbl: array of TLabel;
@@ -3087,7 +3143,8 @@ procedure TSettingsForm.ApplyTheme(const T: TAppTheme);
begin begin
if TPanel(Ctrl).Height = 1 then if TPanel(Ctrl).Height = 1 then
TPanel(Ctrl).Color := T.Border TPanel(Ctrl).Color := T.Border
else if TPanel(Ctrl).Tag = TAG_PAGE_BG then else if (TPanel(Ctrl).Tag = TAG_PAGE_BG) or
(TPanel(Ctrl).Tag = TAG_BOTTOM_SPACER) then
TPanel(Ctrl).Color := T.BG // подложка подвкладки, не группа TPanel(Ctrl).Color := T.BG // подложка подвкладки, не группа
else else
TPanel(Ctrl).Color := T.Panel; TPanel(Ctrl).Color := T.Panel;