소스 검색

#468 update shape when pressing/releasing shift key

circular17 3 년 전
부모
커밋
8232c79d3b
1개의 변경된 파일42개의 추가작업 그리고 21개의 파일을 삭제
  1. 42 21
      lazpaint/tools/utoolvectorial.pas

+ 42 - 21
lazpaint/tools/utoolvectorial.pas

@@ -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;