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