implemented OnIdle checking for controlselection bounds

git-svn-id: trunk@6749 -
This commit is contained in:
mattias 2005-02-05 15:37:31 +00:00
parent 221f748871
commit e25e3db111
2 changed files with 84 additions and 24 deletions

View File

@ -100,6 +100,8 @@ type
);
TSelectedControlFlags = set of TSelectedControlFlag;
{ TSelectedControl }
TSelectedControl = class
private
FCachedFormRelativeLeftTop: TPoint;
@ -123,6 +125,10 @@ type
FOwner: TControlSelection;
FPersistent: TPersistent;
FUseCache: boolean;
FUsedHeight: integer;
FUsedLeft: integer;
FUsedTop: integer;
FUsedWidth: integer;
function GetLeft: integer;
procedure SetLeft(ALeft: integer);
function GetTop: integer;
@ -139,6 +145,9 @@ type
procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer);
procedure SetFormRelativeBounds(ALeft, ATop, AWidth, AHeight: integer);
procedure GetFormRelativeBounds(var ALeft, ATop, AWidth, AHeight: integer);
procedure GetFormRelativeBounds(var ALeft, ATop, AWidth, AHeight: integer;
StoreAsUsed: boolean);
procedure SetUsedBounds(ALeft, ATop, AWidth, AHeight: integer);
procedure SaveBounds;
procedure UpdateCache;
function IsTopLvl: boolean;
@ -156,8 +165,12 @@ type
property OldTop:integer read FOldTop write FOldTop;
property OldWidth:integer read FOldWidth write FOldWidth;
property OldHeight:integer read FOldHeight write FOldHeight;
property OldFormRelativeLeftTop: TPoint
read FOldFormRelativeLeftTop write FOldFormRelativeLeftTop;
property OldFormRelativeLeftTop: TPoint read FOldFormRelativeLeftTop
write FOldFormRelativeLeftTop;
property UsedLeft: integer read FUsedLeft write FUsedLeft;
property UsedTop: integer read FUsedTop write FUsedTop;
property UsedWidth: integer read FUsedWidth write FUsedWidth;
property UsedHeight: integer read FUsedHeight write FUsedHeight;
property Flags: TSelectedControlFlags read FFlags write FFlags;
property UseCache: boolean read FUseCache write SetUseCache;
property IsVisible: boolean read FIsVisible;
@ -359,6 +372,7 @@ type
public
constructor Create;
destructor Destroy; override;
procedure OnIdle(Sender: TObject);
// items
property Items[Index:integer]:TSelectedControl
@ -405,6 +419,7 @@ type
procedure SizeComponents(HorizSizing: TComponentSizing; AWidth: integer;
VertSizing: TComponentSizing; AHeight: integer);
procedure ScaleComponents(Percent: integer);
function CheckForLCLChanges(Update: boolean): boolean;
// snapping
function FindNearestSnapLeft(ALeft, AWidth: integer): integer;
@ -610,6 +625,23 @@ begin
end;
end;
procedure TSelectedControl.GetFormRelativeBounds(var ALeft, ATop, AWidth,
AHeight: integer; StoreAsUsed: boolean);
begin
GetFormRelativeBounds(ALeft, ATop, AWidth, AHeight);
if StoreAsUsed then
SetUsedBounds(ALeft, ATop, AWidth, AHeight);
end;
procedure TSelectedControl.SetUsedBounds(ALeft, ATop, AWidth, AHeight: integer
);
begin
FUsedLeft:=ALeft;
FUsedTop:=ATop;
FUsedWidth:=AWidth;
FUsedHeight:=AHeight;
end;
procedure TSelectedControl.SaveBounds;
begin
if not FIsTComponent then exit;
@ -782,17 +814,24 @@ begin
FRubberbandType:=rbtSelection;
FRubberbandCreationColor:=clMaroon;
FRubberbandSelectionColor:=clNavy;
Application.AddOnIdleHandler(@OnIdle);
end;
destructor TControlSelection.Destroy;
var g:TGrabIndex;
begin
Application.RemoveAllHandlersOfObject(Self);
Clear;
FControls.Free;
for g:=Low(TGrabIndex) to High(TGrabIndex) do FGrabbers[g].Free;
inherited Destroy;
end;
procedure TControlSelection.OnIdle(Sender: TObject);
begin
CheckForLCLChanges(true);
end;
procedure TControlSelection.BeginUpdate;
begin
inc(FUpdateLock);
@ -1070,10 +1109,11 @@ var
NextRealLeft, NextRealTop, NextRealHeight, NextRealWidth: integer;
begin
if FControls.Count>=1 then begin
Items[0].GetFormRelativeBounds(FRealLeft,FRealTop,FRealWidth,FRealHeight);
Items[0].GetFormRelativeBounds(FRealLeft,FRealTop,FRealWidth,FRealHeight,
true);
for i:=1 to FControls.Count-1 do begin
Items[i].GetFormRelativeBounds(
NextRealLeft,NextRealTop,NextRealWidth,NextRealHeight);
NextRealLeft,NextRealTop,NextRealWidth,NextRealHeight,true);
if FRealLeft>NextRealLeft then begin
inc(FRealWidth,FRealLeft-NextRealLeft);
FRealLeft:=NextRealLeft;
@ -2780,6 +2820,43 @@ begin
EndResizing(false);
end;
function TControlSelection.CheckForLCLChanges(Update: boolean): boolean;
function BoundsChanged(CurItem: TSelectedControl): boolean;
var CurLeft, CurTop, CurWidth, CurHeight: integer;
begin
CurItem.GetFormRelativeBounds(CurLeft,CurTop,CurWidth,CurHeight);
Result:=(CurLeft<>CurItem.UsedLeft)
or (CurTop<>CurItem.UsedTop)
or (CurWidth<>CurItem.UsedWidth)
or (CurHeight<>CurItem.UsedHeight);
end;
var
i: Integer;
begin
Result:=false;
if FControls.Count>=1 then begin
for i:=0 to FControls.Count-1 do begin
if BoundsChanged(Items[i]) then begin
Result:=true;
break;
end;
end;
end;
if Result and Update then begin
//debugln('TControlSelection.CheckForLCLChanges');
for i:=0 to FControls.Count-1 do
if Items[i].IsTComponent and BoundsChanged(Items[i]) then
InvalidateMarkersForComponent(TComponent(Items[i].Persistent));
if not IsResizing then begin
UpdateBounds;
DoChangeProperties;
end;
InvalidateGuideLinesCache;
end;
end;
procedure TControlSelection.DrawGuideLines(DC: TDesignerDeviceContext);
var
DCOrigin: TPoint;

