2
0
Эх сурвалжийг харах

paste vector shape on empty layer

circular17 6 жил өмнө
parent
commit
523a8d1930

+ 39 - 6
lazpaint/tools/utoolvectorial.pas

@@ -106,8 +106,10 @@ type
     function IsVectorOriginal: boolean;
     function IsGradientOriginal: boolean;
     function IsOtherOriginal: boolean;
-    function IsBitmap: boolean;
+    function IsBitmap(AAcceptEmpty: boolean): boolean;
+    function IsTransformedBitmap: boolean;
     procedure MakeImageOriginal;
+    procedure MakeVectorOriginal;
     procedure UpdateMatrixFromRect;
     procedure DoEditSelection;
     function GetMatrixFromRect(ARect: TRectShape; AUntransformedRect: TRectF): TAffineMatrix;
@@ -667,17 +669,22 @@ begin
      not IsVectorOriginal and not IsGradientOriginal;
 end;
 
-function TEditShapeTool.IsBitmap: boolean;
+function TEditShapeTool.IsBitmap(AAcceptEmpty: boolean): boolean;
 begin
   result := (not Manager.Image.LayerOriginalDefined[Manager.Image.CurrentLayerIndex]) and
-             not Manager.Image.CurrentLayerEmpty;
+             (AAcceptEmpty or not Manager.Image.CurrentLayerEmpty);
+end;
+
+function TEditShapeTool.IsTransformedBitmap: boolean;
+begin
+  result := Manager.Image.LayerOriginalClass[Manager.Image.CurrentLayerIndex]=TBGRALayerImageOriginal;
 end;
 
 procedure TEditShapeTool.MakeImageOriginal;
 var
   diff: TReplaceLayerByImageOriginalDifference;
 begin
-  if IsBitmap then
+  if IsBitmap(false) then
   begin
     diff := TReplaceLayerByImageOriginalDifference.Create(Manager.Image.CurrentState,
               Manager.Image.CurrentLayerIndex, false);
@@ -687,6 +694,20 @@ begin
   end;
 end;
 
+procedure TEditShapeTool.MakeVectorOriginal;
+var
+  diff: TReplaceLayerByVectorOriginalDifference;
+begin
+  if IsBitmap(true) or IsTransformedBitmap then
+  begin
+    diff := TReplaceLayerByVectorOriginalDifference.Create(Manager.Image.CurrentState,
+              Manager.Image.CurrentLayerIndex, false);
+    Manager.Image.AddUndo(diff);
+    if Assigned(Manager.Image.OnStackChanged) then
+      Manager.Image.OnStackChanged(Manager.Image, False);
+  end;
+end;
+
 procedure TEditShapeTool.UpdateMatrixFromRect;
 begin
   if Assigned(FOriginalRect) then
@@ -1088,7 +1109,7 @@ begin
       if (FOriginalRect=nil) and
          (Manager.Image.CurrentLayerReadOnly.GetPixel(FLastPos.X-LayerOffset.X, FLastPos.Y-LayerOffset.Y).alpha <> 0) then
       begin
-        if IsBitmap then MakeImageOriginal;
+        MakeImageOriginal;
         if IsOtherOriginal then
         begin
           with Manager.Image.LayerOriginal[Manager.Image.CurrentLayerIndex].
@@ -1123,6 +1144,16 @@ begin
     end else
       result := false;
   end else
+  if ACommand = tcPaste then
+  begin
+    result := false;
+    MakeVectorOriginal;
+    if IsVectorOriginal then
+    begin
+      PasteShapesFromClipboard(GetVectorOriginal);
+      result := true;
+    end;
+  end else
   begin
     result := true;
     if IsVectorOriginal and not Assigned(FSelectionRect) then
@@ -1183,7 +1214,9 @@ begin
   tcAlignLeft..tcAlignBottom: result:= (IsVectorOriginal and not Assigned(FSelectionRect)
                                         and Assigned(GetVectorOriginal.SelectedShape)) or
                                        (Assigned(FOriginalRect) or Assigned(FSelectionRect));
-  tcPaste: result := IsVectorOriginal and ClipboardHasShapes;
+  tcPaste: result := not Assigned(FSelectionRect)
+                     and (IsVectorOriginal or IsBitmap(true) or IsTransformedBitmap)
+                     and ClipboardHasShapes;
   tcMoveUp,tcMoveToFront: result := (IsVectorOriginal and not Assigned(FSelectionRect)
                                     and Assigned(GetVectorOriginal.SelectedShape)
                                     and not GetVectorOriginal.SelectedShape.IsFront) or