Bläddra i källkod

#494 keep selection mode after undo/redo

circular17 3 år sedan
förälder
incheckning
89bba269c8

+ 15 - 3
lazpaint/image/uimageaction.pas

@@ -20,7 +20,7 @@ type
     function GetCurrentTool: TPaintToolType;
     function GetImage: TLazPaintImage;
     function GetToolManager: TToolManager;
-    procedure ChooseTool(ATool: TPaintToolType);
+    procedure ChooseTool(ATool: TPaintToolType; AAsFromGui: boolean = true);
     procedure RegisterScripts(ARegister: Boolean);
     function GenericScriptFunction(AVars: TVariableSet): TScriptResult;
     function ScriptGetAllLayersId(AVars: TVariableSet): TScriptResult;
@@ -131,9 +131,9 @@ begin
   result := FInstance.ToolManager;
 end;
 
-procedure TImageActions.ChooseTool(ATool: TPaintToolType);
+procedure TImageActions.ChooseTool(ATool: TPaintToolType; AAsFromGui: boolean);
 begin
-  FInstance.ChooseTool(ATool);
+  FInstance.ChooseTool(ATool, AAsFromGui);
 end;
 
 procedure TImageActions.RegisterScripts(ARegister: Boolean);
@@ -805,8 +805,11 @@ begin
 end;
 
 procedure TImageActions.Undo;
+var
+  prevTool: TPaintToolType;
 begin
   try
+    prevTool := CurrentTool;
     if CurrentTool in[ptMoveSelection,ptRotateSelection] then ChooseTool(ptHand);
     if ToolManager.ToolProvideCommand(tcFinish) then ToolManager.ToolCommand(tcFinish);
     if image.CanUndo then
@@ -815,6 +818,9 @@ begin
       image.Undo;
       ToolManager.ToolOpen;
     end;
+    if (prevTool in[ptMoveSelection,ptRotateSelection]) and
+      not image.SelectionMaskEmpty then
+      ChooseTool(prevTool, false);
   except
     on ex:Exception do
       FInstance.ShowError('Undo',ex.Message);
@@ -822,8 +828,11 @@ begin
 end;
 
 procedure TImageActions.Redo;
+var
+  prevTool: TPaintToolType;
 begin
   try
+    prevTool := CurrentTool;
     if CurrentTool in[ptLayerMapping,ptMoveSelection,ptRotateSelection] then
       ChooseTool(ptHand);
     if image.CanRedo then
@@ -832,6 +841,9 @@ begin
       image.Redo;
       ToolManager.ToolOpen;
     end;
+    if (prevTool in[ptMoveSelection,ptRotateSelection]) and
+      not image.SelectionMaskEmpty then
+      ChooseTool(prevTool, false);
   except
     on ex:Exception do
       FInstance.ShowError('Redo',ex.Message);

+ 1 - 1
lazpaint/lazpaintdialogs.inc

@@ -123,7 +123,7 @@ begin
       ScriptContext.RecordingFunctionParameters.AddPixel('BackColor', bitmapRepl.GetPixel(0,0));
     end;
   end;
-  ChooseTool(ptHand);
+  ChooseTool(ptHand, true);
   image.Assign(bitmapRepl, True, False);
   Image.CurrentFilenameUTF8 := '';
   image.SetSavedFlag(0,-1,0);

+ 3 - 3
lazpaint/lazpaintinstance.pas

@@ -268,7 +268,7 @@ type
     procedure InvalidateLayerStack; override;
     procedure UpdateLayerStackOnTimer; override;
     function MakeNewBitmapReplacement(AWidth, AHeight: integer; AColor: TBGRAPixel): TBGRABitmap; override;
-    procedure ChooseTool(Tool : TPaintToolType); override;
+    procedure ChooseTool(Tool : TPaintToolType; AAsFromGui: boolean); override;
     function OpenImage (FileName: string; AddToRecent: Boolean= True): boolean; override;
     procedure AddToImageList(const FileNames: array of String); override;
     procedure UpdateToolbar; override;
@@ -1996,10 +1996,10 @@ begin
   result := TBGRABitmap.Create(AWidth,AHeight, AColor);
 end;
 
-procedure TLazPaintInstance.ChooseTool(Tool: TPaintToolType);
+procedure TLazPaintInstance.ChooseTool(Tool: TPaintToolType; AAsFromGui: boolean);
 begin
   FormsNeeded;
-  if Assigned(FMain) then FMain.ChooseTool(Tool);
+  if Assigned(FMain) then FMain.ChooseTool(Tool, AAsFromGui);
 end;
 
 function TLazPaintInstance.GetToolboxHeight: integer;

+ 3 - 3
lazpaint/lazpaintmainform.pas

@@ -876,7 +876,7 @@ type
     procedure AddDockedControl(AControl: TControl);
     procedure RemoveDockedControl(AControl: TControl);
     procedure QueryArrange;
-    function ChooseTool(Tool : TPaintToolType): boolean;
+    function ChooseTool(Tool : TPaintToolType; AAsFromGui: boolean = true): boolean;
     procedure PictureSelectedLayerIndexChanged({%H-}sender: TLazPaintImage);
     procedure PictureSelectedLayerIndexChanging({%H-}sender: TLazPaintImage);
     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
@@ -2868,12 +2868,12 @@ begin
   end;
 end;
 
-function TFMain.ChooseTool(Tool: TPaintToolType): boolean;
+function TFMain.ChooseTool(Tool: TPaintToolType; AAsFromGui: boolean): boolean;
 var params: TVariableSet;
 begin
   params := TVariableSet.Create('ChooseTool');
   params.AddString('Name', PaintToolTypeStr[Tool]);
-  params.AddBoolean('FromGUI', true);
+  params.AddBoolean('FromGUI', AAsFromGui);
   result := Scripting.CallScriptFunction(params) = srOk;
   params.Free;
 end;

+ 1 - 1
lazpaint/lazpainttype.pas

@@ -307,7 +307,7 @@ type
     procedure InvalidateLayerStack; virtual; abstract;
     procedure UpdateLayerStackOnTimer; virtual; abstract;
     function MakeNewBitmapReplacement(AWidth, AHeight: integer; AColor: TBGRAPixel): TBGRABitmap; virtual; abstract;
-    procedure ChooseTool(Tool : TPaintToolType); virtual; abstract;
+    procedure ChooseTool(Tool : TPaintToolType; AAsFromGui: boolean); virtual; abstract;
     function GetOnlineUpdater: TLazPaintCustomOnlineUpdater; virtual;
 
     property GridVisible: boolean read GetGridVisible write SetGridVisible;