mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-12 09:39:16 +02:00
anchordocking: restoretest: compute bounds
git-svn-id: trunk@39717 -
This commit is contained in:
parent
4dd594eaaf
commit
5fd97861f3
@ -5,30 +5,43 @@ unit ADLayoutViewer;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, Controls, Graphics, AnchorDockStorage;
|
Classes, SysUtils, types, math, Controls, Graphics, AnchorDockStorage;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
TADLTVMonitor = class
|
||||||
|
public
|
||||||
|
Monitor: integer;
|
||||||
|
WorkArea: TRect;
|
||||||
|
Bounds: TRect; // hull of all windows on this monitor
|
||||||
|
X, Y: integer;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TADLayoutTreeView }
|
{ TADLayoutTreeView }
|
||||||
|
|
||||||
TADLayoutTreeView = class(TCustomControl)
|
TADLayoutTreeView = class(TCustomControl)
|
||||||
private
|
private
|
||||||
FLayout: TAnchorDockLayoutTree;
|
FLayout: TAnchorDockLayoutTree;
|
||||||
FLayoutMaxX: integer;
|
|
||||||
FLayoutMaxY: integer;
|
|
||||||
FLayoutMinX: integer;
|
|
||||||
FLayoutMinY: integer;
|
|
||||||
FScale: double;
|
FScale: double;
|
||||||
FScaledMaxX: integer;
|
FBounds: TRect;
|
||||||
FScaledMaxY: integer;
|
FScaledBounds: TRect;
|
||||||
FScaledMinX: integer;
|
FScaledScroll: TPoint;
|
||||||
FScaledMinY: integer;
|
FMonitors: array of TADLTVMonitor;
|
||||||
FScaledOffsetX: integer;
|
function GetLayoutMaxX: integer;
|
||||||
FScaledOffsetY: integer;
|
function GetLayoutMaxY: integer;
|
||||||
|
function GetLayoutMinX: integer;
|
||||||
|
function GetLayoutMinY: integer;
|
||||||
|
function GetScaledMaxX: integer;
|
||||||
|
function GetScaledMaxY: integer;
|
||||||
|
function GetScaledMinX: integer;
|
||||||
|
function GetScaledMinY: integer;
|
||||||
|
function GetScaledOffsetX: integer;
|
||||||
|
function GetScaledOffsetY: integer;
|
||||||
procedure SetScale(AValue: double);
|
procedure SetScale(AValue: double);
|
||||||
procedure SetScaledOffsetX(AValue: integer);
|
procedure SetScaledOffsetX(AValue: integer);
|
||||||
procedure SetScaledOffsetY(AValue: integer);
|
procedure SetScaledOffsetY(AValue: integer);
|
||||||
procedure ComputeLayout;
|
procedure ComputeLayout;
|
||||||
|
procedure ClearMonitors;
|
||||||
|
function FindMonitor(Monitor: integer): TADLTVMonitor;
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -36,16 +49,16 @@ type
|
|||||||
procedure LayoutChanged; virtual;
|
procedure LayoutChanged; virtual;
|
||||||
property Layout: TAnchorDockLayoutTree read FLayout;
|
property Layout: TAnchorDockLayoutTree read FLayout;
|
||||||
property Scale: double read FScale write SetScale;
|
property Scale: double read FScale write SetScale;
|
||||||
property ScaledOffsetX: integer read FScaledOffsetX write SetScaledOffsetX;
|
property ScaledOffsetX: integer read GetScaledOffsetX write SetScaledOffsetX;
|
||||||
property ScaledOffsetY: integer read FScaledOffsetY write SetScaledOffsetY;
|
property ScaledOffsetY: integer read GetScaledOffsetY write SetScaledOffsetY;
|
||||||
property LayoutMinX: integer read FLayoutMinX;
|
property LayoutMinX: integer read GetLayoutMinX;
|
||||||
property LayoutMinY: integer read FLayoutMinY;
|
property LayoutMinY: integer read GetLayoutMinY;
|
||||||
property LayoutMaxX: integer read FLayoutMaxX;
|
property LayoutMaxX: integer read GetLayoutMaxX;
|
||||||
property LayoutMaxY: integer read FLayoutMaxY;
|
property LayoutMaxY: integer read GetLayoutMaxY;
|
||||||
property ScaledMinX: integer read FScaledMinX;
|
property ScaledMinX: integer read GetScaledMinX;
|
||||||
property ScaledMinY: integer read FScaledMinY;
|
property ScaledMinY: integer read GetScaledMinY;
|
||||||
property ScaledMaxX: integer read FScaledMaxX;
|
property ScaledMaxX: integer read GetScaledMaxX;
|
||||||
property ScaledMaxY: integer read FScaledMaxY;
|
property ScaledMaxY: integer read GetScaledMaxY;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -58,22 +71,162 @@ begin
|
|||||||
FScale:=AValue;
|
FScale:=AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetLayoutMaxX: integer;
|
||||||
|
begin
|
||||||
|
Result:=FBounds.Right;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetLayoutMaxY: integer;
|
||||||
|
begin
|
||||||
|
Result:=FBounds.Bottom;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetLayoutMinX: integer;
|
||||||
|
begin
|
||||||
|
Result:=FBounds.Left;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetLayoutMinY: integer;
|
||||||
|
begin
|
||||||
|
Result:=FBounds.Top;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetScaledMaxX: integer;
|
||||||
|
begin
|
||||||
|
Result:=FScaledBounds.Right;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetScaledMaxY: integer;
|
||||||
|
begin
|
||||||
|
Result:=FScaledBounds.Bottom;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetScaledMinX: integer;
|
||||||
|
begin
|
||||||
|
Result:=FScaledBounds.Left;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetScaledMinY: integer;
|
||||||
|
begin
|
||||||
|
Result:=FScaledBounds.Top;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetScaledOffsetX: integer;
|
||||||
|
begin
|
||||||
|
Result:=FScaledScroll.X;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.GetScaledOffsetY: integer;
|
||||||
|
begin
|
||||||
|
Result:=FScaledScroll.Y;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TADLayoutTreeView.SetScaledOffsetX(AValue: integer);
|
procedure TADLayoutTreeView.SetScaledOffsetX(AValue: integer);
|
||||||
begin
|
begin
|
||||||
if FScaledOffsetX=AValue then Exit;
|
if FScaledScroll.X=AValue then Exit;
|
||||||
FScaledOffsetX:=AValue;
|
FScaledScroll.X:=AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TADLayoutTreeView.SetScaledOffsetY(AValue: integer);
|
procedure TADLayoutTreeView.SetScaledOffsetY(AValue: integer);
|
||||||
begin
|
begin
|
||||||
if FScaledOffsetY=AValue then Exit;
|
if FScaledScroll.Y=AValue then Exit;
|
||||||
FScaledOffsetY:=AValue;
|
FScaledScroll.Y:=AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TADLayoutTreeView.ComputeLayout;
|
procedure TADLayoutTreeView.ComputeLayout;
|
||||||
|
|
||||||
|
procedure ComputeMonitors(Node: TAnchorDockLayoutTreeNode);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
Monitor: TADLTVMonitor;
|
||||||
|
r: TRect;
|
||||||
|
begin
|
||||||
|
if Node=nil then exit;
|
||||||
|
if Node.NodeType in [adltnLayout,adltnCustomSite] then begin
|
||||||
|
// top level window
|
||||||
|
Monitor:=FindMonitor(Node.Monitor);
|
||||||
|
if Monitor=nil then begin
|
||||||
|
// first window on this monitor
|
||||||
|
Monitor:=TADLTVMonitor.Create;
|
||||||
|
Monitor.Monitor:=Node.Monitor;
|
||||||
|
Monitor.WorkArea:=Node.WorkAreaRect;
|
||||||
|
Monitor.Bounds:=Node.BoundsRect;
|
||||||
|
end else begin
|
||||||
|
// another window on this monitor
|
||||||
|
r:=Rect(0,0,0,0);
|
||||||
|
UnionRect(r,Monitor.Bounds,Node.BoundsRect);
|
||||||
|
Monitor.Bounds:=r;
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
for i:=0 to Node.Count-1 do
|
||||||
|
ComputeMonitors(Node[i]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
Monitor: TADLTVMonitor;
|
||||||
|
TileSize: TPoint;
|
||||||
|
TileCols: Integer;
|
||||||
|
LeftMost: Integer;
|
||||||
|
TopMost: Integer;
|
||||||
|
TileCol: Integer;
|
||||||
|
TileRow: Integer;
|
||||||
|
TileLeft: Integer;
|
||||||
|
TileTop: Integer;
|
||||||
begin
|
begin
|
||||||
if FLayout=nil then exit;
|
if FLayout=nil then exit;
|
||||||
|
// clear computed values
|
||||||
|
FBounds:=Rect(0,0,0,0);
|
||||||
|
FScaledBounds:=Rect(0,0,0,0);
|
||||||
|
ClearMonitors;
|
||||||
|
// collect all monitor bounds
|
||||||
|
ComputeMonitors(FLayout.Root);
|
||||||
|
if length(FMonitors)=0 then exit;
|
||||||
|
// get biggest monitor
|
||||||
|
TileSize:=Point(0,0);
|
||||||
|
for i:=0 to length(FMonitors)-1 do begin
|
||||||
|
Monitor:=FMonitors[i];
|
||||||
|
Monitor.Bounds.Right:=Max(Monitor.Bounds.Left,Monitor.Bounds.Right);
|
||||||
|
Monitor.Bounds.Bottom:=Max(Monitor.Bounds.Top,Monitor.Bounds.Bottom);
|
||||||
|
TileSize.X:=Max(TileSize.X,Monitor.Bounds.Right-Monitor.Bounds.Left);
|
||||||
|
TileSize.X:=Max(TileSize.X,Monitor.WorkArea.Right-Monitor.WorkArea.Left);
|
||||||
|
TileSize.Y:=Max(TileSize.Y,Monitor.Bounds.Bottom-Monitor.Bounds.Top);
|
||||||
|
TileSize.Y:=Max(TileSize.Y,Monitor.WorkArea.Bottom-Monitor.WorkArea.Top);
|
||||||
|
end;
|
||||||
|
// put monitors into tiles of same size in a quadratic layout
|
||||||
|
TileCols:=ceil(SQRT(length(FMonitors)));
|
||||||
|
for i:=0 to length(FMonitors)-1 do begin
|
||||||
|
Monitor:=FMonitors[i];
|
||||||
|
LeftMost:=Min(Monitor.WorkArea.Left,Monitor.Bounds.Left);
|
||||||
|
TopMost:=Min(Monitor.WorkArea.Top,Monitor.Bounds.Top);
|
||||||
|
TileCol:=i mod TileCols;
|
||||||
|
TileRow:=i div TileCols;
|
||||||
|
TileLeft:=TileCol*TileSize.X;
|
||||||
|
TileTop:=TileRow*TileSize.Y;
|
||||||
|
// move left/topmost to left,top of tile
|
||||||
|
Monitor.X:=TileLeft-LeftMost;
|
||||||
|
Monitor.Y:=TileTop-TopMost;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TADLayoutTreeView.ClearMonitors;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to length(FMonitors)-1 do FreeAndNil(FMonitors[i]);
|
||||||
|
SetLength(FMonitors,0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADLayoutTreeView.FindMonitor(Monitor: integer): TADLTVMonitor;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to length(FMonitors)-1 do begin
|
||||||
|
Result:=FMonitors[i];
|
||||||
|
if Result.Monitor=Monitor then exit;
|
||||||
|
end;
|
||||||
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TADLayoutTreeView.Create(AOwner: TComponent);
|
constructor TADLayoutTreeView.Create(AOwner: TComponent);
|
||||||
@ -85,6 +238,7 @@ end;
|
|||||||
destructor TADLayoutTreeView.Destroy;
|
destructor TADLayoutTreeView.Destroy;
|
||||||
begin
|
begin
|
||||||
FreeAndNil(FLayout);
|
FreeAndNil(FLayout);
|
||||||
|
ClearMonitors;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -61,19 +61,19 @@ type
|
|||||||
procedure FormCreate(Sender: TObject);
|
procedure FormCreate(Sender: TObject);
|
||||||
procedure FormDestroy(Sender: TObject);
|
procedure FormDestroy(Sender: TObject);
|
||||||
private
|
private
|
||||||
FRestoredLayout: TAnchorDockLayoutTree;
|
|
||||||
FOriginalFilename: string;
|
FOriginalFilename: string;
|
||||||
FOriginalLayout: TAnchorDockLayoutTree;
|
|
||||||
FSettings: TAnchorDockSettings;
|
FSettings: TAnchorDockSettings;
|
||||||
|
function GetOriginalLayout: TAnchorDockLayoutTree;
|
||||||
|
function GetRestoredLayout: TAnchorDockLayoutTree;
|
||||||
public
|
public
|
||||||
OriginalView: TADLayoutTreeView;
|
OriginalView: TADLayoutTreeView;
|
||||||
RestoredView: TADLayoutTreeView;
|
RestoredView: TADLayoutTreeView;
|
||||||
procedure OpenLayout(Filename: string);
|
procedure OpenLayout(Filename: string);
|
||||||
procedure LoadSettingsFromOriginalSynedit;
|
procedure LoadSettingsFromOriginalSynedit;
|
||||||
property Settings: TAnchorDockSettings read FSettings;
|
property Settings: TAnchorDockSettings read FSettings;
|
||||||
property OriginalLayout: TAnchorDockLayoutTree read FOriginalLayout;
|
property OriginalLayout: TAnchorDockLayoutTree read GetOriginalLayout;
|
||||||
property OriginalFilename: string read FOriginalFilename;
|
property OriginalFilename: string read FOriginalFilename;
|
||||||
property RestoredLayout: TAnchorDockLayoutTree read FRestoredLayout;
|
property RestoredLayout: TAnchorDockLayoutTree read GetRestoredLayout;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -89,8 +89,6 @@ procedure TADRestDbg.FormCreate(Sender: TObject);
|
|||||||
begin
|
begin
|
||||||
Caption:='Anchordocking Restore Debugger';
|
Caption:='Anchordocking Restore Debugger';
|
||||||
FSettings:=TAnchorDockSettings.Create;
|
FSettings:=TAnchorDockSettings.Create;
|
||||||
FOriginalLayout:=TAnchorDockLayoutTree.Create;
|
|
||||||
FRestoredLayout:=TAnchorDockLayoutTree.Create;
|
|
||||||
|
|
||||||
OriginalFileLabel.Caption:='Original: '+OriginalFilename;
|
OriginalFileLabel.Caption:='Original: '+OriginalFilename;
|
||||||
RestoredFileLabel.Caption:='Restored XML:';
|
RestoredFileLabel.Caption:='Restored XML:';
|
||||||
@ -118,8 +116,16 @@ end;
|
|||||||
procedure TADRestDbg.FormDestroy(Sender: TObject);
|
procedure TADRestDbg.FormDestroy(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
FreeAndNil(FSettings);
|
FreeAndNil(FSettings);
|
||||||
FreeAndNil(FOriginalLayout);
|
end;
|
||||||
FreeAndNil(FRestoredLayout);
|
|
||||||
|
function TADRestDbg.GetOriginalLayout: TAnchorDockLayoutTree;
|
||||||
|
begin
|
||||||
|
Result:=OriginalView.Layout;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TADRestDbg.GetRestoredLayout: TAnchorDockLayoutTree;
|
||||||
|
begin
|
||||||
|
Result:=RestoredView.Layout;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TADRestDbg.OpenLayout(Filename: string);
|
procedure TADRestDbg.OpenLayout(Filename: string);
|
||||||
@ -158,11 +164,12 @@ begin
|
|||||||
Config:=TXMLConfigStorage.Create(ms);
|
Config:=TXMLConfigStorage.Create(ms);
|
||||||
FSettings.LoadFromConfig(Config);
|
FSettings.LoadFromConfig(Config);
|
||||||
Config.AppendBasePath('MainConfig/');
|
Config.AppendBasePath('MainConfig/');
|
||||||
FOriginalLayout.LoadFromConfig(Config);
|
OriginalLayout.LoadFromConfig(Config);
|
||||||
Config.UndoAppendBasePath;
|
Config.UndoAppendBasePath;
|
||||||
finally
|
finally
|
||||||
Config.Free;
|
Config.Free;
|
||||||
ms.Free;
|
ms.Free;
|
||||||
|
OriginalView.LayoutChanged;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user