mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 09:09:17 +02:00
anchordocking: implemented GetSitePreferredClientSize for common layouts
git-svn-id: trunk@46445 -
This commit is contained in:
parent
344ab1efea
commit
2720314bc1
@ -99,6 +99,9 @@ unit AnchorDocking;
|
|||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
{ $DEFINE VerboseAnchorDockRestore}
|
||||||
|
{ $DEFINE VerboseADCustomSite}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -5512,7 +5515,9 @@ var
|
|||||||
end else begin
|
end else begin
|
||||||
ChildMaxSize.Y:=Max(0,(ChildMaxSize.Y-SiteMinSize.Y));
|
ChildMaxSize.Y:=Max(0,(ChildMaxSize.Y-SiteMinSize.Y));
|
||||||
end;
|
end;
|
||||||
|
{$IF defined(VerboseAnchorDockRestore) or defined(VerboseADCustomSite)}
|
||||||
debugln(['TAnchorDockManager.ResetBounds ChildMaxSize=',dbgs(ChildMaxSize),' SiteMinSize=',dbgs(SiteMinSize),' Site.Client=',dbgs(Site.ClientRect)]);
|
debugln(['TAnchorDockManager.ResetBounds ChildMaxSize=',dbgs(ChildMaxSize),' SiteMinSize=',dbgs(SiteMinSize),' Site.Client=',dbgs(Site.ClientRect)]);
|
||||||
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
case ResizePolicy of
|
case ResizePolicy of
|
||||||
@ -5666,25 +5671,70 @@ function TAnchorDockManager.GetSitePreferredClientSize: TPoint;
|
|||||||
}
|
}
|
||||||
var
|
var
|
||||||
ChildSite: TAnchorDockHostSite;
|
ChildSite: TAnchorDockHostSite;
|
||||||
ChildSitePrefSize: TPoint;
|
Splitter: TAnchorDockSplitter;
|
||||||
SplitterSize: TPoint;
|
SplitterSize: TPoint;
|
||||||
|
i: Integer;
|
||||||
|
ChildControl: TControl;
|
||||||
|
PrefWidth: Integer;
|
||||||
|
PrefHeight: Integer;
|
||||||
|
SplitterAnchor: TAnchorKind; // side where a child is anchored to the splitter
|
||||||
|
ChildPrefWidth: integer;
|
||||||
|
ChildPrefHeight: integer;
|
||||||
|
ChildBottom: Integer;
|
||||||
|
ChildRight: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=Point(0,0);
|
Result:=Point(0,0);
|
||||||
Site.GetPreferredSize(Result.X,Result.Y);
|
Site.GetPreferredSize(Result.X,Result.Y);
|
||||||
|
// compute the bounds without the Splitter and ChildSite
|
||||||
ChildSite:=GetChildSite;
|
ChildSite:=GetChildSite;
|
||||||
if ChildSite<>nil then begin
|
if ChildSite=nil then exit;
|
||||||
// subtract the ChildSite and the splitter
|
Splitter:=ChildSite.BoundSplitter;
|
||||||
SplitterSize:=Point(0,0);
|
if Splitter=nil then exit;
|
||||||
if ChildSite.BoundSplitter<>nil then
|
SplitterSize:=Point(0,0);
|
||||||
ChildSite.BoundSplitter.GetPreferredSize(SplitterSize.X,SplitterSize.Y);
|
Splitter.GetPreferredSize(SplitterSize.X,SplitterSize.Y);
|
||||||
ChildSitePrefSize:=Point(ChildSite.Width,ChildSite.Height);
|
PrefWidth:=0;
|
||||||
debugln(['TAnchorDockManager.GetSitePreferredClientSize Total=',dbgs(Result),' Child=',dbgs(ChildSitePrefSize),' Splitter=',dbgs(SplitterSize)]);
|
PrefHeight:=0;
|
||||||
if ChildSite.Align in [alLeft,alRight] then begin
|
if ChildSite.Align in [alLeft,alRight] then
|
||||||
Result.X:=Max(0,Result.X-ChildSitePrefSize.X-SplitterSize.X);
|
PrefHeight:=Result.Y
|
||||||
end else begin
|
else
|
||||||
Result.Y:=Max(0,Result.Y-ChildSitePrefSize.Y-SplitterSize.Y);
|
PrefWidth:=Result.X;
|
||||||
|
SplitterAnchor:=MainAlignAnchor[ChildSite.Align];
|
||||||
|
for i:=0 to Site.ControlCount-1 do begin
|
||||||
|
ChildControl:=Site.Controls[i];
|
||||||
|
if (ChildControl=Splitter) or (ChildControl=ChildSite) then continue;
|
||||||
|
if (ChildControl.AnchorSide[SplitterAnchor].Control=Splitter)
|
||||||
|
or ((ChildControl.Align in [alLeft,alTop,alRight,alBottom,alClient])
|
||||||
|
and (SplitterAnchor in AnchorAlign[ChildControl.Align]))
|
||||||
|
then begin
|
||||||
|
// this control could be resized by the splitter
|
||||||
|
// => use its position and preferred size for a preferred size of the ChildSite
|
||||||
|
ChildPrefWidth:=0;
|
||||||
|
ChildPrefHeight:=0;
|
||||||
|
ChildControl.GetPreferredSize(ChildPrefWidth,ChildPrefHeight);
|
||||||
|
//debugln([' ChildControl=',DbgSName(ChildControl),' ',ChildPrefWidth,',',ChildPrefHeight]);
|
||||||
|
case ChildSite.Align of
|
||||||
|
alTop:
|
||||||
|
begin
|
||||||
|
ChildBottom:=ChildControl.Top+ChildControl.Height;
|
||||||
|
PrefHeight:=Max(PrefHeight,Site.ClientHeight-ChildBottom-ChildPrefHeight);
|
||||||
|
end;
|
||||||
|
alBottom:
|
||||||
|
PrefHeight:=Max(PrefHeight,ChildControl.Top+ChildPrefHeight);
|
||||||
|
alLeft:
|
||||||
|
begin
|
||||||
|
ChildRight:=ChildControl.Left+ChildControl.Width;
|
||||||
|
PrefWidth:=Max(PrefWidth,Site.ClientWidth-ChildRight-ChildPrefWidth);
|
||||||
|
end;
|
||||||
|
alRight:
|
||||||
|
PrefWidth:=Max(PrefWidth,ChildControl.Left+ChildPrefWidth);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
{$IFDEF VerboseADCustomSite}
|
||||||
|
debugln(['TAnchorDockManager.GetSitePreferredClientSize DefaultSitePref=',dbgs(Result),' Splitter.Align=',dbgs(Splitter.Align),' ChildSite.Align=',dbgs(ChildSite.Align),' NewPref=',PrefWidth,',',PrefHeight]);
|
||||||
|
{$ENDIF}
|
||||||
|
Result.X:=PrefWidth;
|
||||||
|
Result.Y:=PrefHeight;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAnchorDockManager.GetChildSite: TAnchorDockHostSite;
|
function TAnchorDockManager.GetChildSite: TAnchorDockHostSite;
|
||||||
|
Loading…
Reference in New Issue
Block a user