|
@@ -34,7 +34,7 @@ type
|
|
|
FLastDraftUpdate: Boolean;
|
|
|
FSwapColor: boolean;
|
|
|
FQuickDefine: Boolean;
|
|
|
- FQuickDefineStartPoint, FQuickDefineEndPoint: TPointF;
|
|
|
+ FQuickDefineStartPoint, FQuickDefineUserEndPoint, FQuickDefineEndPoint: TPointF;
|
|
|
FPreviousUpdateBounds, FPreviousEditorBounds: TRect;
|
|
|
FEditor: TBGRAOriginalEditor;
|
|
|
FRightDown, FLeftDown: boolean;
|
|
@@ -59,6 +59,7 @@ type
|
|
|
function VectorTransform(APixelCentered: boolean): TAffineMatrix;
|
|
|
procedure UpdateCursor(ACursor: TOriginalEditorCursor);
|
|
|
function FixLayerOffset: boolean; override;
|
|
|
+ function UpdateQuickDefine: TRect;
|
|
|
function DoToolDown({%H-}toolDest: TBGRABitmap; {%H-}pt: TPoint; {%H-}ptF: TPointF; rightBtn: boolean): TRect; override;
|
|
|
function DoToolMove({%H-}toolDest: TBGRABitmap; {%H-}pt: TPoint; {%H-}ptF: TPointF): TRect; override;
|
|
|
function DoToolUpdate({%H-}toolDest: TBGRABitmap): TRect; override;
|
|
@@ -2043,6 +2044,28 @@ begin
|
|
|
Result:= false;
|
|
|
end;
|
|
|
|
|
|
+function TVectorialTool.UpdateQuickDefine: TRect;
|
|
|
+var
|
|
|
+ s: TPointF;
|
|
|
+ avg: single;
|
|
|
+begin
|
|
|
+ if ssShift in ShiftState then
|
|
|
+ begin
|
|
|
+ s := FQuickDefineUserEndPoint-FQuickDefineStartPoint;
|
|
|
+ avg := sqrt(abs(s.x*s.y));
|
|
|
+ if s.x > 0 then FQuickDefineEndPoint.x := FQuickDefineStartPoint.x + avg else FQuickDefineEndPoint.x := FQuickDefineStartPoint.x - avg;
|
|
|
+ if s.y > 0 then FQuickDefineEndPoint.y := FQuickDefineStartPoint.y + avg else FQuickDefineEndPoint.y := FQuickDefineStartPoint.y - avg;
|
|
|
+ end else
|
|
|
+ FQuickDefineEndPoint := FQuickDefineUserEndPoint;
|
|
|
+ FShape.BeginUpdate;
|
|
|
+ QuickDefineShape(FQuickDefineStartPoint, FQuickDefineEndPoint);
|
|
|
+ FLastShapeTransform := AffineMatrixInverse(VectorTransform(false));
|
|
|
+ FShape.Transform(FLastShapeTransform);
|
|
|
+ AssignShapeStyle(FLastShapeTransform, true);
|
|
|
+ FShape.EndUpdate;
|
|
|
+ result := OnlyRenderChange;
|
|
|
+end;
|
|
|
+
|
|
|
function TVectorialTool.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
|
|
|
ptF: TPointF; rightBtn: boolean): TRect;
|
|
|
var
|
|
@@ -2097,6 +2120,7 @@ begin
|
|
|
FShape.TemporaryStorage := FTemporaryStorage;
|
|
|
FQuickDefine := true;
|
|
|
FQuickDefineStartPoint := RoundCoordinate(FLastPos);
|
|
|
+ FQuickDefineUserEndPoint := FQuickDefineStartPoint;
|
|
|
FQuickDefineEndPoint := FQuickDefineStartPoint;
|
|
|
FShape.BeginUpdate;
|
|
|
QuickDefineShape(FQuickDefineStartPoint,FQuickDefineEndPoint);
|
|
@@ -2120,8 +2144,6 @@ end;
|
|
|
function TVectorialTool.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
|
|
|
ptF: TPointF): TRect;
|
|
|
var
|
|
|
- s: TPointF;
|
|
|
- avg: single;
|
|
|
viewPt, shapePt: TPointF;
|
|
|
handled: boolean;
|
|
|
cur: TOriginalEditorCursor;
|
|
@@ -2131,21 +2153,8 @@ begin
|
|
|
FLastPos := AffineMatrixTranslation(X,Y)*ptF;
|
|
|
if FQuickDefine then
|
|
|
begin
|
|
|
- FQuickDefineEndPoint := RoundCoordinate(ptF);
|
|
|
- if ssShift in ShiftState then
|
|
|
- begin
|
|
|
- s := FQuickDefineEndPoint-FQuickDefineStartPoint;
|
|
|
- avg := sqrt(abs(s.x*s.y));
|
|
|
- if s.x > 0 then FQuickDefineEndPoint.x := FQuickDefineStartPoint.x + avg else FQuickDefineEndPoint.x := FQuickDefineStartPoint.x - avg;
|
|
|
- if s.y > 0 then FQuickDefineEndPoint.y := FQuickDefineStartPoint.y + avg else FQuickDefineEndPoint.y := FQuickDefineStartPoint.y - avg;
|
|
|
- end;
|
|
|
- FShape.BeginUpdate;
|
|
|
- QuickDefineShape(FQuickDefineStartPoint, FQuickDefineEndPoint);
|
|
|
- FLastShapeTransform := AffineMatrixInverse(VectorTransform(false));
|
|
|
- FShape.Transform(FLastShapeTransform);
|
|
|
- AssignShapeStyle(FLastShapeTransform, true);
|
|
|
- FShape.EndUpdate;
|
|
|
- result := OnlyRenderChange;
|
|
|
+ FQuickDefineUserEndPoint := RoundCoordinate(ptF);
|
|
|
+ result := UpdateQuickDefine;
|
|
|
end else
|
|
|
begin
|
|
|
viewPt := Editor.Matrix*AffineMatrixInverse(VectorTransform(true))*FLastPos;
|
|
@@ -2233,6 +2242,11 @@ begin
|
|
|
result := CancelShape;
|
|
|
Key := 0;
|
|
|
end else
|
|
|
+ if (Key = VK_SHIFT) and FQuickDefine and Assigned(FShape) then
|
|
|
+ begin
|
|
|
+ result := UpdateQuickDefine;
|
|
|
+ Key := 0;
|
|
|
+ end else
|
|
|
begin
|
|
|
Editor.KeyDown(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
|
|
|
if not handled and Assigned(FShape) then FShape.KeyDown(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
|
|
@@ -2255,9 +2269,16 @@ var
|
|
|
handled: boolean;
|
|
|
begin
|
|
|
result := EmptyRect;
|
|
|
- Editor.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
|
|
|
- if not handled and Assigned(FShape) then FShape.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
|
|
|
- if handled then Key := 0;
|
|
|
+ if (Key = VK_SHIFT) and FQuickDefine and Assigned(FShape) then
|
|
|
+ begin
|
|
|
+ result := UpdateQuickDefine;
|
|
|
+ Key := 0;
|
|
|
+ end else
|
|
|
+ begin
|
|
|
+ Editor.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
|
|
|
+ if not handled and Assigned(FShape) then FShape.KeyUp(ShiftState, LCLKeyToSpecialKey(Key, ShiftState), handled);
|
|
|
+ if handled then Key := 0;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
function TVectorialTool.ToolCommand(ACommand: TToolCommand): boolean;
|