unit spkt_Const; {$mode delphi} (******************************************************************************* * * * File: spkt_Const.pas * * Description: Constants for calculation of toolbar geometry * * Copyright: (c) 2009 by Spook. * * License: Modified LGPL (with linking exception, like Lazarus LCL) * ' See "license.txt" in this installation * * * *******************************************************************************) interface uses Graphics, LCLVersion; const SPK_DPI_AWARE = true; procedure SpkInitLayoutConsts(FromDPI: Integer; ToDPI: Integer = 0); function SpkScaleX(Size: Integer; FromDPI: Integer; ToDPI: Integer = 0): integer; function SpkScaleY(Size: Integer; FromDPI: Integer; ToDPI: Integer = 0): integer; const // **************** // *** Elements *** // **************** LARGEBUTTON_DROPDOWN_FIELD_SIZE = 29; LARGEBUTTON_GLYPH_MARGIN = 2; LARGEBUTTON_CAPTION_HMARGIN = 3; LARGEBUTTON_MIN_WIDTH = 24; LARGEBUTTON_RADIUS = 4; LARGEBUTTON_BORDER_SIZE = 2; LARGEBUTTON_CHEVRON_VMARGIN = 2; LARGEBUTTON_CAPTION_TOP_RAIL = 45; LARGEBUTTON_CAPTION_BOTTOM_RAIL = 58; SMALLBUTTON_GLYPH_WIDTH = 16; //was: 20; //16; SMALLBUTTON_BORDER_WIDTH = 2; SMALLBUTTON_HALF_BORDER_WIDTH = 1; SMALLBUTTON_PADDING = 4; // was: 2 SMALLBUTTON_DROPDOWN_WIDTH = 11; SMALLBUTTON_RADIUS = 4; DROPDOWN_ARROW_WIDTH = 8; DROPDOWN_ARROW_HEIGHT = 8; // *********************** // *** Tab page layout *** // *********************** /// Maximum area height that can be used by an element MAX_ELEMENT_HEIGHT = 67; /// Maximum row height PANE_ROW_HEIGHT = 22; /// Single row top margin PANE_ONE_ROW_TOPPADDING = 22; /// Single row bottom margin PANE_ONE_ROW_BOTTOMPADDING = 23; /// Space between rows in a double row layout PANE_TWO_ROWS_VSPACER = 7; /// Double row layout top margin PANE_TWO_ROWS_TOPPADDING = 8; /// Double row layout bottom margin PANE_TWO_ROWS_BOTTOMPADDING = 8; /// Space between rows in triple row layout PANE_THREE_ROWS_VSPACER = 0; /// Triple row layout top margin PANE_THREE_ROWS_TOPPADDING = 0; /// Triple row layout bottom margin PANE_THREE_ROWS_BOTTOMPADDING = 1; /// Pane left padding, space between left pane border and left element border PANE_LEFT_PADDING = 2; /// Pane right padding, space between right pane border and right element border PANE_RIGHT_PADDING = 2; /// Space between two columns inside the pane PANE_COLUMN_SPACER = 4; /// Space between groups on a row in pane PANE_GROUP_SPACER = 4; // ******************* // *** Pane layout *** // ******************* /// Pane caption height PANE_CAPTION_HEIGHT = 15; /// Pane corner radius PANE_CORNER_RADIUS = 3; /// Pane border size. /// Do not change? PANE_BORDER_SIZE = 2; /// Half width of pane border? /// Do not change? PANE_BORDER_HALF_SIZE = 1; /// Pane caption horizontal padding PANE_CAPTION_HMARGIN = 6; // ************ // *** Tabs *** // ************ /// Tab corner radius TAB_CORNER_RADIUS = 4; /// Tab page left margin TAB_PANE_LEFTPADDING = 2; /// Tab page right margin TAB_PANE_RIGHTPADDING = 2; /// Tab page top margin TAB_PANE_TOPPADDING = 2; /// Tab page bottom margin TAB_PANE_BOTTOMPADDING = 1; /// Space between panes TAB_PANE_HSPACING = 3; /// Tab border size TAB_BORDER_SIZE = 1; // *************** // *** Toolbar *** // *************** /// Pane padding? TOOLBAR_BORDER_WIDTH = 1; TOOLBAR_CORNER_RADIUS = 3; /// Tab caption height TOOLBAR_TAB_CAPTIONS_HEIGHT = 22; /// Tab caption horizontal padding TOOLBAR_TAB_CAPTIONS_TEXT_HPADDING = 4; /// Min tab caption width TOOLBAR_MIN_TAB_CAPTION_WIDTH = 32; var // **************** // *** Elements *** // **************** LargeButtonDropdownFieldSize: Integer; LargeButtonGlyphMargin: Integer; LargeButtonCaptionHMargin: Integer; LargeButtonMinWidth: Integer; LargeButtonRadius: Integer; LargeButtonBorderSize: Integer; LargeButtonChevronVMargin: Integer; LargeButtonCaptionTopRail: Integer; LargeButtonCaptionButtomRail: Integer; SmallButtonGlyphWidth: Integer; SmallButtonBorderWidth: Integer; SmallButtonHalfBorderWidth: Integer; SmallButtonPadding: Integer; SmallButtonDropdownWidth: Integer; SmallButtonRadius: Integer; SmallButtonMinWidth: Integer; DropdownArrowWidth: Integer; DropdownArrowHeight: Integer; // *********************** // *** Tab page layout *** // *********************** /// Maximum area height that can be used by an element MaxElementHeight: Integer; /// Maximum row height PaneRowHeight: Integer; PaneFullRowHeight: Integer; /// Single row top margin PaneOneRowTopPadding: Integer; /// Single row bottom margin PaneOneRowBottomPadding: Integer; /// Space between rows in a double row layout PaneTwoRowsVSpacer: Integer; /// Double row layout top margin PaneTwoRowsTopPadding: Integer; /// Double row layout bottom margin PaneTwoRowsBottomPadding: Integer; /// Space between rows in triple row layout PaneThreeRowsVSpacer: Integer; /// Triple row layout top margin PaneThreeRowsTopPadding: Integer; /// Triple row layout bottom margin PaneThreeRowsBottomPadding: Integer; PaneFullRowTopPadding: Integer; PaneFullRowBottomPadding: Integer; /// Pane left padding, space between left pane border and left element border PaneLeftPadding: Integer; /// Pane right padding, space between right pane border and right element border PaneRightPadding: Integer; /// Space between two columns inside the pane PaneColumnSpacer: Integer; /// Space between groups on a row in pane PaneGroupSpacer: Integer; // ******************* // *** Pane layout *** // ******************* /// Pane caption height PaneCaptionHeight: Integer; /// Pane corner radius PaneCornerRadius: Integer; /// Pane border size /// Do not change? PaneBorderSize: Integer; /// Half width of pane border? /// Do not change? PaneBorderHalfSize: Integer; /// Height of pane PaneHeight: Integer; /// Pane caption horizontal padding PaneCaptionHMargin: Integer; // ************ // *** Tabs *** // ************ /// Tab corner radius TabCornerRadius: Integer; /// Tab page left margin TabPaneLeftPadding: Integer; /// Tab page right margin/summary> TabPaneRightPadding: Integer; /// Tab page top margin TabPaneTopPadding: Integer; /// Tab page bottom margin TabPaneBottomPadding: Integer; /// Space between panes TabPaneHSpacing: Integer; /// Tab border size TabBorderSize: Integer; /// Tab height TabHeight: Integer; // *************** // *** Toolbar *** // *************** /// Pane padding? ToolbarBorderWidth: Integer; ToolbarCornerRadius: Integer; /// Tab caption height ToolbarTabCaptionsHeight: Integer; /// Tab caption horizontal padding ToolbarTabCaptionsTextHPadding: Integer; ToolbarMinTabCaptionWidth: Integer; /// Toolbar total height ToolbarHeight: Integer; implementation uses LCLType; procedure SpkInitLayoutConsts(FromDPI: Integer; ToDPI: Integer = 0); begin if not SPK_DPI_AWARE then ToDPI := FromDPI; {$IfDef Darwin} ToDPI := FromDPI; //macOS raster scales by itself {$EndIf} LargeButtonDropdownFieldSize := SpkScaleX(LARGEBUTTON_DROPDOWN_FIELD_SIZE, FromDPI, ToDPI); LargeButtonGlyphMargin := SpkScaleX(LARGEBUTTON_GLYPH_MARGIN, FromDPI, ToDPI); LargeButtonCaptionHMargin := SpkScaleX(LARGEBUTTON_CAPTION_HMARGIN, FromDPI, ToDPI); LargeButtonMinWidth := SpkScaleX(LARGEBUTTON_MIN_WIDTH, FromDPI, ToDPI); LargeButtonRadius := LARGEBUTTON_RADIUS; LargeButtonBorderSize := SpkScaleX(LARGEBUTTON_BORDER_SIZE, FromDPI, ToDPI); LargeButtonChevronVMargin := SpkScaleY(LARGEBUTTON_CHEVRON_VMARGIN, FromDPI, ToDPI); LargeButtonCaptionTopRail := SpkScaleY(LARGEBUTTON_CAPTION_TOP_RAIL, FromDPI, ToDPI); LargeButtonCaptionButtomRail := SpkScaleY(LARGEBUTTON_CAPTION_BOTTOM_RAIL, FromDPI, ToDPI); SmallButtonGlyphWidth := SpkScaleX(SMALLBUTTON_GLYPH_WIDTH, FromDPI, ToDPI); SmallButtonBorderWidth := SpkScaleX(SMALLBUTTON_BORDER_WIDTH, FromDPI, ToDPI); SmallButtonHalfBorderWidth := SpkScaleX(SMALLBUTTON_HALF_BORDER_WIDTH, FromDPI, ToDPI); SmallButtonPadding := SpkScaleX(SMALLBUTTON_PADDING, FromDPI, ToDPI); SmallButtonDropdownWidth := SpkScaleX(SMALLBUTTON_DROPDOWN_WIDTH, FromDPI, ToDPI); SmallButtonRadius := SMALLBUTTON_RADIUS; SmallButtonMinWidth := 2 * SmallButtonPadding + SmallButtonGlyphWidth; DropdownArrowWidth := SpkScaleX(DROPDOWN_ARROW_WIDTH, FromDPI, ToDPI); DropdownArrowHeight := SpkScaleY(DROPDOWN_ARROW_HEIGHT, FromDPI, ToDPI); MaxElementHeight := SpkScaleY(MAX_ELEMENT_HEIGHT, FromDPI, ToDPI); PaneRowHeight := SpkScaleY(PANE_ROW_HEIGHT, FromDPI, ToDPI); PaneFullRowHeight := 3 * PaneRowHeight; PaneOneRowTopPadding := SpkScaleY(PANE_ONE_ROW_TOPPADDING, FromDPI, ToDPI); PaneOneRowBottomPadding := SpkScaleY(PANE_ONE_ROW_BOTTOMPADDING, FromDPI, ToDPI); PaneTwoRowsVSpacer := SpkScaleY(PANE_TWO_ROWS_VSPACER, FromDPI, ToDPI); PaneTwoRowsTopPadding := SpkScaleY(PANE_TWO_ROWS_TOPPADDING, FromDPI, ToDPI); PaneTwoRowsBottomPadding := SpkScaleY(PANE_TWO_ROWS_BOTTOMPADDING, FromDPI, ToDPI); PaneThreeRowsVSpacer := SpkScaleY(PANE_THREE_ROWS_VSPACER, FromDPI, ToDPI); PaneThreeRowsTopPadding := SpkScaleY(PANE_THREE_ROWS_TOPPADDING, FromDPI, ToDPI); PaneThreeRowsBottomPadding := SpkScaleY(PANE_THREE_ROWS_BOTTOMPADDING, FromDPI, ToDPI); PaneFullRowTopPadding := PaneThreeRowsTopPadding; PaneFullRowBottomPadding := PaneThreeRowsBottomPadding; PaneLeftPadding := SpkScaleX(PANE_LEFT_PADDING, FromDPI, ToDPI); PaneRightPadding := SpkScaleX(PANE_RIGHT_PADDING, FromDPI, ToDPI); PaneColumnSpacer := SpkScaleX(PANE_COLUMN_SPACER, FromDPI, ToDPI); PaneGroupSpacer := SpkScaleX(PANE_GROUP_SPACER, FromDPI, ToDPI); PaneCaptionHeight := SpkScaleY(PANE_CAPTION_HEIGHT, FromDPI, ToDPI); PaneCornerRadius := PANE_CORNER_RADIUS; PaneBorderSize := SpkScaleX(PANE_BORDER_SIZE, FromDPI, ToDPI); PaneBorderHalfSize := SpkScaleX(PANE_BORDER_HALF_SIZE, FromDPI, ToDPI); PaneHeight := MaxElementHeight + PaneCaptionHeight + 2 * PaneBorderSize; PaneCaptionHMargin := SpkScaleX(PANE_CAPTION_HMARGIN, FromDPI, ToDPI); TabCornerRadius := TAB_CORNER_RADIUS; TabPaneLeftPadding := SpkScaleX(TAB_PANE_LEFTPADDING, FromDPI, ToDPI); TabPaneRightPadding := SpkScaleX(TAB_PANE_RIGHTPADDING, FromDPI, ToDPI); TabPaneTopPadding := SpkScaleY(TAB_PANE_TOPPADDING, FromDPI, ToDPI); TabPaneBottomPadding := SpkScaleY(TAB_PANE_BOTTOMPADDING, FromDPI, ToDPI); TabPaneHSpacing := SpkScaleX(TAB_PANE_HSPACING, FromDPI, ToDPI); TabBorderSize := SpkScaleX(TAB_BORDER_SIZE, FromDPI, ToDPI); TabHeight := PaneHeight + TabPaneTopPadding + TabPaneBottomPadding + TabBorderSize; ToolbarBorderWidth := SpkScaleX(TOOLBAR_BORDER_WIDTH, FromDPI, ToDPI); ToolbarCornerRadius := TOOLBAR_CORNER_RADIUS; ToolbarTabCaptionsHeight := SpkScaleY(TOOLBAR_TAB_CAPTIONS_HEIGHT, FromDPI, ToDPI); ToolbarTabCaptionsTextHPadding := SpkScaleX(TOOLBAR_TAB_CAPTIONS_TEXT_HPADDING, FromDPI, ToDPI); ToolbarMinTabCaptionWidth := SpkScaleX(TOOLBAR_MIN_TAB_CAPTION_WIDTH, FromDPI, ToDPI); ToolbarHeight := ToolbarTabCaptionsHeight + TabHeight; // scaling radius if not square if LargeButtonRadius > 1 then LargeButtonRadius := SpkScaleX(LargeButtonRadius, FromDPI, ToDPI); if SmallButtonRadius > 1 then SmallButtonRadius := SpkScaleX(SmallButtonRadius, FromDPI, ToDPI); if PaneCornerRadius > 1 then PaneCornerRadius := SpkScaleX(PaneCornerRadius, FromDPI, ToDPI); if TabCornerRadius > 1 then TabCornerRadius := SpkScaleX(TabCornerRadius, FromDPI, ToDPI); if ToolbarCornerRadius > 1 then ToolbarCornerRadius := SpkScaleX(ToolbarCornerRadius, FromDPI, ToDPI); end; function SpkScaleX(Size: Integer; FromDPI: Integer; ToDPI: Integer): integer; begin if ToDPI = 0 then ToDPI := ScreenInfo.PixelsPerInchX; if (not SPK_DPI_AWARE) or (ToDPI = FromDPI) then Result := Size else begin if (ToDPI/FromDPI <= 1.5) and (Size = 1) then Result := 1 //maintaining 1px on 150% scale for crispness else Result := MulDiv(Size, ToDPI, FromDPI); end; end; function SpkScaleY(Size: Integer; FromDPI: Integer; ToDPI: Integer): integer; begin if ToDPI = 0 then ToDPI := ScreenInfo.PixelsPerInchY; if (not SPK_DPI_AWARE) or (ToDPI = FromDPI) then Result := Size else begin if (ToDPI/FromDPI <= 1.5) and (Size = 1) then Result := 1 //maintaining 1px on 150% scale for crispness else Result := MulDiv(Size, ToDPI, FromDPI); end; end; initialization {$IFDEF DEBUG} // Sprawdzanie poprawnoœci // £uk du¿ego przycisku Assert(LARGEBUTTON_RADIUS * 2 <= LARGEBUTTON_DROPDOWN_FIELD_SIZE); // Tafla, wersja z jednym wierszem Assert(PANE_ROW_HEIGHT + PANE_ONE_ROW_TOPPADDING + PANE_ONE_ROW_BOTTOMPADDING <= MAX_ELEMENT_HEIGHT); // Tafla, wersja z dwoma wierszami Assert(2*PANE_ROW_HEIGHT + PANE_TWO_ROWS_TOPPADDING + PANE_TWO_ROWS_VSPACER + PANE_TWO_ROWS_BOTTOMPADDING <= MAX_ELEMENT_HEIGHT); // Tafla, wersja z trzema wierszami Assert(3*PANE_ROW_HEIGHT + PANE_THREE_ROWS_TOPPADDING + 2*PANE_THREE_ROWS_VSPACER + PANE_THREE_ROWS_BOTTOMPADDING <= MAX_ELEMENT_HEIGHT); {$ENDIF} end.