mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-25 19:18:23 +01:00
Improve vertical header width, refactoring
This commit is contained in:
parent
bb83fdd273
commit
6d464562d7
@ -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 }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user