anchordocking: restoretest: compute bounds

git-svn-id: trunk@39717 -
This commit is contained in:
mattias 2013-01-01 21:59:37 +00:00
parent 4dd594eaaf
commit 5fd97861f3
2 changed files with 195 additions and 34 deletions

View File

@ -5,30 +5,43 @@ unit ADLayoutViewer;
interface
uses
Classes, SysUtils, Controls, Graphics, AnchorDockStorage;
Classes, SysUtils, types, math, Controls, Graphics, AnchorDockStorage;
type
TADLTVMonitor = class
public
Monitor: integer;
WorkArea: TRect;
Bounds: TRect; // hull of all windows on this monitor
X, Y: integer;
end;
{ TADLayoutTreeView }
TADLayoutTreeView = class(TCustomControl)
private
FLayout: TAnchorDockLayoutTree;
FLayoutMaxX: integer;
FLayoutMaxY: integer;
FLayoutMinX: integer;
FLayoutMinY: integer;
FScale: double;
FScaledMaxX: integer;
FScaledMaxY: integer;
FScaledMinX: integer;
FScaledMinY: integer;
FScaledOffsetX: integer;
FScaledOffsetY: integer;
FBounds: TRect;
FScaledBounds: TRect;
FScaledScroll: TPoint;
FMonitors: array of TADLTVMonitor;
function GetLayoutMaxX: 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 SetScaledOffsetX(AValue: integer);
procedure SetScaledOffsetY(AValue: integer);
procedure ComputeLayout;
procedure ClearMonitors;
function FindMonitor(Monitor: integer): TADLTVMonitor;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@ -36,16 +49,16 @@ type
procedure LayoutChanged; virtual;
property Layout: TAnchorDockLayoutTree read FLayout;
property Scale: double read FScale write SetScale;
property ScaledOffsetX: integer read FScaledOffsetX write SetScaledOffsetX;
property ScaledOffsetY: integer read FScaledOffsetY write SetScaledOffsetY;
property LayoutMinX: integer read FLayoutMinX;
property LayoutMinY: integer read FLayoutMinY;
property LayoutMaxX: integer read FLayoutMaxX;
property LayoutMaxY: integer read FLayoutMaxY;
property ScaledMinX: integer read FScaledMinX;
property ScaledMinY: integer read FScaledMinY;
property ScaledMaxX: integer read FScaledMaxX;
property ScaledMaxY: integer read FScaledMaxY;
property ScaledOffsetX: integer read GetScaledOffsetX write SetScaledOffsetX;
property ScaledOffsetY: integer read GetScaledOffsetY write SetScaledOffsetY;
property LayoutMinX: integer read GetLayoutMinX;
property LayoutMinY: integer read GetLayoutMinY;
property LayoutMaxX: integer read GetLayoutMaxX;
property LayoutMaxY: integer read GetLayoutMaxY;
property ScaledMinX: integer read GetScaledMinX;
property ScaledMinY: integer read GetScaledMinY;
property ScaledMaxX: integer read GetScaledMaxX;
property ScaledMaxY: integer read GetScaledMaxY;
end;
implementation
@ -58,22 +71,162 @@ begin
FScale:=AValue;
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);
begin
if FScaledOffsetX=AValue then Exit;
FScaledOffsetX:=AValue;
if FScaledScroll.X=AValue then Exit;
FScaledScroll.X:=AValue;
end;
procedure TADLayoutTreeView.SetScaledOffsetY(AValue: integer);
begin
if FScaledOffsetY=AValue then Exit;
FScaledOffsetY:=AValue;
if FScaledScroll.Y=AValue then Exit;
FScaledScroll.Y:=AValue;
end;
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
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;
constructor TADLayoutTreeView.Create(AOwner: TComponent);
@ -85,6 +238,7 @@ end;
destructor TADLayoutTreeView.Destroy;
begin
FreeAndNil(FLayout);
ClearMonitors;
inherited Destroy;
end;

View File

@ -61,19 +61,19 @@ type
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FRestoredLayout: TAnchorDockLayoutTree;
FOriginalFilename: string;
FOriginalLayout: TAnchorDockLayoutTree;
FSettings: TAnchorDockSettings;
function GetOriginalLayout: TAnchorDockLayoutTree;
function GetRestoredLayout: TAnchorDockLayoutTree;
public
OriginalView: TADLayoutTreeView;
RestoredView: TADLayoutTreeView;
procedure OpenLayout(Filename: string);
procedure LoadSettingsFromOriginalSynedit;
property Settings: TAnchorDockSettings read FSettings;
property OriginalLayout: TAnchorDockLayoutTree read FOriginalLayout;
property OriginalLayout: TAnchorDockLayoutTree read GetOriginalLayout;
property OriginalFilename: string read FOriginalFilename;
property RestoredLayout: TAnchorDockLayoutTree read FRestoredLayout;
property RestoredLayout: TAnchorDockLayoutTree read GetRestoredLayout;
end;
var
@ -89,8 +89,6 @@ procedure TADRestDbg.FormCreate(Sender: TObject);
begin
Caption:='Anchordocking Restore Debugger';
FSettings:=TAnchorDockSettings.Create;
FOriginalLayout:=TAnchorDockLayoutTree.Create;
FRestoredLayout:=TAnchorDockLayoutTree.Create;
OriginalFileLabel.Caption:='Original: '+OriginalFilename;
RestoredFileLabel.Caption:='Restored XML:';
@ -118,8 +116,16 @@ end;
procedure TADRestDbg.FormDestroy(Sender: TObject);
begin
FreeAndNil(FSettings);
FreeAndNil(FOriginalLayout);
FreeAndNil(FRestoredLayout);
end;
function TADRestDbg.GetOriginalLayout: TAnchorDockLayoutTree;
begin
Result:=OriginalView.Layout;
end;
function TADRestDbg.GetRestoredLayout: TAnchorDockLayoutTree;
begin
Result:=RestoredView.Layout;
end;
procedure TADRestDbg.OpenLayout(Filename: string);
@ -158,11 +164,12 @@ begin
Config:=TXMLConfigStorage.Create(ms);
FSettings.LoadFromConfig(Config);
Config.AppendBasePath('MainConfig/');
FOriginalLayout.LoadFromConfig(Config);
OriginalLayout.LoadFromConfig(Config);
Config.UndoAppendBasePath;
finally
Config.Free;
ms.Free;
OriginalView.LayoutChanged;
end;
end;