Explorar o código

select layer where pixel is not transparent using shift

(with hand tool or edit shape tool)
Johann ELSASS %!s(int64=5) %!d(string=hai) anos
pai
achega
4caa19d063

+ 18 - 0
lazpaint/image/uimage.pas

@@ -178,6 +178,7 @@ type
 
     // image layer
     function SetCurrentLayerByIndex(AValue: integer): boolean;
+    function SelectLayerContainingPixelAt(APicturePos: TPoint): boolean;
     function CurrentLayerEmpty: boolean;
     function CurrentLayerTransparent: boolean;
     function CurrentLayerEquals(AColor: TBGRAPixel): boolean;
@@ -1572,6 +1573,23 @@ begin
   result := true;
 end;
 
+function TLazPaintImage.SelectLayerContainingPixelAt(APicturePos: TPoint): boolean;
+var
+  i: Integer;
+  ofs: TPoint;
+begin
+  for i := NbLayers-1 downto 0 do
+  begin
+    ofs := LayerOffset[i];
+    if LayerBitmap[i].GetPixel(APicturePos.x - ofs.x, APicturePos.y - ofs.y).alpha > 0 then
+    begin
+      result := SetCurrentLayerByIndex(i);
+      exit;
+    end;
+  end;
+  result := false;
+end;
+
 procedure TLazPaintImage.SetLayerOffset(AIndex: integer; AValue: TPoint;
   APrecomputedLayerBounds: TRect);
 var

+ 9 - 0
lazpaint/lazpaintmainform.pas

@@ -1341,6 +1341,15 @@ begin
     if Button = mbRight then
       btnRightDown := true;
 
+    if (
+        (ToolManager.GetCurrentToolType = ptHand) or
+        ((ToolManager.GetCurrentToolType = ptEditShape) and
+          Assigned(ToolManager.CurrentTool) and
+          (ToolManager.CurrentTool as TEditShapeTool).NothingSelected)
+       )  and
+       (ssShift in Shift) then
+      Image.SelectLayerContainingPixelAt(FImageView.FormToBitmap(X,Y).Round);
+
     if ToolManager.ToolDown(FImageView.FormToBitmap(X,Y),
         btnRightDown{$IFDEF DARWIN} or (ssCtrl in Shift){$ENDIF},
         CurrentPressure) then

+ 8 - 0
lazpaint/tools/utoolvectorial.pas

@@ -108,6 +108,8 @@ type
 
   TEditShapeMode = (esmNone, esmSelection, esmGradient, esmOtherOriginal, esmShape, esmNoShape);
   TEditShapeTool = class(TGenericTool)
+  private
+    function GetNothingSelected: boolean;
   protected
     FDownHandled,FRectEditorCapture,FLayerOriginalCapture,
     FLeftButton,FRightButton: boolean;
@@ -174,6 +176,7 @@ type
     function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
     function SuggestGradientBox: TAffineBox; override;
     property CurrentSplineMode: TToolSplineMode read GetCurrentSplineMode write SetCurrentSplineMode;
+    property NothingSelected: boolean read GetNothingSelected;
   end;
 
 procedure AssignFill(ATarget, ASource: TVectorialFill; const ABox: TAffineBox; AFitMode: TFitMode);
@@ -391,6 +394,11 @@ begin
     Manager.UpdateContextualToolbars;
 end;
 
+function TEditShapeTool.GetNothingSelected: boolean;
+begin
+  result := GetEditMode in [esmNone, esmNoShape];
+end;
+
 procedure TEditShapeTool.RetrieveLightPosition;
 var
   shape: TVectorShape;