Improve vertical header width, refactoring

This commit is contained in:
zamtmn 2023-07-13 21:01:33 +00:00 committed by Maxim Ganetsky
parent bb83fdd273
commit 6d464562d7

View File

@ -119,37 +119,6 @@ uses
const ADAutoSizingReason = 'TAnchorDockMaster Delayed'; const ADAutoSizingReason = 'TAnchorDockMaster Delayed';
{$ENDIF} {$ENDIF}
const EmptyMouseTimeStartX=low(Integer);
MouseNoMoveDelta=5;
MouseNoMoveTime=500;
HideOverlappingFormByMouseLoseTime=500;
ButtonBorderSpacingAround=4;
OppositeAnchorKind2Align: array[TAnchorKind] of TAlign = (
alBottom, // akTop,
alRight, // akLeft,
alLeft, // akRight,
alTop // akBottom
);
OppositeAnchorKind: array[TAnchorKind] of TAnchorKind = (
akBottom, // akTop,
akRight, // akLeft,
akLeft, // akRight,
akTop // akBottom
);
{AnchorKind2Align: array[TAnchorKind] of TAlign = (
alTop, // akTop,
alLeft, // akLeft,
alRight,// akRight,
alBottom// akBottom
);}
OppositeAnchorKind2TADLHeaderPosition: array[TAnchorKind] of TADLHeaderPosition = (
adlhpBottom, // akTop,
adlhpRight, // akLeft,
adlhpLeft, // akRight,
adlhpTop // akBottom
);
type type
TAnchorDockHostSite = class; TAnchorDockHostSite = class;
@ -874,14 +843,9 @@ type
var var
DockMaster: TAnchorDockMaster = nil; DockMaster: TAnchorDockMaster = nil;
DockTimer: TTimer = nil;
PreferredButtonWidth:integer=-1; PreferredButtonWidth:integer = -1;
PreferredButtonHeight:integer=-1; PreferredButtonHeight:integer = -1;
const
HardcodedButtonSize:integer=13;
function dbgs(SiteType: TAnchorDockHostSiteType): string; overload; function dbgs(SiteType: TAnchorDockHostSiteType): string; overload;
@ -911,6 +875,45 @@ function GetEnclosedControls(const ARect: TAnchorControlsRect): TFPList;
implementation implementation
const
HardcodedButtonSize:integer = 13;
ButtonBorderSpacingAround = 2;
TestTxt = 'ABCXYZ123gqj';
FlatPinnedSym = #$EE#$A1#$80{E840};//pinned
FlatCrossSym = #$EE#$9C#$91{E711};//cross
EmptyMouseTimeStartX = low(Integer);
MouseNoMoveDelta = 5;
MouseNoMoveTime = 500;
HideOverlappingFormByMouseLoseTime = 500;
OppositeAnchorKind2Align: array[TAnchorKind] of TAlign = (
alBottom, // akTop,
alRight, // akLeft,
alLeft, // akRight,
alTop // akBottom
);
OppositeAnchorKind: array[TAnchorKind] of TAnchorKind = (
akBottom, // akTop,
akRight, // akLeft,
akLeft, // akRight,
akTop // akBottom
);
{AnchorKind2Align: array[TAnchorKind] of TAlign = (
alTop, // akTop,
alLeft, // akLeft,
alRight,// akRight,
alBottom// akBottom
);}
OppositeAnchorKind2TADLHeaderPosition: array[TAnchorKind] of TADLHeaderPosition = (
adlhpBottom, // akTop,
adlhpRight, // akLeft,
adlhpLeft, // akRight,
adlhpTop // akBottom
);
var
DockTimer: TTimer = nil;
function dbgs(SiteType: TAnchorDockHostSiteType): string; overload; function dbgs(SiteType: TAnchorDockHostSiteType): string; overload;
begin begin
case SiteType of case SiteType of
@ -2921,8 +2924,8 @@ procedure TAnchorDockMaster.SetFlatHeadersButtons(AValue: boolean);
begin begin
if FFlatHeadersButtons=AValue then Exit; if FFlatHeadersButtons=AValue then Exit;
FFlatHeadersButtons:=AValue; FFlatHeadersButtons:=AValue;
AutoSizeAllHeaders(True);
InvalidateHeaders; InvalidateHeaders;
EnableAllAutoSizing;
OptionsChanged; OptionsChanged;
end; end;
@ -3098,7 +3101,16 @@ begin
if not (Site is TAnchorDockHostSite) then continue; if not (Site is TAnchorDockHostSite) then continue;
if (Site.Header<>nil) and (Site.Header.Parent<>nil) then begin if (Site.Header<>nil) and (Site.Header.Parent<>nil) then begin
Site.Header.InvalidatePreferredSize; Site.Header.InvalidatePreferredSize;
DisableControlAutoSizing(Site); DisableControlAutoSizing(Site.Header);
if Site.Header.CloseButton<>nil then begin
Site.Header.CloseButton.InvalidatePreferredSize;
DisableControlAutoSizing(Site.Header.CloseButton);
end;
if Site.Header.MinimizeButton<>nil then begin
Site.Header.MinimizeButton.InvalidatePreferredSize;
DisableControlAutoSizing(Site.Header.MinimizeButton);
end;
Site.Header.AdjustSize;
end; end;
end; end;
if EnableAutoSizing then if EnableAutoSizing then
@ -6311,6 +6323,7 @@ begin
Header.Parent:=Self; Header.Parent:=Self;
Header.MinimizeButton.Visible:=(DockMaster.DockSitesCanBeMinimized and CanBeMinimized(Splitter,SplitterAnchorKind))or Minimized; Header.MinimizeButton.Visible:=(DockMaster.DockSitesCanBeMinimized and CanBeMinimized(Splitter,SplitterAnchorKind))or Minimized;
Header.MinimizeButton.Parent:=Header; Header.MinimizeButton.Parent:=Header;
Header.DoAutoSize;
end end
else else
Header.Parent:=nil; Header.Parent:=nil;
@ -6534,10 +6547,9 @@ begin
InflateRect(rect,-1,-1); InflateRect(rect,-1,-1);
btn.Canvas.Font.Name:='Segoe MDL2 Assets'; btn.Canvas.Font.Name:='Segoe MDL2 Assets';
if sender is TAnchorDockMinimizeButton then begin if sender is TAnchorDockMinimizeButton then begin
//txt:=#$EE#$9C#$98{E718};//Pin txt:=FlatPinnedSym
txt:=#$EE#$A1#$80{E840};//pinned
end else end else
txt:=#$EE#$9C#$91{E711};//cross txt:=FlatCrossSym;
btn.Canvas.TextRect(rect, rect.TopLeft.X, rect.TopLeft.Y,txt,AStyle); btn.Canvas.TextRect(rect, rect.TopLeft.X, rect.TopLeft.Y,txt,AStyle);
finally finally
end; end;
@ -6711,16 +6723,41 @@ begin
draw(DockMaster.CurrentADHeaderStyle); draw(DockMaster.CurrentADHeaderStyle);
end; end;
procedure CalculatePreferredFlatButtonSize(Handle: HWND; out PreferredWidth,
PreferredHeight: integer);
const
TestTxt2 = FlatPinnedSym+FlatCrossSym;
var
LCanvas: TCanvas;
R: TRect;
Flags: cardinal;
begin
LCanvas:= TCanvas.Create;
try
LCanvas.Handle := GetDC(Handle);
Flags := DT_CALCRECT or DT_EXPANDTABS or DT_SINGLELINE or DT_NOPREFIX;
R := Rect(0, 0, 10000, 10000);
DrawText(LCanvas.Handle, PChar(TestTxt), Length(TestTxt), R, Flags);
PreferredWidth := R.Bottom - R.Top;
LCanvas.Font.Name := 'Segoe MDL2 Assets';
R := Rect(0, 0, 10000, 10000);
DrawText(LCanvas.Handle, PChar(TestTxt2), Length(TestTxt2), R, Flags);
PreferredWidth := max(R.Bottom - R.Top, PreferredWidth);
PreferredHeight:=PreferredWidth;
finally
LCanvas.Handle:= 0;
LCanvas.Free;
end;
end;
procedure TAnchorDockHeader.CalculatePreferredSize(var PreferredWidth, procedure TAnchorDockHeader.CalculatePreferredSize(var PreferredWidth,
PreferredHeight: integer; WithThemeSpace: Boolean); PreferredHeight: integer; WithThemeSpace: Boolean);
const
TestTxt = 'ABCXYZ123gqj';
var var
DC: HDC; DC: HDC;
R: TRect; R: TRect;
OldFont: HGDIOBJ; OldFont: HGDIOBJ;
Flags: cardinal; Flags: cardinal;
NeededHeight: Integer; NeededWidth,NeededHeight: Integer;
begin begin
inherited CalculatePreferredSize(PreferredWidth,PreferredHeight,WithThemeSpace); inherited CalculatePreferredSize(PreferredWidth,PreferredHeight,WithThemeSpace);
if Caption<>'' then begin if Caption<>'' then begin
@ -6749,6 +6786,11 @@ begin
PreferredHeight:=Max(NeededHeight,PreferredHeight); PreferredHeight:=Max(NeededHeight,PreferredHeight);
end; end;
end; end;
if DockMaster.FlatHeadersButtons then begin
CalculatePreferredFlatButtonSize(Handle, NeededWidth, NeededHeight);
PreferredWidth:=Max(PreferredWidth, NeededWidth+2*ButtonBorderSpacingAround);
PreferredHeight:=Max(PreferredHeight, NeededHeight+2*ButtonBorderSpacingAround);
end;
end; end;
procedure TAnchorDockHeader.MouseDown(Button: TMouseButton; Shift: TShiftState; procedure TAnchorDockHeader.MouseDown(Button: TMouseButton; Shift: TShiftState;
@ -6827,41 +6869,42 @@ end;
procedure TAnchorDockHeader.UpdateHeaderControls; procedure TAnchorDockHeader.UpdateHeaderControls;
begin begin
if Align in [alLeft,alRight] then begin if CloseButton<>nil then begin
if CloseButton<>nil then begin if Align in [alLeft,alRight] then begin
//MinimizeButton.Align:=alTop; //MinimizeButton.Align:=alTop;
//CloseButton.Align:=alTop; //CloseButton.Align:=alTop;
CloseButton.AnchorSide[akLeft].Side := asrCenter; CloseButton.AnchorSide[akLeft].Side := asrCenter;
CloseButton.AnchorSide[akLeft].Control := Self; CloseButton.AnchorSide[akLeft].Control := Self;
CloseButton.AnchorSide[akTop].Side := asrTop; CloseButton.AnchorSide[akTop].Side := asrTop;
CloseButton.AnchorSide[akTop].Control := Self; CloseButton.AnchorSide[akTop].Control := Self;
CloseButton.Anchors := [akTop] + [akLeft]; CloseButton.Anchors := [akTop,akLeft];
if MinimizeButton<>nil then begin
MinimizeButton.AnchorSide[akLeft].Side := asrCenter; MinimizeButton.AnchorSide[akLeft].Side := asrCenter;
MinimizeButton.AnchorSide[akLeft].Control := Self; MinimizeButton.AnchorSide[akLeft].Control := Self;
MinimizeButton.AnchorSide[akTop].Side := asrBottom; MinimizeButton.AnchorSide[akTop].Side := asrBottom;
MinimizeButton.AnchorSide[akTop].Control := CloseButton; MinimizeButton.AnchorSide[akTop].Control := CloseButton;
MinimizeButton.Anchors := [akTop] + [akLeft]; MinimizeButton.Anchors := [akTop,akLeft];
end; MinimizeButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
end else begin end;
if CloseButton<>nil then begin end else begin
//MinimizeButton.Align:=alRight; //MinimizeButton.Align:=alRight;
//CloseButton.Align:=alRight; //CloseButton.Align:=alRight;
CloseButton.AnchorSide[akRight].Side := asrRight; CloseButton.AnchorSide[akRight].Side := asrRight;
CloseButton.AnchorSide[akRight].Control := Self; CloseButton.AnchorSide[akRight].Control := Self;
CloseButton.AnchorSide[akTop].Side := asrCenter; CloseButton.AnchorSide[akTop].Side := asrCenter;
CloseButton.AnchorSide[akTop].Control := Self; CloseButton.AnchorSide[akTop].Control := Self;
CloseButton.Anchors := [akTop] + [akRight]; CloseButton.Anchors := [akTop,akRight];
if MinimizeButton<>nil then begin
MinimizeButton.AnchorSide[akRight].Side := asrLeft; MinimizeButton.AnchorSide[akRight].Side := asrLeft;
MinimizeButton.AnchorSide[akRight].Control := CloseButton; MinimizeButton.AnchorSide[akRight].Control := CloseButton;
MinimizeButton.AnchorSide[akTop].Side := asrCenter; MinimizeButton.AnchorSide[akTop].Side := asrCenter;
MinimizeButton.AnchorSide[akTop].Control := Self; MinimizeButton.AnchorSide[akTop].Control := Self;
MinimizeButton.Anchors := [akTop] + [akRight]; MinimizeButton.Anchors := [akTop,akRight];
MinimizeButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
end;
end; end;
CloseButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
end; end;
CloseButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
MinimizeButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
//debugln(['TAnchorDockHeader.UpdateHeaderControls ',dbgs(Align),' ',dbgs(CloseButton.Align)]); //debugln(['TAnchorDockHeader.UpdateHeaderControls ',dbgs(Align),' ',dbgs(CloseButton.Align)]);
end; end;
@ -6993,18 +7036,21 @@ end;
procedure TAnchorDockCloseButton.CalculatePreferredSize(var PreferredWidth, procedure TAnchorDockCloseButton.CalculatePreferredSize(var PreferredWidth,
PreferredHeight: integer; WithThemeSpace: Boolean); PreferredHeight: integer; WithThemeSpace: Boolean);
begin begin
with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails( if not DockMaster.FlatHeadersButtons then
{$IFDEF LCLWIN32}twCloseButtonNormal{$ELSE}twSmallCloseButtonNormal{$ENDIF}), with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails(
Font.PixelsPerInch) do {$IFDEF LCLWIN32}twCloseButtonNormal{$ELSE}twSmallCloseButtonNormal{$ENDIF}),
begin Font.PixelsPerInch) do
PreferredWidth:=cx; begin
PreferredHeight:=cy; PreferredWidth:=cx;
ButtonSizeCorrector(PreferredWidth,PreferredHeight); PreferredHeight:=cy;
{$IF defined(LCLGtk2) or defined(Carbon)} ButtonSizeCorrector(PreferredWidth,PreferredHeight);
inc(PreferredWidth,2); {$IF defined(LCLGtk2) or defined(Carbon)}
inc(PreferredHeight,2); inc(PreferredWidth,2);
{$ENDIF} inc(PreferredHeight,2);
end; {$ENDIF}
end
else
CalculatePreferredFlatButtonSize(Parent.Handle, PreferredWidth,PreferredHeight);
end; end;
{ TAnchorDockMinimizeButton } { TAnchorDockMinimizeButton }
@ -7037,18 +7083,21 @@ end;
procedure TAnchorDockMinimizeButton.CalculatePreferredSize(var PreferredWidth, procedure TAnchorDockMinimizeButton.CalculatePreferredSize(var PreferredWidth,
PreferredHeight: integer; WithThemeSpace: Boolean); PreferredHeight: integer; WithThemeSpace: Boolean);
begin begin
with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails( if not DockMaster.FlatHeadersButtons then
{$IFDEF LCLGtk2}twMDIRestoreButtonNormal{$ELSE}twMinButtonNormal{$ENDIF}), with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails(
Font.PixelsPerInch) do {$IFDEF LCLGtk2}twMDIRestoreButtonNormal{$ELSE}twMinButtonNormal{$ENDIF}),
begin Font.PixelsPerInch) do
PreferredWidth:=cx; begin
PreferredHeight:=cy; PreferredWidth:=cx;
ButtonSizeCorrector(PreferredWidth,PreferredHeight); PreferredHeight:=cy;
{$IF defined(LCLGtk2) or defined(Carbon)} ButtonSizeCorrector(PreferredWidth,PreferredHeight);
inc(PreferredWidth,2); {$IF defined(LCLGtk2) or defined(Carbon)}
inc(PreferredHeight,2); inc(PreferredWidth,2);
{$ENDIF} inc(PreferredHeight,2);
end; {$ENDIF}
end
else
CalculatePreferredFlatButtonSize(Parent.Handle, PreferredWidth,PreferredHeight);
end; end;
{ TAnchorDockManager } { TAnchorDockManager }