Browse Source

handle remove poly on backspace

Johann 6 years ago
parent
commit
da66433283

+ 15 - 0
lazpaint/tools/utoolbasic.pas

@@ -107,6 +107,7 @@ type
     function DoToolUpdate({%H-}toolDest: TBGRABitmap): TRect; override;
     procedure ShapeChange({%H-}ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff); virtual;
     procedure ShapeEditingChange({%H-}ASender: TObject); virtual;
+    procedure ShapeRemoveQuery({%H-}ASender: TObject; var AHandled: boolean);
     function GetStatusText: string; override;
     function SlowShape: boolean; virtual;
     procedure QuickDefineEnd; virtual;
@@ -182,6 +183,18 @@ begin
   FPreviousEditorBounds := newEditorBounds;
 end;
 
+procedure TVectorialTool.ShapeRemoveQuery(ASender: TObject;
+  var AHandled: boolean);
+var
+  r: TRect;
+  toolDest: TBGRABitmap;
+begin
+  if ASender <> FShape then exit;
+  toolDest := GetToolDrawingLayer;
+  r := CancelShape;
+  Action.NotifyChange(toolDest, r);
+end;
+
 function TVectorialTool.GetStatusText: string;
 var
   corner1, corner2: TPointF;
@@ -245,6 +258,7 @@ begin
   begin
     FShape.OnChange:= nil;
     FShape.OnEditingChange:= nil;
+    FShape.OnRemoveQuery:= nil;
     if not AlwaysRasterizeShape and Manager.Image.SelectionMaskEmpty then
     begin
       CancelAction;
@@ -493,6 +507,7 @@ begin
       FShape.EndUpdate;
       FShape.OnChange:= @ShapeChange;
       FShape.OnEditingChange:=@ShapeEditingChange;
+      FShape.OnRemoveQuery:= @ShapeRemoveQuery;
       result := RectUnion(result, UpdateShape(toolDest));
     end;
   end;

+ 10 - 0
lazpaintcontrols/lcvectororiginal.pas

@@ -23,6 +23,7 @@ type
 
   TShapeChangeEvent = procedure(ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff) of object;
   TShapeEditingChangeEvent = procedure(ASender: TObject) of object;
+  TShapeRemoveQuery = procedure(ASender: TObject; var AHandled: boolean) of object;
 
   TRenderBoundsOption = (rboAssumePenFill, rboAssumeBackFill);
   TRenderBoundsOptions = set of TRenderBoundsOption;
@@ -125,6 +126,7 @@ type
   TVectorShape = class
   private
     FId: integer;
+    FOnRemoveQuery: TShapeRemoveQuery;
     FRenderIteration: integer; // increased at each BeginUpdate
     FOnChange: TShapeChangeEvent;
     FOnEditingChange: TShapeEditingChangeEvent;
@@ -221,6 +223,7 @@ type
     class function CreateEmpty: boolean; virtual; //create shape even if empty?
     property OnChange: TShapeChangeEvent read FOnChange write FOnChange;
     property OnEditingChange: TShapeEditingChangeEvent read FOnEditingChange write FOnEditingChange;
+    property OnRemoveQuery: TShapeRemoveQuery read FOnRemoveQuery write FOnRemoveQuery;
     property PenColor: TBGRAPixel read GetPenColor write SetPenColor;
     property PenFill: TVectorialFill read GetPenFill write SetPenFill;
     property BackFill: TVectorialFill read GetBackFill write SetBackFill;
@@ -1923,7 +1926,14 @@ begin
 end;
 
 procedure TVectorShape.Remove;
+var handled: boolean;
 begin
+  if Assigned(OnRemoveQuery) then
+  begin
+    handled := false;
+    OnRemoveQuery(self, handled);
+    if handled then exit;
+  end;
   if Assigned(Container) then Container.RemoveShape(self)
   else raise exception.Create('Shape does not have a container');
 end;

+ 1 - 0
lazpaintcontrols/lcvectorpolyshapes.pas

@@ -745,6 +745,7 @@ begin
       Usermode:= vsuEdit;
     end else
       RemovePoint(PointCount-2);
+    AHandled:= true;
   end else
   if (Key = skInsert) then InsertPointAuto else
     inherited KeyDown(Shift, Key, AHandled);