소스 검색

autoselect among visible fill control

Johann ELSASS 4 년 전
부모
커밋
e080f09c80
2개의 변경된 파일56개의 추가작업 그리고 17개의 파일을 삭제
  1. 41 0
      lazpaint/maintoolbar.inc
  2. 15 17
      lazpaint/tools/utool.pas

+ 41 - 0
lazpaint/maintoolbar.inc

@@ -755,11 +755,52 @@ begin
 end;
 
 procedure TFMain.TimerArrangeTimer(Sender: TObject);
+  procedure SetTarget(AFillControl: TLCVectorialFillControl);
+  begin
+    if (AFillControl.FillType = vftGradient) then
+    begin
+      if AFillControl = VectorialFill_Pen then
+        LazPaintInstance.ChooseColorTarget:= ctForeColorStartGrad else
+      if AFillControl = VectorialFill_Back then
+        LazPaintInstance.ChooseColorTarget:= ctBackColorStartGrad else
+      if AFillControl = VectorialFill_Outline then
+        LazPaintInstance.ChooseColorTarget:= ctOutlineColorStartGrad;
+    end else
+    begin
+      if AFillControl = VectorialFill_Pen then
+        LazPaintInstance.ChooseColorTarget:= ctForeColorSolid else
+      if AFillControl = VectorialFill_Back then
+        LazPaintInstance.ChooseColorTarget:= ctBackColorSolid else
+      if AFillControl = VectorialFill_Outline then
+        LazPaintInstance.ChooseColorTarget:= ctOutlineColorSolid;
+    end;
+  end;
+var
+  ct: TContextualToolbars;
 begin
   if Assigned(FLayout) then
   begin
     UpdateAllowedFillTypes;
     FLayout.Arrange;
+    ct := ToolManager.GetContextualToolbars;
+    if (LazPaintInstance.ChooseColorTarget in [ctForeColorSolid, ctForeColorStartGrad,
+      ctForeColorEndGrad]) and not (ctPenFill in ct) then
+    begin
+      if ctBackFill in ct then SetTarget(VectorialFill_Back)
+      else if ctOutlineFill in ct then SetTarget(VectorialFill_Outline);
+    end else
+    if (LazPaintInstance.ChooseColorTarget in [ctBackColorSolid, ctBackColorStartGrad,
+      ctBackColorEndGrad]) and not (ctBackFill in ct) then
+    begin
+      if ctOutlineFill in ct then SetTarget(VectorialFill_Outline)
+      else if ctPenFill in ct then SetTarget(VectorialFill_Pen);
+    end else
+    if (LazPaintInstance.ChooseColorTarget in [ctOutlineColorSolid, ctOutlineColorStartGrad,
+      ctOutlineColorEndGrad]) and not (ctOutlineFill in ct) then
+    begin
+      if ctBackFill in ct then SetTarget(VectorialFill_Back)
+      else if ctPenFill in ct then SetTarget(VectorialFill_Pen);
+    end;
   end;
   TimerArrange.Enabled:= false;
 end;

+ 15 - 17
lazpaint/tools/utool.pas

@@ -466,6 +466,7 @@ type
     function GetCurrentToolType: TPaintToolType;
     function SetCurrentToolType(tool: TPaintToolType): boolean;
     function UpdateContextualToolbars: boolean;
+    function GetContextualToolbars: TContextualToolbars;
     function ToolCanBeUsed: boolean;
     function ToolHasLineCap: boolean;
     procedure ToolWakeUp;
@@ -1576,14 +1577,9 @@ function TToolManager.ToolHasLineCap: boolean;
 var
   contextualToolbars: TContextualToolbars;
 begin
-  if CurrentTool = nil then
-    result := false
-  else
-  begin
-    contextualToolbars := CurrentTool.GetContextualToolbars;
-    result := (ctLineCap in contextualToolbars) and CurrentTool.HasPen and
-              (not (toCloseShape in ShapeOptions) or not (ctCloseShape in contextualToolbars));
-  end;
+  contextualToolbars := GetContextualToolbars;
+  result := (ctLineCap in contextualToolbars) and CurrentTool.HasPen and
+            (not (toCloseShape in ShapeOptions) or not (ctCloseShape in contextualToolbars));
 end;
 
 function TToolManager.GetBackColor: TBGRAPixel;
@@ -3177,16 +3173,10 @@ var
 
 begin
   result := false;
+  contextualToolbars := GetContextualToolbars;
   if Assigned(FCurrentTool) then
-  begin
-    contextualToolbars := FCurrentTool.GetContextualToolbars;
-    hasPen := FCurrentTool.HasPen;
-  end
-  else
-  begin
-    contextualToolbars := [ctPenFill, ctBackFill];
-    hasPen := false;
-  end;
+    hasPen := FCurrentTool.HasPen
+    else hasPen := false;
 
   if (ctBackFill in contextualToolbars) and not (ctPenFill in contextualToolbars) then
     OrResult(SetControlsVisible(FillControls, True, 'Panel_BackFill')) else
@@ -3224,6 +3214,14 @@ begin
   if result and Assigned(FOnToolbarChanged) then FOnToolbarChanged(self);
 end;
 
+function TToolManager.GetContextualToolbars: TContextualToolbars;
+begin
+  if Assigned(FCurrentTool) then
+    result := FCurrentTool.GetContextualToolbars
+  else
+    result := [ctPenFill, ctBackFill];
+end;
+
 function TToolManager.InternalBitmapToVirtualScreen(PtF: TPointF): TPointF;
 begin
   if Assigned(FCurrentTool) then