|
@@ -15,7 +15,10 @@ type
|
|
|
TToolMoveLayer = class(TGenericTool)
|
|
|
protected
|
|
|
handMoving: boolean;
|
|
|
- handOrigin: TPoint;
|
|
|
+ handOriginF: TPointF;
|
|
|
+ originalTransformBefore: TAffineMatrix;
|
|
|
+ layerOffsetBefore: TPoint;
|
|
|
+ snapToPixel: boolean;
|
|
|
FStartLayerOffset: TPoint;
|
|
|
FStartLayerMatrix: TAffineMatrix;
|
|
|
FStartLayerOffsetDefined: boolean;
|
|
@@ -25,15 +28,17 @@ type
|
|
|
function DoToolDown({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
|
|
|
{%H-}rightBtn: boolean): TRect; override;
|
|
|
function DoToolMove({%H-}toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF): TRect; override;
|
|
|
- procedure DoToolMoveAfter(pt: TPoint; {%H-}ptF: TPointF); override;
|
|
|
function UseOriginal: boolean;
|
|
|
procedure NeedLayerBounds;
|
|
|
function GetAction: TLayerAction; override;
|
|
|
function DoGetToolDrawingLayer: TBGRABitmap; override;
|
|
|
procedure OnTryStop({%H-}sender: TCustomLayerAction); override;
|
|
|
+ function FixLayerOffset: boolean; override;
|
|
|
public
|
|
|
+ constructor Create(AManager: TToolManager); override;
|
|
|
function ToolUp: TRect; override;
|
|
|
function ToolKeyDown(var key: Word): TRect; override;
|
|
|
+ function ToolKeyUp(var key: Word): TRect; override;
|
|
|
function GetContextualToolbars: TContextualToolbars; override;
|
|
|
function ToolCommand(ACommand: TToolCommand): boolean; override;
|
|
|
function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
|
|
@@ -152,46 +157,62 @@ begin
|
|
|
if not handMoving then
|
|
|
begin
|
|
|
handMoving := true;
|
|
|
- handOrigin := pt;
|
|
|
+ handOriginF := ptF;
|
|
|
+ idx := Manager.Image.CurrentLayerIndex;
|
|
|
if not FStartLayerOffsetDefined then
|
|
|
begin
|
|
|
FStartLayerOffsetDefined := true;
|
|
|
- idx := Manager.Image.CurrentLayerIndex;
|
|
|
NeedLayerBounds;
|
|
|
FStartLayerOffset := Manager.Image.LayerOffset[idx];
|
|
|
FStartLayerMatrix := Manager.Image.LayerOriginalMatrix[idx];
|
|
|
end;
|
|
|
- if UseOriginal then Manager.Image.DraftOriginal := true;
|
|
|
+ if UseOriginal then
|
|
|
+ begin
|
|
|
+ Manager.Image.DraftOriginal := true;
|
|
|
+ originalTransformBefore := Manager.Image.LayerOriginalMatrix[idx];
|
|
|
+ end else
|
|
|
+ originalTransformBefore := AffineMatrixIdentity;
|
|
|
+ layerOffsetBefore := Manager.Image.LayerOffset[idx];
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
function TToolMoveLayer.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
|
|
|
ptF: TPointF): TRect;
|
|
|
var idx: integer;
|
|
|
- prev: TPoint;
|
|
|
+ dx, dy: Single;
|
|
|
+ newTransform: TAffineMatrix;
|
|
|
+ newOfs: TPoint;
|
|
|
begin
|
|
|
- if handMoving and ((handOrigin.X <> pt.X) or (handOrigin.Y <> pt.Y)) then
|
|
|
+ result := EmptyRect;
|
|
|
+ if handMoving then
|
|
|
begin
|
|
|
idx := Manager.Image.CurrentLayerIndex;
|
|
|
+ dx := ptF.X-HandOriginF.X;
|
|
|
+ dy := ptF.Y-HandOriginF.Y;
|
|
|
+ if snapToPixel then
|
|
|
+ begin
|
|
|
+ dx := round(dx);
|
|
|
+ dy := round(dy);
|
|
|
+ end;
|
|
|
if UseOriginal then
|
|
|
begin
|
|
|
- Manager.Image.LayerOriginalMatrix[idx] :=
|
|
|
- AffineMatrixTranslation(pt.X-HandOrigin.X,pt.Y-HandOrigin.Y)*Manager.Image.LayerOriginalMatrix[idx];
|
|
|
- result := OnlyRenderChange;
|
|
|
+ newTransform := AffineMatrixTranslation(dx,dy)*originalTransformBefore;
|
|
|
+ if Manager.Image.LayerOriginalMatrix[idx] <> newTransform then
|
|
|
+ begin
|
|
|
+ Manager.Image.LayerOriginalMatrix[idx] := newTransform;
|
|
|
+ result := OnlyRenderChange;
|
|
|
+ end;
|
|
|
end else
|
|
|
begin
|
|
|
- prev := Manager.Image.LayerOffset[idx];
|
|
|
- Manager.Image.SetLayerOffset(idx, Point(prev.X+pt.X-HandOrigin.X,
|
|
|
- prev.Y+pt.Y-HandOrigin.Y), FLayerBounds);
|
|
|
- result := OnlyRenderChange;
|
|
|
+ newOfs := Point(layerOffsetBefore.X+round(dx),
|
|
|
+ layerOffsetBefore.Y+round(dy));
|
|
|
+ if Manager.Image.LayerOffset[idx]<>newOfs then
|
|
|
+ begin
|
|
|
+ Manager.Image.SetLayerOffset(idx, newOfs, FLayerBounds);
|
|
|
+ result := OnlyRenderChange;
|
|
|
+ end;
|
|
|
end;
|
|
|
- end else
|
|
|
- result := EmptyRect;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TToolMoveLayer.DoToolMoveAfter(pt: TPoint; ptF: TPointF);
|
|
|
-begin
|
|
|
- if handMoving then handOrigin := pt;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
function TToolMoveLayer.UseOriginal: boolean;
|
|
@@ -240,6 +261,19 @@ begin
|
|
|
//nothing
|
|
|
end;
|
|
|
|
|
|
+function TToolMoveLayer.FixLayerOffset: boolean;
|
|
|
+begin
|
|
|
+ Result:= false;
|
|
|
+end;
|
|
|
+
|
|
|
+constructor TToolMoveLayer.Create(AManager: TToolManager);
|
|
|
+begin
|
|
|
+ inherited Create(AManager);
|
|
|
+ handMoving := false;
|
|
|
+ FStartLayerOffsetDefined:= false;
|
|
|
+ snapToPixel:= false;
|
|
|
+end;
|
|
|
+
|
|
|
function TToolMoveLayer.ToolUp: TRect;
|
|
|
begin
|
|
|
handMoving := false;
|
|
@@ -256,6 +290,12 @@ begin
|
|
|
result := EmptyRect;
|
|
|
Key := 0;
|
|
|
end
|
|
|
+ else if (key = VK_SNAP) or (key = VK_SNAP2) then
|
|
|
+ begin
|
|
|
+ snapToPixel:= true;
|
|
|
+ result := EmptyRect;
|
|
|
+ key := 0;
|
|
|
+ end
|
|
|
else if key = VK_ESCAPE then
|
|
|
begin
|
|
|
if FStartLayerOffsetDefined then
|
|
@@ -274,6 +314,17 @@ begin
|
|
|
Result:=inherited ToolKeyDown(key);
|
|
|
end;
|
|
|
|
|
|
+function TToolMoveLayer.ToolKeyUp(var key: Word): TRect;
|
|
|
+begin
|
|
|
+ if (key = VK_SNAP) or (key = VK_SNAP2) then
|
|
|
+ begin
|
|
|
+ snapToPixel:= false;
|
|
|
+ result := EmptyRect;
|
|
|
+ key := 0;
|
|
|
+ end
|
|
|
+ else Result:=inherited ToolKeyUp(key);
|
|
|
+end;
|
|
|
+
|
|
|
function TToolMoveLayer.GetContextualToolbars: TContextualToolbars;
|
|
|
begin
|
|
|
Result:= [];
|