View File

@ -218,7 +218,7 @@ type
destructor Destroy; override;
procedure Modified; override;
Procedure SelectOnlyThisComponent(AComponent:TComponent); override;
procedure SelectOnlyThisComponent(AComponent:TComponent); override;
function CopySelection: boolean; override;
function CutSelection: boolean; override;
function CanPaste: Boolean; override;
@ -997,17 +997,7 @@ begin
Result:=true;
Sender.Dispatch(TheMessage);
if ControlSelection.SelectionForm=Form then begin
if not ControlSelection.IsResizing then begin
{debugln('### TDesigner.SizeControl ',Sender.Name,':',Sender.ClassName,
' ',Sender.Width,',',Sender.Height,
' Type=',TheMessage.SizeType
,' ',TheMessage.Width,',',TheMessage.Height,' Pos=',Sender.Left,',',Sender.Top);}
ControlSelection.UpdateBounds;
if Assigned(FOnPropertiesChanged) then
FOnPropertiesChanged(Self);
end;
ControlSelection.InvalidateGuideLinesCache;
ControlSelection.InvalidateMarkersForComponent(Sender);
ControlSelection.CheckForLCLChanges(true);
end;
end;
@ -1017,14 +1007,7 @@ begin
Sender.Dispatch(TheMessage);
//debugln('*** TDesigner.MoveControl A ',Sender.Name,':',Sender.ClassName,' ',ControlSelection.SelectionForm=Form,' ',not ControlSelection.IsResizing,' ',ControlSelection.IsSelected(Sender));
if ControlSelection.SelectionForm=Form then begin
if not ControlSelection.IsResizing then begin
//debugln('*** TDesigner.MoveControl ',Sender.Name,':',Sender.ClassName,' ',Assigned(FOnPropertiesChanged));
ControlSelection.UpdateBounds;
if Assigned(FOnPropertiesChanged) then
FOnPropertiesChanged(Self);
end;
ControlSelection.InvalidateGuideLinesCache;
ControlSelection.InvalidateMarkersForComponent(Sender);
ControlSelection.CheckForLCLChanges(true);
end;
end;