mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-23 11:40:38 +02:00
anchordocking: enforce restore bounds until idle
git-svn-id: trunk@26338 -
This commit is contained in:
parent
fa33562c9b
commit
2af9367da8
@ -157,6 +157,7 @@ type
|
|||||||
private
|
private
|
||||||
FDockBounds: TRect;
|
FDockBounds: TRect;
|
||||||
FDockParentClientSize: TSize;
|
FDockParentClientSize: TSize;
|
||||||
|
FDockRestoreBounds: TRect;
|
||||||
protected
|
protected
|
||||||
procedure SetResizeAnchor(const AValue: TAnchorKind); override;
|
procedure SetResizeAnchor(const AValue: TAnchorKind); override;
|
||||||
public
|
public
|
||||||
@ -169,6 +170,7 @@ type
|
|||||||
function SideAnchoredControlCount(Side: TAnchorKind): integer;
|
function SideAnchoredControlCount(Side: TAnchorKind): integer;
|
||||||
procedure SaveLayout(LayoutNode: TAnchorDockLayoutTreeNode);
|
procedure SaveLayout(LayoutNode: TAnchorDockLayoutTreeNode);
|
||||||
function HasOnlyOneSibling(Side: TAnchorKind; MinPos, MaxPos: integer): TControl;
|
function HasOnlyOneSibling(Side: TAnchorKind; MinPos, MaxPos: integer): TControl;
|
||||||
|
property DockRestoreBounds: TRect read FDockRestoreBounds write FDockRestoreBounds;
|
||||||
end;
|
end;
|
||||||
TAnchorDockSplitterClass = class of TAnchorDockSplitter;
|
TAnchorDockSplitterClass = class of TAnchorDockSplitter;
|
||||||
|
|
||||||
@ -228,6 +230,7 @@ type
|
|||||||
|
|
||||||
TAnchorDockHostSite = class(TCustomForm)
|
TAnchorDockHostSite = class(TCustomForm)
|
||||||
private
|
private
|
||||||
|
FDockRestoreBounds: TRect;
|
||||||
FHeader: TAnchorDockHeader;
|
FHeader: TAnchorDockHeader;
|
||||||
FHeaderSide: TAnchorKind;
|
FHeaderSide: TAnchorKind;
|
||||||
FPages: TAnchorDockPageControl;
|
FPages: TAnchorDockPageControl;
|
||||||
@ -303,6 +306,7 @@ type
|
|||||||
// save/restore layout
|
// save/restore layout
|
||||||
procedure SaveLayout(LayoutTree: TAnchorDockLayoutTree;
|
procedure SaveLayout(LayoutTree: TAnchorDockLayoutTree;
|
||||||
LayoutNode: TAnchorDockLayoutTreeNode);
|
LayoutNode: TAnchorDockLayoutTreeNode);
|
||||||
|
property DockRestoreBounds: TRect read FDockRestoreBounds write FDockRestoreBounds;
|
||||||
|
|
||||||
property HeaderSide: TAnchorKind read FHeaderSide write SetHeaderSide;
|
property HeaderSide: TAnchorKind read FHeaderSide write SetHeaderSide;
|
||||||
property Header: TAnchorDockHeader read FHeader;
|
property Header: TAnchorDockHeader read FHeader;
|
||||||
@ -386,6 +390,7 @@ type
|
|||||||
FHeaderButtonSize: integer;
|
FHeaderButtonSize: integer;
|
||||||
FHeaderClass: TAnchorDockHeaderClass;
|
FHeaderClass: TAnchorDockHeaderClass;
|
||||||
FHeaderHint: string;
|
FHeaderHint: string;
|
||||||
|
FIdleConnected: Boolean;
|
||||||
FManagerClass: TAnchorDockManagerClass;
|
FManagerClass: TAnchorDockManagerClass;
|
||||||
FOnCreateControl: TADCreateControlEvent;
|
FOnCreateControl: TADCreateControlEvent;
|
||||||
FOnShowOptions: TADShowDockMasterOptionsEvent;
|
FOnShowOptions: TADShowDockMasterOptionsEvent;
|
||||||
@ -393,6 +398,7 @@ type
|
|||||||
FPageClass: TAnchorDockPageClass;
|
FPageClass: TAnchorDockPageClass;
|
||||||
FPageControlClass: TAnchorDockPageControlClass;
|
FPageControlClass: TAnchorDockPageControlClass;
|
||||||
FRestoreLayouts: TAnchorDockRestoreLayouts;
|
FRestoreLayouts: TAnchorDockRestoreLayouts;
|
||||||
|
FRestoring: boolean;
|
||||||
FScaleOnResize: boolean;
|
FScaleOnResize: boolean;
|
||||||
FShowHeaderCaption: boolean;
|
FShowHeaderCaption: boolean;
|
||||||
FHideHeaderCaptionFloatingControl: boolean;
|
FHideHeaderCaptionFloatingControl: boolean;
|
||||||
@ -417,6 +423,8 @@ type
|
|||||||
procedure PopupMenuPopup(Sender: TObject);
|
procedure PopupMenuPopup(Sender: TObject);
|
||||||
procedure ChangeLockButtonClick(Sender: TObject);
|
procedure ChangeLockButtonClick(Sender: TObject);
|
||||||
procedure OptionsClick(Sender: TObject);
|
procedure OptionsClick(Sender: TObject);
|
||||||
|
procedure SetIdleConnected(const AValue: Boolean);
|
||||||
|
procedure SetRestoring(const AValue: boolean);
|
||||||
protected
|
protected
|
||||||
fCloseBtnReferenceCount: integer;
|
fCloseBtnReferenceCount: integer;
|
||||||
fCloseBtnBitmap: TBitmap;
|
fCloseBtnBitmap: TBitmap;
|
||||||
@ -433,6 +441,7 @@ type
|
|||||||
procedure SetShowHeaderCaption(const AValue: boolean);
|
procedure SetShowHeaderCaption(const AValue: boolean);
|
||||||
procedure SetHideHeaderCaptionFloatingControl(const AValue: boolean);
|
procedure SetHideHeaderCaptionFloatingControl(const AValue: boolean);
|
||||||
procedure SetSplitterWidth(const AValue: integer);
|
procedure SetSplitterWidth(const AValue: integer);
|
||||||
|
procedure OnIdle(Sender: TObject; var Done: Boolean);
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -474,6 +483,8 @@ type
|
|||||||
function ConfigIsEmpty(Config: TConfigStorage): boolean;
|
function ConfigIsEmpty(Config: TConfigStorage): boolean;
|
||||||
function LoadLayoutFromConfig(Config: TConfigStorage; Scale: Boolean): boolean;
|
function LoadLayoutFromConfig(Config: TConfigStorage; Scale: Boolean): boolean;
|
||||||
property RestoreLayouts: TAnchorDockRestoreLayouts read FRestoreLayouts;
|
property RestoreLayouts: TAnchorDockRestoreLayouts read FRestoreLayouts;
|
||||||
|
property Restoring: boolean read FRestoring write SetRestoring;
|
||||||
|
property IdleConnected: Boolean read FIdleConnected write SetIdleConnected;
|
||||||
|
|
||||||
// manual docking
|
// manual docking
|
||||||
procedure ManualFloat(AControl: TControl);
|
procedure ManualFloat(AControl: TControl);
|
||||||
@ -1248,6 +1259,7 @@ var
|
|||||||
end;
|
end;
|
||||||
if Site is TAnchorDockHostSite then begin
|
if Site is TAnchorDockHostSite then begin
|
||||||
TAnchorDockHostSite(Site).Header.HeaderPosition:=Node.HeaderPosition;
|
TAnchorDockHostSite(Site).Header.HeaderPosition:=Node.HeaderPosition;
|
||||||
|
TAnchorDockHostSite(Site).DockRestoreBounds:=NewBounds;
|
||||||
end;
|
end;
|
||||||
if Parent=nil then begin
|
if Parent=nil then begin
|
||||||
Site.WindowState:=Node.WindowState;
|
Site.WindowState:=Node.WindowState;
|
||||||
@ -1326,6 +1338,7 @@ var
|
|||||||
if SrcRectValid(SrcRect) then
|
if SrcRectValid(SrcRect) then
|
||||||
NewBounds:=Bounds(ScaleX(NewBounds.Left,SrcRect),ScaleX(NewBounds.Top,SrcRect),
|
NewBounds:=Bounds(ScaleX(NewBounds.Left,SrcRect),ScaleX(NewBounds.Top,SrcRect),
|
||||||
NewBounds.Right-NewBounds.Left,NewBounds.Bottom-NewBounds.Top);
|
NewBounds.Right-NewBounds.Left,NewBounds.Bottom-NewBounds.Top);
|
||||||
|
Splitter.DockRestoreBounds:=NewBounds;
|
||||||
Splitter.BoundsRect:=NewBounds;
|
Splitter.BoundsRect:=NewBounds;
|
||||||
if Node.NodeType=adltnSplitterVertical then
|
if Node.NodeType=adltnSplitterVertical then
|
||||||
Splitter.ResizeAnchor:=akLeft
|
Splitter.ResizeAnchor:=akLeft
|
||||||
@ -1411,6 +1424,7 @@ begin
|
|||||||
Result:=true;
|
Result:=true;
|
||||||
WorkArea:=Rect(0,0,0,0);
|
WorkArea:=Rect(0,0,0,0);
|
||||||
Restore(Tree.Root,nil,Rect(0,0,0,0));
|
Restore(Tree.Root,nil,Rect(0,0,0,0));
|
||||||
|
Restoring:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAnchorDockMaster.DoCreateControl(aName: string;
|
function TAnchorDockMaster.DoCreateControl(aName: string;
|
||||||
@ -1522,6 +1536,13 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TAnchorDockMaster.OnIdle(Sender: TObject; var Done: Boolean);
|
||||||
|
begin
|
||||||
|
if Done then ;
|
||||||
|
Restoring:=false;
|
||||||
|
IdleConnected:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TAnchorDockMaster.ChangeLockButtonClick(Sender: TObject);
|
procedure TAnchorDockMaster.ChangeLockButtonClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
AllowDragging:=not AllowDragging;
|
AllowDragging:=not AllowDragging;
|
||||||
@ -1532,6 +1553,36 @@ begin
|
|||||||
if Assigned(OnShowOptions) then OnShowOptions(Self);
|
if Assigned(OnShowOptions) then OnShowOptions(Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TAnchorDockMaster.SetIdleConnected(const AValue: Boolean);
|
||||||
|
begin
|
||||||
|
if FIdleConnected=AValue then exit;
|
||||||
|
FIdleConnected:=AValue;
|
||||||
|
if IdleConnected then
|
||||||
|
Application.AddOnIdleHandler(@OnIdle,true)
|
||||||
|
else
|
||||||
|
Application.RemoveOnIdleHandler(@OnIdle);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAnchorDockMaster.SetRestoring(const AValue: boolean);
|
||||||
|
var
|
||||||
|
AComponent: TComponent;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
if FRestoring=AValue then exit;
|
||||||
|
FRestoring:=AValue;
|
||||||
|
if FRestoring then begin
|
||||||
|
IdleConnected:=true;
|
||||||
|
end else begin
|
||||||
|
for i:=0 to ComponentCount-1 do begin
|
||||||
|
AComponent:=Components[i];
|
||||||
|
if AComponent is TAnchorDockHostSite then
|
||||||
|
TAnchorDockHostSite(AComponent).DockRestoreBounds:=Rect(0,0,0,0)
|
||||||
|
else if AComponent is TAnchorDockSplitter then
|
||||||
|
TAnchorDockSplitter(AComponent).DockRestoreBounds:=Rect(0,0,0,0)
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TAnchorDockMaster.SetHeaderButtonSize(const AValue: integer);
|
procedure TAnchorDockMaster.SetHeaderButtonSize(const AValue: integer);
|
||||||
begin
|
begin
|
||||||
if FHeaderButtonSize=AValue then exit;
|
if FHeaderButtonSize=AValue then exit;
|
||||||
@ -3382,7 +3433,8 @@ var
|
|||||||
begin
|
begin
|
||||||
inherited AlignControls(AControl, ARect);
|
inherited AlignControls(AControl, ARect);
|
||||||
if csDestroying in ComponentState then exit;
|
if csDestroying in ComponentState then exit;
|
||||||
if DockMaster.ScaleOnResize and (not UpdatingLayout) then begin
|
if DockMaster.ScaleOnResize and (not UpdatingLayout)
|
||||||
|
and (not DockMaster.Restoring) then begin
|
||||||
// scale splitters
|
// scale splitters
|
||||||
for i:=0 to ControlCount-1 do begin
|
for i:=0 to ControlCount-1 do begin
|
||||||
Child:=Controls[i];
|
Child:=Controls[i];
|
||||||
@ -4711,19 +4763,43 @@ var
|
|||||||
HeightDiff: Integer;
|
HeightDiff: Integer;
|
||||||
SiteMinSize: TPoint;
|
SiteMinSize: TPoint;
|
||||||
ChildMaxSize: TPoint;
|
ChildMaxSize: TPoint;
|
||||||
|
ClientRectChanged: Boolean;
|
||||||
|
AControl: TControl;
|
||||||
|
b: TRect;
|
||||||
|
i: Integer;
|
||||||
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)]);
|
||||||
|
OldSiteClientRect:=FSiteClientRect;
|
||||||
|
FSiteClientRect:=Site.ClientRect;
|
||||||
|
WidthDiff:=FSiteClientRect.Right-OldSiteClientRect.Right;
|
||||||
|
HeightDiff:=FSiteClientRect.Bottom-OldSiteClientRect.Bottom;
|
||||||
|
ClientRectChanged:=(WidthDiff<>0) or (HeightDiff<>0);
|
||||||
|
if (not ClientRectChanged) and (not PreferredSiteSizeAsSiteMinimum) then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
if ClientRectChanged and DockMaster.Restoring then begin
|
||||||
|
// ClientRect changed => restore bounds
|
||||||
|
for i:=0 to Site.ControlCount-1 do begin
|
||||||
|
AControl:=Site.Controls[i];
|
||||||
|
b:=Rect(0,0,0,0);
|
||||||
|
if AControl is TAnchorDockHostSite then
|
||||||
|
b:=TAnchorDockHostSite(AControl).DockRestoreBounds
|
||||||
|
else if AControl is TAnchorDockSplitter then
|
||||||
|
b:=TAnchorDockSplitter(AControl).DockRestoreBounds;
|
||||||
|
if (b.Right>b.Left) and (b.Bottom>b.Top) then begin
|
||||||
|
AControl.BoundsRect:=b;
|
||||||
|
if AControl is TAnchorDockSplitter then
|
||||||
|
TAnchorDockSplitter(AControl).UpdateDockBounds;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
if DockSite<>nil then exit;
|
if DockSite<>nil then exit;
|
||||||
Child:=GetChildSite;
|
Child:=GetChildSite;
|
||||||
if Child=nil then exit;
|
if Child=nil then exit;
|
||||||
OldSiteClientRect:=FSiteClientRect;
|
|
||||||
FSiteClientRect:=Site.ClientRect;
|
|
||||||
if CompareRect(@FSiteClientRect,@OldSiteClientRect)
|
|
||||||
and (not PreferredSiteSizeAsSiteMinimum) then
|
|
||||||
exit;
|
|
||||||
WidthDiff:=FSiteClientRect.Right-OldSiteClientRect.Right;
|
|
||||||
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,
|
ChildMaxSize:=Point(Site.ClientWidth-DockMaster.SplitterWidth,
|
||||||
|
Loading…
Reference in New Issue
Block a user