mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-09 23:08:05 +02:00
Improve vertical header width, refactoring
This commit is contained in:
parent
bb83fdd273
commit
6d464562d7
@ -119,37 +119,6 @@ uses
|
||||
const ADAutoSizingReason = 'TAnchorDockMaster Delayed';
|
||||
{$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
|
||||
TAnchorDockHostSite = class;
|
||||
|
||||
@ -874,14 +843,9 @@ type
|
||||
|
||||
var
|
||||
DockMaster: TAnchorDockMaster = nil;
|
||||
DockTimer: TTimer = nil;
|
||||
|
||||
PreferredButtonWidth:integer=-1;
|
||||
PreferredButtonHeight:integer=-1;
|
||||
|
||||
|
||||
const
|
||||
HardcodedButtonSize:integer=13;
|
||||
PreferredButtonWidth:integer = -1;
|
||||
PreferredButtonHeight:integer = -1;
|
||||
|
||||
function dbgs(SiteType: TAnchorDockHostSiteType): string; overload;
|
||||
|
||||
@ -911,6 +875,45 @@ function GetEnclosedControls(const ARect: TAnchorControlsRect): TFPList;
|
||||
|
||||
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;
|
||||
begin
|
||||
case SiteType of
|
||||
@ -2921,8 +2924,8 @@ procedure TAnchorDockMaster.SetFlatHeadersButtons(AValue: boolean);
|
||||
begin
|
||||
if FFlatHeadersButtons=AValue then Exit;
|
||||
FFlatHeadersButtons:=AValue;
|
||||
AutoSizeAllHeaders(True);
|
||||
InvalidateHeaders;
|
||||
EnableAllAutoSizing;
|
||||
OptionsChanged;
|
||||
end;
|
||||
|
||||
@ -3098,7 +3101,16 @@ begin
|
||||
if not (Site is TAnchorDockHostSite) then continue;
|
||||
if (Site.Header<>nil) and (Site.Header.Parent<>nil) then begin
|
||||
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;
|
||||
if EnableAutoSizing then
|
||||
@ -6311,6 +6323,7 @@ begin
|
||||
Header.Parent:=Self;
|
||||
Header.MinimizeButton.Visible:=(DockMaster.DockSitesCanBeMinimized and CanBeMinimized(Splitter,SplitterAnchorKind))or Minimized;
|
||||
Header.MinimizeButton.Parent:=Header;
|
||||
Header.DoAutoSize;
|
||||
end
|
||||
else
|
||||
Header.Parent:=nil;
|
||||
@ -6534,10 +6547,9 @@ begin
|
||||
InflateRect(rect,-1,-1);
|
||||
btn.Canvas.Font.Name:='Segoe MDL2 Assets';
|
||||
if sender is TAnchorDockMinimizeButton then begin
|
||||
//txt:=#$EE#$9C#$98{E718};//Pin
|
||||
txt:=#$EE#$A1#$80{E840};//pinned
|
||||
txt:=FlatPinnedSym
|
||||
end else
|
||||
txt:=#$EE#$9C#$91{E711};//cross
|
||||
txt:=FlatCrossSym;
|
||||
btn.Canvas.TextRect(rect, rect.TopLeft.X, rect.TopLeft.Y,txt,AStyle);
|
||||
finally
|
||||
end;
|
||||
@ -6711,16 +6723,41 @@ begin
|
||||
draw(DockMaster.CurrentADHeaderStyle);
|
||||
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,
|
||||
PreferredHeight: integer; WithThemeSpace: Boolean);
|
||||
const
|
||||
TestTxt = 'ABCXYZ123gqj';
|
||||
var
|
||||
DC: HDC;
|
||||
R: TRect;
|
||||
OldFont: HGDIOBJ;
|
||||
Flags: cardinal;
|
||||
NeededHeight: Integer;
|
||||
NeededWidth,NeededHeight: Integer;
|
||||
begin
|
||||
inherited CalculatePreferredSize(PreferredWidth,PreferredHeight,WithThemeSpace);
|
||||
if Caption<>'' then begin
|
||||
@ -6749,6 +6786,11 @@ begin
|
||||
PreferredHeight:=Max(NeededHeight,PreferredHeight);
|
||||
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;
|
||||
|
||||
procedure TAnchorDockHeader.MouseDown(Button: TMouseButton; Shift: TShiftState;
|
||||
@ -6827,41 +6869,42 @@ end;
|
||||
|
||||
procedure TAnchorDockHeader.UpdateHeaderControls;
|
||||
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;
|
||||
//CloseButton.Align:=alTop;
|
||||
CloseButton.AnchorSide[akLeft].Side := asrCenter;
|
||||
CloseButton.AnchorSide[akLeft].Control := Self;
|
||||
CloseButton.AnchorSide[akTop].Side := asrTop;
|
||||
CloseButton.AnchorSide[akTop].Control := Self;
|
||||
CloseButton.Anchors := [akTop] + [akLeft];
|
||||
|
||||
MinimizeButton.AnchorSide[akLeft].Side := asrCenter;
|
||||
MinimizeButton.AnchorSide[akLeft].Control := Self;
|
||||
MinimizeButton.AnchorSide[akTop].Side := asrBottom;
|
||||
MinimizeButton.AnchorSide[akTop].Control := CloseButton;
|
||||
MinimizeButton.Anchors := [akTop] + [akLeft];
|
||||
end;
|
||||
end else begin
|
||||
if CloseButton<>nil then begin
|
||||
CloseButton.Anchors := [akTop,akLeft];
|
||||
if MinimizeButton<>nil then begin
|
||||
MinimizeButton.AnchorSide[akLeft].Side := asrCenter;
|
||||
MinimizeButton.AnchorSide[akLeft].Control := Self;
|
||||
MinimizeButton.AnchorSide[akTop].Side := asrBottom;
|
||||
MinimizeButton.AnchorSide[akTop].Control := CloseButton;
|
||||
MinimizeButton.Anchors := [akTop,akLeft];
|
||||
MinimizeButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
|
||||
end;
|
||||
end else begin
|
||||
//MinimizeButton.Align:=alRight;
|
||||
//CloseButton.Align:=alRight;
|
||||
CloseButton.AnchorSide[akRight].Side := asrRight;
|
||||
CloseButton.AnchorSide[akRight].Control := Self;
|
||||
CloseButton.AnchorSide[akTop].Side := asrCenter;
|
||||
CloseButton.AnchorSide[akTop].Control := Self;
|
||||
CloseButton.Anchors := [akTop] + [akRight];
|
||||
|
||||
MinimizeButton.AnchorSide[akRight].Side := asrLeft;
|
||||
MinimizeButton.AnchorSide[akRight].Control := CloseButton;
|
||||
MinimizeButton.AnchorSide[akTop].Side := asrCenter;
|
||||
MinimizeButton.AnchorSide[akTop].Control := Self;
|
||||
MinimizeButton.Anchors := [akTop] + [akRight];
|
||||
CloseButton.Anchors := [akTop,akRight];
|
||||
if MinimizeButton<>nil then begin
|
||||
MinimizeButton.AnchorSide[akRight].Side := asrLeft;
|
||||
MinimizeButton.AnchorSide[akRight].Control := CloseButton;
|
||||
MinimizeButton.AnchorSide[akTop].Side := asrCenter;
|
||||
MinimizeButton.AnchorSide[akTop].Control := Self;
|
||||
MinimizeButton.Anchors := [akTop,akRight];
|
||||
MinimizeButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
|
||||
end;
|
||||
end;
|
||||
CloseButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
|
||||
end;
|
||||
CloseButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
|
||||
MinimizeButton.BorderSpacing.Around:=ButtonBorderSpacingAround;
|
||||
//debugln(['TAnchorDockHeader.UpdateHeaderControls ',dbgs(Align),' ',dbgs(CloseButton.Align)]);
|
||||
end;
|
||||
|
||||
@ -6993,18 +7036,21 @@ end;
|
||||
procedure TAnchorDockCloseButton.CalculatePreferredSize(var PreferredWidth,
|
||||
PreferredHeight: integer; WithThemeSpace: Boolean);
|
||||
begin
|
||||
with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails(
|
||||
{$IFDEF LCLWIN32}twCloseButtonNormal{$ELSE}twSmallCloseButtonNormal{$ENDIF}),
|
||||
Font.PixelsPerInch) do
|
||||
begin
|
||||
PreferredWidth:=cx;
|
||||
PreferredHeight:=cy;
|
||||
ButtonSizeCorrector(PreferredWidth,PreferredHeight);
|
||||
{$IF defined(LCLGtk2) or defined(Carbon)}
|
||||
inc(PreferredWidth,2);
|
||||
inc(PreferredHeight,2);
|
||||
{$ENDIF}
|
||||
end;
|
||||
if not DockMaster.FlatHeadersButtons then
|
||||
with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails(
|
||||
{$IFDEF LCLWIN32}twCloseButtonNormal{$ELSE}twSmallCloseButtonNormal{$ENDIF}),
|
||||
Font.PixelsPerInch) do
|
||||
begin
|
||||
PreferredWidth:=cx;
|
||||
PreferredHeight:=cy;
|
||||
ButtonSizeCorrector(PreferredWidth,PreferredHeight);
|
||||
{$IF defined(LCLGtk2) or defined(Carbon)}
|
||||
inc(PreferredWidth,2);
|
||||
inc(PreferredHeight,2);
|
||||
{$ENDIF}
|
||||
end
|
||||
else
|
||||
CalculatePreferredFlatButtonSize(Parent.Handle, PreferredWidth,PreferredHeight);
|
||||
end;
|
||||
|
||||
{ TAnchorDockMinimizeButton }
|
||||
@ -7037,18 +7083,21 @@ end;
|
||||
procedure TAnchorDockMinimizeButton.CalculatePreferredSize(var PreferredWidth,
|
||||
PreferredHeight: integer; WithThemeSpace: Boolean);
|
||||
begin
|
||||
with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails(
|
||||
{$IFDEF LCLGtk2}twMDIRestoreButtonNormal{$ELSE}twMinButtonNormal{$ENDIF}),
|
||||
Font.PixelsPerInch) do
|
||||
begin
|
||||
PreferredWidth:=cx;
|
||||
PreferredHeight:=cy;
|
||||
ButtonSizeCorrector(PreferredWidth,PreferredHeight);
|
||||
{$IF defined(LCLGtk2) or defined(Carbon)}
|
||||
inc(PreferredWidth,2);
|
||||
inc(PreferredHeight,2);
|
||||
{$ENDIF}
|
||||
end;
|
||||
if not DockMaster.FlatHeadersButtons then
|
||||
with ThemeServices.GetDetailSizeForPPI(ThemeServices.GetElementDetails(
|
||||
{$IFDEF LCLGtk2}twMDIRestoreButtonNormal{$ELSE}twMinButtonNormal{$ENDIF}),
|
||||
Font.PixelsPerInch) do
|
||||
begin
|
||||
PreferredWidth:=cx;
|
||||
PreferredHeight:=cy;
|
||||
ButtonSizeCorrector(PreferredWidth,PreferredHeight);
|
||||
{$IF defined(LCLGtk2) or defined(Carbon)}
|
||||
inc(PreferredWidth,2);
|
||||
inc(PreferredHeight,2);
|
||||
{$ENDIF}
|
||||
end
|
||||
else
|
||||
CalculatePreferredFlatButtonSize(Parent.Handle, PreferredWidth,PreferredHeight);
|
||||
end;
|
||||
|
||||
{ TAnchorDockManager }
|
||||
|
Loading…
Reference in New Issue
Block a user