소스 검색

setting color target with color picker

Johann ELSASS 4 년 전
부모
커밋
6ed29e2b9f
3개의 변경된 파일52개의 추가작업 그리고 3개의 파일을 삭제
  1. 26 1
      lazpaint/lazpaintinstance.pas
  2. 17 0
      lazpaint/tools/utool.pas
  3. 9 2
      lazpaint/tools/utoolbasic.pas

+ 26 - 1
lazpaint/lazpaintinstance.pas

@@ -6,7 +6,7 @@ unit LazpaintInstance;
 interface
 
 uses
-  Classes, SysUtils, LazPaintType, BGRABitmap, BGRABitmapTypes, BGRALayers,
+  Classes, SysUtils, LazPaintType, BGRABitmap, BGRABitmapTypes, BGRALayers, LCVectorialFill,
   Menus, Controls, fgl,
 
   LazPaintMainForm, UMainFormLayout,
@@ -69,6 +69,7 @@ type
     procedure PythonBusy({%H-}Sender: TObject);
     function ScriptShowMessage(AVars: TVariableSet): TScriptResult;
     function ScriptInputBox(AVars: TVariableSet): TScriptResult;
+    procedure ToolQueryColorTarget(sender: TToolManager; ATarget: TVectorialFill);
 
   protected
     InColorFromFChooseColor: boolean;
@@ -454,6 +455,7 @@ begin
   UseConfig(TIniFile.Create(''));
   FToolManager.OnPopup := @OnToolPopup;
   FToolManager.OnFillChanged:= @ToolFillChanged;
+  FToolManager.OnQueryColorTarget:=@ToolQueryColorTarget;
   FSelectionEditConfig := nil;
   FTextureEditConfig := nil;
   FImageAction := TImageActions.Create(self);
@@ -837,6 +839,29 @@ begin
     result := srCancelledByUser;
 end;
 
+procedure TLazPaintInstance.ToolQueryColorTarget(sender: TToolManager;
+  ATarget: TVectorialFill);
+begin
+  if ATarget = ToolManager.ForeFill then
+  begin
+    if ToolManager.ForeFill.FillType = vftGradient then
+      ChooseColorTarget := ctForeColorStartGrad
+      else ChooseColorTarget := ctForeColorSolid;
+  end else
+  if ATarget = ToolManager.BackFill then
+  begin
+    if ToolManager.BackFill.FillType = vftGradient then
+      ChooseColorTarget := ctBackColorStartGrad
+      else ChooseColorTarget := ctBackColorSolid;
+  end else
+  if ATarget = ToolManager.OutlineFill then
+  begin
+    if ToolManager.OutlineFill.FillType = vftGradient then
+      ChooseColorTarget := ctOutlineColorStartGrad
+      else ChooseColorTarget := ctOutlineColorSolid;
+  end;
+end;
+
 procedure TLazPaintInstance.OnLayeredBitmapLoadStartHandler(AFilenameUTF8: string);
 begin
   if FLoadingLayers = nil then FLoadingLayers := TFLoading.Create(nil);

+ 17 - 0
lazpaint/tools/utool.pas

@@ -171,6 +171,7 @@ type
 
   TOnToolChangedHandler = procedure(sender: TToolManager; ANewToolType: TPaintToolType) of object;
   TOnPopupToolHandler = procedure(sender: TToolManager; APopupMessage: TToolPopupMessage; AKey: Word; AAlways: boolean) of object;
+  TOnQueryColorTargetHandler = procedure(sender: TToolManager; ATarget: TVectorialFill) of object;
 
   TShapeOption = (toAliasing, toDrawShape, toFillShape, toCloseShape);
   TShapeOptions = set of TShapeOption;
@@ -186,6 +187,7 @@ type
   TToolManager = class
   private
     FConfigProvider: IConfigProvider;
+    FOnQueryColorTarget: TOnQueryColorTargetHandler;
     FShouldExitTool: boolean;
     FImage: TLazPaintImage;
     FBlackAndWhite: boolean;
@@ -414,6 +416,7 @@ type
     procedure SetLightAltitude(AValue: integer);
     procedure SetLightPosition(AValue: TPointF);
     procedure SetLineCap(AValue: TPenEndCap);
+    procedure SetOnQueryColorTarget(AValue: TOnQueryColorTargetHandler);
     procedure SetOutlineColor(AValue: TBGRAPixel);
     procedure SetPerspectiveOptions(AValue: TPerspectiveOptions);
     procedure SetPhongShapeAltitude(AValue: integer);
@@ -495,6 +498,7 @@ type
     function IsBackEditGradTexPoints: boolean;
     function IsOutlineEditGradTexPoints: boolean;
     procedure QueryExitTool;
+    procedure QueryColorTarget(ATarget: TVectorialFill);
 
     function RenderTool(formBitmap: TBGRABitmap): TRect;
     function GetRenderBounds(VirtualScreenWidth, VirtualScreenHeight: integer): TRect;
@@ -580,6 +584,7 @@ type
     property OnPopup: TOnPopupToolHandler read FOnPopupToolHandler write FOnPopupToolHandler;
     property OnEraserChanged: TNotifyEvent read FOnEraserChanged write FOnEraserChanged;
     property OnFillChanged: TNotifyEvent read FOnFillChanged write FOnFillChanged;
+    property OnQueryColorTarget: TOnQueryColorTargetHandler read FOnQueryColorTarget write SetOnQueryColorTarget;
     property OnPenWidthChanged: TNotifyEvent read FOnPenWidthChanged write FOnPenWidthChanged;
     property OnBrushChanged: TNotifyEvent read FOnBrushChanged write FOnBrushChanged;
     property OnBrushListChanged: TNotifyEvent read FOnBrushListChanged write FOnBrushListChanged;
@@ -1392,6 +1397,12 @@ begin
   if Assigned(FOnLineCapChanged) then FOnLineCapChanged(self);
 end;
 
+procedure TToolManager.SetOnQueryColorTarget(AValue: TOnQueryColorTargetHandler);
+begin
+  if FOnQueryColorTarget=AValue then Exit;
+  FOnQueryColorTarget:=AValue;
+end;
+
 procedure TToolManager.SetOutlineColor(AValue: TBGRAPixel);
 begin
   FOutlineFill.SolidColor := AValue;
@@ -3791,6 +3802,12 @@ begin
   FShouldExitTool:= true;
 end;
 
+procedure TToolManager.QueryColorTarget(ATarget: TVectorialFill);
+begin
+  if Assigned(OnQueryColorTarget) then
+    OnQueryColorTarget(self, ATarget);
+end;
+
 function TToolManager.RenderTool(formBitmap: TBGRABitmap): TRect;
 begin
   if ToolCanBeUsed and Assigned(CurrentTool) and not FInTool then

+ 9 - 2
lazpaint/tools/utoolbasic.pas

@@ -451,8 +451,15 @@ begin
       if ssShift in ShiftState then
         c := Manager.Image.RenderedImage.GetPixel(pt.X,pt.Y)
         else c := toolDest.GetPixel(pt.X,pt.Y);
-      if colorpickingRight then Manager.BackColor := c
-        else Manager.ForeColor := c;
+      if colorpickingRight then
+      begin
+        Manager.BackColor := c;
+        Manager.QueryColorTarget(Manager.BackFill);
+      end else
+      begin
+        Manager.ForeColor := c;
+        Manager.QueryColorTarget(Manager.ForeFill);
+      end;
     end;
   end;
 end;