mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 12:49:13 +02:00
anchordocking: dnd move page
git-svn-id: trunk@26060 -
This commit is contained in:
parent
f490888a1c
commit
850ce0c034
@ -58,6 +58,7 @@
|
|||||||
- enlarge side to left, top, right, bottom
|
- enlarge side to left, top, right, bottom
|
||||||
- move page left, right, leftmost, rightmost
|
- move page left, right, leftmost, rightmost
|
||||||
- close page
|
- close page
|
||||||
|
- tab position (default, left, top, right, bottom)
|
||||||
- dock site: MakeDockSite for forms, that should be able to dock other sites,
|
- dock site: MakeDockSite for forms, that should be able to dock other sites,
|
||||||
but should not be docked themselves. Their Parent is always nil.
|
but should not be docked themselves. Their Parent is always nil.
|
||||||
- design time package for IDE
|
- design time package for IDE
|
||||||
@ -66,7 +67,6 @@
|
|||||||
- popup menu
|
- popup menu
|
||||||
- shrink side left, top, right, bottom
|
- shrink side left, top, right, bottom
|
||||||
- options
|
- options
|
||||||
- tab position (default, left, top, right, bottom)
|
|
||||||
- fpdoc
|
- fpdoc
|
||||||
- examples on wiki:
|
- examples on wiki:
|
||||||
screenshots
|
screenshots
|
||||||
@ -227,7 +227,7 @@ type
|
|||||||
Inside: boolean): boolean; virtual;
|
Inside: boolean): boolean; virtual;
|
||||||
procedure CreatePages; virtual;
|
procedure CreatePages; virtual;
|
||||||
function DockSecondPage(NewControl: TControl): boolean; virtual;
|
function DockSecondPage(NewControl: TControl): boolean; virtual;
|
||||||
function DockAnotherPage(NewControl: TControl): boolean; virtual;
|
function DockAnotherPage(NewControl: TControl; InFrontOf: TControl): boolean; virtual;
|
||||||
procedure AddCleanControl(AControl: TControl; TheAlign: TAlign = alNone);
|
procedure AddCleanControl(AControl: TControl; TheAlign: TAlign = alNone);
|
||||||
procedure RemoveControlFromLayout(AControl: TControl);
|
procedure RemoveControlFromLayout(AControl: TControl);
|
||||||
procedure RemoveSpiralSplitter(AControl: TControl);
|
procedure RemoveSpiralSplitter(AControl: TControl);
|
||||||
@ -1989,13 +1989,13 @@ begin
|
|||||||
if SiteType=adhstOneControl then begin
|
if SiteType=adhstOneControl then begin
|
||||||
if Parent is TAnchorDockPage then begin
|
if Parent is TAnchorDockPage then begin
|
||||||
// add as sibling page
|
// add as sibling page
|
||||||
Result:=(Parent.Parent.Parent as TAnchorDockHostSite).DockAnotherPage(NewControl);
|
Result:=(Parent.Parent.Parent as TAnchorDockHostSite).DockAnotherPage(NewControl,nil);
|
||||||
end else
|
end else
|
||||||
// create pages
|
// create pages
|
||||||
Result:=DockSecondPage(NewControl);
|
Result:=DockSecondPage(NewControl);
|
||||||
end else if SiteType=adhstPages then
|
end else if SiteType=adhstPages then
|
||||||
// add as sibling page
|
// add as sibling page
|
||||||
Result:=DockAnotherPage(NewControl)
|
Result:=DockAnotherPage(NewControl,DragDockObject.DropOnControl);
|
||||||
end else if DragDockObject.DropAlign in [alLeft,alTop,alRight,alBottom] then
|
end else if DragDockObject.DropAlign in [alLeft,alTop,alRight,alBottom] then
|
||||||
begin
|
begin
|
||||||
// anchor docking
|
// anchor docking
|
||||||
@ -2372,12 +2372,14 @@ begin
|
|||||||
OldSite.Align:=alClient;
|
OldSite.Align:=alClient;
|
||||||
OldSite.Visible:=true;
|
OldSite.Visible:=true;
|
||||||
|
|
||||||
Result:=DockAnotherPage(NewControl);
|
Result:=DockAnotherPage(NewControl,nil);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAnchorDockHostSite.DockAnotherPage(NewControl: TControl): boolean;
|
function TAnchorDockHostSite.DockAnotherPage(NewControl: TControl;
|
||||||
|
InFrontOf: TControl): boolean;
|
||||||
var
|
var
|
||||||
NewSite: TAnchorDockHostSite;
|
NewSite: TAnchorDockHostSite;
|
||||||
|
NewIndex: LongInt;
|
||||||
begin
|
begin
|
||||||
debugln(['TAnchorDockHostSite.DockAnotherPage Self="',Caption,'" make new control (',DbgSName(NewControl),') dockable ...']);
|
debugln(['TAnchorDockHostSite.DockAnotherPage Self="',Caption,'" make new control (',DbgSName(NewControl),') dockable ...']);
|
||||||
if SiteType<>adhstPages then
|
if SiteType<>adhstPages then
|
||||||
@ -2385,12 +2387,16 @@ begin
|
|||||||
|
|
||||||
NewSite:=GetSite(NewControl);
|
NewSite:=GetSite(NewControl);
|
||||||
//debugln(['TAnchorDockHostSite.DockAnotherPage Self="',Caption,'" adding newcontrol site ...']);
|
//debugln(['TAnchorDockHostSite.DockAnotherPage Self="',Caption,'" adding newcontrol site ...']);
|
||||||
FPages.Pages.Add(NewSite.Caption);
|
NewIndex:=FPages.PageCount;
|
||||||
|
if (InFrontOf is TAnchorDockPage)
|
||||||
|
and (InFrontOf.Parent=Pages) then
|
||||||
|
NewIndex:=TAnchorDockPage(InFrontOf).PageIndex;
|
||||||
|
Pages.Pages.Insert(NewIndex,NewSite.Caption);
|
||||||
//debugln(['TAnchorDockHostSite.DockAnotherPage ',DbgSName(FPages.Page[1])]);
|
//debugln(['TAnchorDockHostSite.DockAnotherPage ',DbgSName(FPages.Page[1])]);
|
||||||
NewSite.Parent:=FPages.Page[FPages.PageCount-1];
|
NewSite.Parent:=FPages.Page[NewIndex];
|
||||||
NewSite.Align:=alClient;
|
NewSite.Align:=alClient;
|
||||||
NewSite.Visible:=true;
|
NewSite.Visible:=true;
|
||||||
FPages.PageIndex:=FPages.PageCount-1;
|
FPages.PageIndex:=NewIndex;
|
||||||
|
|
||||||
Result:=true;
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
@ -3861,7 +3867,7 @@ end;
|
|||||||
procedure TAnchorDockManager.PositionDockRect(Client, DropCtl: TControl;
|
procedure TAnchorDockManager.PositionDockRect(Client, DropCtl: TControl;
|
||||||
DropAlign: TAlign; var DockRect: TRect);
|
DropAlign: TAlign; var DockRect: TRect);
|
||||||
{ Client = dragged source site (a TAnchorDockHostSite)
|
{ Client = dragged source site (a TAnchorDockHostSite)
|
||||||
DropCtl is dragged child control of Client
|
DropCtl is target control (the DockSite, DockSite.Pages or one of the pages)
|
||||||
DropAlign: where on Client DropCtl should be placed
|
DropAlign: where on Client DropCtl should be placed
|
||||||
DockRect: the estimated new bounds of DropCtl
|
DockRect: the estimated new bounds of DropCtl
|
||||||
}
|
}
|
||||||
@ -3869,6 +3875,31 @@ var
|
|||||||
Offset: TPoint;
|
Offset: TPoint;
|
||||||
Inside: Boolean;
|
Inside: Boolean;
|
||||||
begin
|
begin
|
||||||
|
if (DropAlign=alClient) and (DockSite<>nil) and (DockSite.Pages<>nil) then begin
|
||||||
|
// dock into pages
|
||||||
|
if DropCtl=DockSite.Pages then begin
|
||||||
|
// dock as last page
|
||||||
|
DockRect:=DockSite.Pages.TabRect(DockSite.Pages.PageCount-1);
|
||||||
|
case DockSite.Pages.TabPosition of
|
||||||
|
tpTop,tpBottom: DockRect.Left:=(DockRect.Left+DockRect.Right) div 2;
|
||||||
|
tpLeft,tpRight: DockRect.Top:=(DockRect.Top+DockRect.Bottom) div 2;
|
||||||
|
end;
|
||||||
|
Offset:=DockSite.Pages.ClientOrigin;
|
||||||
|
OffsetRect(DockRect,Offset.X,Offset.Y);
|
||||||
|
exit;
|
||||||
|
end else if DropCtl is TAnchorDockPage then begin
|
||||||
|
// dock in front of page
|
||||||
|
DockRect:=DockSite.Pages.TabRect(TAnchorDockPage(DropCtl).PageIndex);
|
||||||
|
case DockSite.Pages.TabPosition of
|
||||||
|
tpTop,tpBottom: DockRect.Right:=(DockRect.Left+DockRect.Right) div 2;
|
||||||
|
tpLeft,tpRight: DockRect.Bottom:=(DockRect.Top+DockRect.Bottom) div 2;
|
||||||
|
end;
|
||||||
|
Offset:=DockSite.Pages.ClientOrigin;
|
||||||
|
OffsetRect(DockRect,Offset.X,Offset.Y);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
Inside:=(DropCtl=Site);
|
Inside:=(DropCtl=Site);
|
||||||
if (not Inside) and (Site.Parent<>nil) then begin
|
if (not Inside) and (Site.Parent<>nil) then begin
|
||||||
if (Site.Parent is TAnchorDockHostSite)
|
if (Site.Parent is TAnchorDockHostSite)
|
||||||
@ -4002,6 +4033,8 @@ var
|
|||||||
|
|
||||||
var
|
var
|
||||||
p: TPoint;
|
p: TPoint;
|
||||||
|
LastTabRect: TRect;
|
||||||
|
TabIndex: longint;
|
||||||
begin
|
begin
|
||||||
//debugln(['TAnchorDockManager.GetDockEdge ',DbgSName(Site),' ',DbgSName(DockSite),' DockableSites=',dbgs(DockableSites)]);
|
//debugln(['TAnchorDockManager.GetDockEdge ',DbgSName(Site),' ',DbgSName(DockSite),' DockableSites=',dbgs(DockableSites)]);
|
||||||
if DockableSites=[] then begin
|
if DockableSites=[] then begin
|
||||||
@ -4010,7 +4043,25 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
p:=Site.ScreenToClient(ADockObject.DragPos);
|
p:=Site.ScreenToClient(ADockObject.DragPos);
|
||||||
if (DockSite<>nil) and PtInRect(DockSite.GetPageArea,p) then begin
|
if (DockSite<>nil) and (DockSite.Pages<>nil) then begin
|
||||||
|
// page docking
|
||||||
|
ADockObject.DropAlign:=alClient;
|
||||||
|
p:=DockSite.Pages.ScreenToClient(ADockObject.DragPos);
|
||||||
|
LastTabRect:=DockSite.Pages.TabRect(DockSite.Pages.PageCount-1);
|
||||||
|
if (p.Y>=LastTabRect.Top) and (p.y<LastTabRect.Bottom) then begin
|
||||||
|
// specific tab
|
||||||
|
if p.X>=LastTabRect.Right then begin
|
||||||
|
// insert as last
|
||||||
|
ADockObject.DropOnControl:=DockSite.Pages;
|
||||||
|
end else begin
|
||||||
|
TabIndex:=DockSite.Pages.TabIndexAtClientPos(p);
|
||||||
|
if TabIndex>=0 then begin
|
||||||
|
// insert in front of an existing
|
||||||
|
ADockObject.DropOnControl:=DockSite.Pages.Page[TabIndex];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end else if (DockSite<>nil) and PtInRect(DockSite.GetPageArea,p) then begin
|
||||||
// page docking
|
// page docking
|
||||||
ADockObject.DropAlign:=alClient;
|
ADockObject.DropAlign:=alClient;
|
||||||
end else begin
|
end else begin
|
||||||
|
@ -124,7 +124,7 @@ begin
|
|||||||
SetBounds(100,50,600,80);
|
SetBounds(100,50,600,80);
|
||||||
ViewSrcEditor1ToolButtonClick(Self);
|
ViewSrcEditor1ToolButtonClick(Self);
|
||||||
ViewMessagesToolButtonClick(Self);
|
ViewMessagesToolButtonClick(Self);
|
||||||
//ViewOIToolButtonClick(Self);
|
ViewOIToolButtonClick(Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainIDE.LoadLayoutToolButtonClick(Sender: TObject);
|
procedure TMainIDE.LoadLayoutToolButtonClick(Sender: TObject);
|
||||||
|
Loading…
Reference in New Issue
Block a user