mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 02:39:15 +02:00
anchordocking: started PreferredSiteSizeAsSiteMinimum
git-svn-id: trunk@26266 -
This commit is contained in:
parent
3d4516b088
commit
5b71b83138
@ -326,10 +326,12 @@ type
|
|||||||
FDockableSites: TAnchors;
|
FDockableSites: TAnchors;
|
||||||
FDockSite: TAnchorDockHostSite;
|
FDockSite: TAnchorDockHostSite;
|
||||||
FInsideDockingAllowed: boolean;
|
FInsideDockingAllowed: boolean;
|
||||||
|
FPreferredSiteSizeAsSiteMinimum: boolean;
|
||||||
FResizePolicy: TADMResizePolicy;
|
FResizePolicy: TADMResizePolicy;
|
||||||
FStoredConstraints: TRect;
|
FStoredConstraints: TRect;
|
||||||
FSite: TWinControl;
|
FSite: TWinControl;
|
||||||
FSiteClientRect: TRect;
|
FSiteClientRect: TRect;
|
||||||
|
procedure SetPreferredSiteSizeAsSiteMinimum(const AValue: boolean);
|
||||||
public
|
public
|
||||||
constructor Create(ADockSite: TWinControl); override;
|
constructor Create(ADockSite: TWinControl); override;
|
||||||
procedure GetControlBounds(Control: TControl; out AControlBounds: TRect);
|
procedure GetControlBounds(Control: TControl; out AControlBounds: TRect);
|
||||||
@ -346,6 +348,7 @@ type
|
|||||||
function GetDockEdge(ADockObject: TDragDockObject): boolean; override;
|
function GetDockEdge(ADockObject: TDragDockObject): boolean; override;
|
||||||
procedure RestoreSite(SplitterPos: integer);
|
procedure RestoreSite(SplitterPos: integer);
|
||||||
procedure StoreConstraints;
|
procedure StoreConstraints;
|
||||||
|
function GetSitePreferredClientSize: TPoint;
|
||||||
|
|
||||||
property Site: TWinControl read FSite; // the associated TControl (a TAnchorDockHostSite or a custom dock site)
|
property Site: TWinControl read FSite; // the associated TControl (a TAnchorDockHostSite or a custom dock site)
|
||||||
property DockSite: TAnchorDockHostSite read FDockSite; // if Site is a TAnchorDockHostSite, this is it
|
property DockSite: TAnchorDockHostSite read FDockSite; // if Site is a TAnchorDockHostSite, this is it
|
||||||
@ -355,6 +358,7 @@ type
|
|||||||
property ResizePolicy: TADMResizePolicy read FResizePolicy write FResizePolicy;
|
property ResizePolicy: TADMResizePolicy read FResizePolicy write FResizePolicy;
|
||||||
property StoredConstraints: TRect read FStoredConstraints write FStoredConstraints;
|
property StoredConstraints: TRect read FStoredConstraints write FStoredConstraints;
|
||||||
function StoredConstraintsValid: boolean;
|
function StoredConstraintsValid: boolean;
|
||||||
|
property PreferredSiteSizeAsSiteMinimum: boolean read FPreferredSiteSizeAsSiteMinimum write SetPreferredSiteSizeAsSiteMinimum;
|
||||||
end;
|
end;
|
||||||
TAnchorDockManagerClass = class of TAnchorDockManager;
|
TAnchorDockManagerClass = class of TAnchorDockManager;
|
||||||
|
|
||||||
@ -4446,12 +4450,22 @@ end;
|
|||||||
|
|
||||||
{ TAnchorDockManager }
|
{ TAnchorDockManager }
|
||||||
|
|
||||||
|
procedure TAnchorDockManager.SetPreferredSiteSizeAsSiteMinimum(
|
||||||
|
const AValue: boolean);
|
||||||
|
begin
|
||||||
|
if FPreferredSiteSizeAsSiteMinimum=AValue then exit;
|
||||||
|
FPreferredSiteSizeAsSiteMinimum:=AValue;
|
||||||
|
if DockSite=nil then
|
||||||
|
Site.AdjustSize;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TAnchorDockManager.Create(ADockSite: TWinControl);
|
constructor TAnchorDockManager.Create(ADockSite: TWinControl);
|
||||||
begin
|
begin
|
||||||
inherited Create(ADockSite);
|
inherited Create(ADockSite);
|
||||||
FSite:=ADockSite;
|
FSite:=ADockSite;
|
||||||
FDockableSites:=[akLeft,akTop,akBottom,akRight];
|
FDockableSites:=[akLeft,akTop,akBottom,akRight];
|
||||||
FInsideDockingAllowed:=true;
|
FInsideDockingAllowed:=true;
|
||||||
|
FPreferredSiteSizeAsSiteMinimum:=true;
|
||||||
if (ADockSite is TAnchorDockHostSite) then
|
if (ADockSite is TAnchorDockHostSite) then
|
||||||
FDockSite:=TAnchorDockHostSite(ADockSite);
|
FDockSite:=TAnchorDockHostSite(ADockSite);
|
||||||
end;
|
end;
|
||||||
@ -4682,6 +4696,8 @@ var
|
|||||||
OldSiteClientRect: TRect;
|
OldSiteClientRect: TRect;
|
||||||
WidthDiff: Integer;
|
WidthDiff: Integer;
|
||||||
HeightDiff: Integer;
|
HeightDiff: Integer;
|
||||||
|
SiteMinSize: TPoint;
|
||||||
|
ChildMaxSize: TPoint;
|
||||||
begin
|
begin
|
||||||
if Force then ;
|
if Force then ;
|
||||||
//debugln(['TAnchorDockManager.ResetBounds Site="',Site.Caption,'" Force=',Force,' ',dbgs(Site.ClientRect)]);
|
//debugln(['TAnchorDockManager.ResetBounds Site="',Site.Caption,'" Force=',Force,' ',dbgs(Site.ClientRect)]);
|
||||||
@ -4690,22 +4706,32 @@ begin
|
|||||||
if Child=nil then exit;
|
if Child=nil then exit;
|
||||||
OldSiteClientRect:=FSiteClientRect;
|
OldSiteClientRect:=FSiteClientRect;
|
||||||
FSiteClientRect:=Site.ClientRect;
|
FSiteClientRect:=Site.ClientRect;
|
||||||
if CompareRect(@FSiteClientRect,@OldSiteClientRect) then exit;
|
if CompareRect(@FSiteClientRect,@OldSiteClientRect)
|
||||||
|
and (not PreferredSiteSizeAsSiteMinimum) then
|
||||||
|
exit;
|
||||||
WidthDiff:=FSiteClientRect.Right-OldSiteClientRect.Right;
|
WidthDiff:=FSiteClientRect.Right-OldSiteClientRect.Right;
|
||||||
HeightDiff:=FSiteClientRect.Bottom-OldSiteClientRect.Bottom;
|
HeightDiff:=FSiteClientRect.Bottom-OldSiteClientRect.Bottom;
|
||||||
|
|
||||||
//debugln(['TAnchorDockManager.ResetBounds ',DbgSName(Site),' ',dbgs(Child.BaseBounds),' ',WidthDiff,',',HeightDiff]);
|
//debugln(['TAnchorDockManager.ResetBounds ',DbgSName(Site),' ',dbgs(Child.BaseBounds),' ',WidthDiff,',',HeightDiff]);
|
||||||
|
ChildMaxSize:=Point(Site.ClientWidth-DockMaster.SplitterWidth,
|
||||||
|
Site.ClientHeight-DockMaster.SplitterWidth);
|
||||||
|
if PreferredSiteSizeAsSiteMinimum then begin
|
||||||
|
SiteMinSize:=GetSitePreferredClientSize;
|
||||||
|
if Child.Align in [alLeft,alRight] then begin
|
||||||
|
ChildMaxSize.X:=Max(0,(ChildMaxSize.X-SiteMinSize.X));
|
||||||
|
end else begin
|
||||||
|
ChildMaxSize.Y:=Max(0,(ChildMaxSize.Y-SiteMinSize.Y));
|
||||||
|
end;
|
||||||
|
debugln(['TAnchorDockManager.ResetBounds ChildMaxSize=',dbgs(ChildMaxSize),' SiteMinSize=',dbgs(SiteMinSize)]);
|
||||||
|
end;
|
||||||
|
|
||||||
case ResizePolicy of
|
case ResizePolicy of
|
||||||
admrpChild:
|
admrpChild:
|
||||||
begin
|
begin
|
||||||
case Child.Align of
|
if Child.Align in [alLeft,alRight] then
|
||||||
alLeft,alRight:
|
Child.Width:=Max(1,Min(ChildMaxSize.X,Child.Width+WidthDiff))
|
||||||
Child.Width:=Max(1,Min(Site.ClientWidth-DockMaster.SplitterWidth,
|
else
|
||||||
Child.Width+WidthDiff));
|
Child.Height:=Max(1,Min(ChildMaxSize.Y,Child.Height+HeightDiff));
|
||||||
alTop,alBottom:
|
|
||||||
Child.Height:=Max(1,Min(Site.ClientHeight-DockMaster.SplitterWidth,
|
|
||||||
Child.Height+HeightDiff));
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -4820,6 +4846,32 @@ begin
|
|||||||
FStoredConstraints:=Rect(MinWidth,MinHeight,MaxWidth,MaxHeight);
|
FStoredConstraints:=Rect(MinWidth,MinHeight,MaxWidth,MaxHeight);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TAnchorDockManager.GetSitePreferredClientSize: TPoint;
|
||||||
|
{ Compute the preferred inner size of Site without the ChildSite
|
||||||
|
}
|
||||||
|
var
|
||||||
|
ChildSite: TAnchorDockHostSite;
|
||||||
|
ChildSitePrefSize: TPoint;
|
||||||
|
SplitterSize: TPoint;
|
||||||
|
begin
|
||||||
|
Result:=Point(0,0);
|
||||||
|
Site.GetPreferredSize(Result.X,Result.Y);
|
||||||
|
ChildSite:=GetChildSite;
|
||||||
|
if ChildSite<>nil then begin
|
||||||
|
ChildSitePrefSize:=Point(0,0);
|
||||||
|
ChildSite.GetPreferredSize(ChildSitePrefSize.X,ChildSitePrefSize.Y,true);
|
||||||
|
SplitterSize:=Point(0,0);
|
||||||
|
if ChildSite.BoundSplitter<>nil then
|
||||||
|
ChildSite.BoundSplitter.GetPreferredSize(SplitterSize.X,SplitterSize.Y);
|
||||||
|
debugln(['TAnchorDockManager.GetSitePreferredClientSize Total=',dbgs(Result),' Child=',dbgs(ChildSitePrefSize),' Splitter=',dbgs(SplitterSize)]);
|
||||||
|
if ChildSite.Align in [alLeft,alRight] then begin
|
||||||
|
Result.X:=Max(0,Result.X-ChildSitePrefSize.X-SplitterSize.X);
|
||||||
|
end else begin
|
||||||
|
Result.Y:=Max(0,Result.Y-ChildSitePrefSize.Y-SplitterSize.Y);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TAnchorDockManager.GetChildSite: TAnchorDockHostSite;
|
function TAnchorDockManager.GetChildSite: TAnchorDockHostSite;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
@ -164,9 +164,15 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIDEAnchorDockMaster.MakeIDEWindowDockSite(AForm: TCustomForm);
|
procedure TIDEAnchorDockMaster.MakeIDEWindowDockSite(AForm: TCustomForm);
|
||||||
|
var
|
||||||
|
aManager: TAnchorDockManager;
|
||||||
begin
|
begin
|
||||||
debugln(['TIDEAnchorDockMaster.MakeIDEWindowDockSite ',DbgSName(AForm)]);
|
debugln(['TIDEAnchorDockMaster.MakeIDEWindowDockSite ',DbgSName(AForm)]);
|
||||||
DockMaster.MakeDockSite(AForm,[akBottom],admrpChild);
|
DockMaster.MakeDockSite(AForm,[akBottom],admrpChild);
|
||||||
|
if AForm.DockManager is TAnchorDockManager then begin
|
||||||
|
aManager:=TAnchorDockManager(AForm.DockManager);
|
||||||
|
aManager.PreferredSiteSizeAsSiteMinimum:=false;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TIDEAnchorDockMaster.MakeIDEWindowDockable(AControl: TWinControl);
|
procedure TIDEAnchorDockMaster.MakeIDEWindowDockable(AControl: TWinControl);
|
||||||
|
Loading…
Reference in New Issue
Block a user