2
0
Эх сурвалжийг харах

add context menu for layer

Johann ELSASS 4 жил өмнө
parent
commit
a504794ee6

+ 56 - 9
lazpaint/dialog/ulayerstackinterface.pas

@@ -7,7 +7,7 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, Controls, ComCtrls, ExtCtrls, BGRAVirtualScreen, BCComboBox,
   Classes, SysUtils, Controls, ComCtrls, ExtCtrls, BGRAVirtualScreen, BCComboBox,
-  BGRABitmap, BGRABitmapTypes, BGRAGraphics,
+  BGRABitmap, BGRABitmapTypes, BGRAGraphics, Menus,
   LazPaintType, UDarkTheme, UVolatileScrollBar, UImageObservation;
   LazPaintType, UDarkTheme, UVolatileScrollBar, UImageObservation;
 
 
 type
 type
@@ -74,8 +74,12 @@ type
     FMovingItemBitmap: TBGRABitmap;
     FMovingItemBitmap: TBGRABitmap;
     FMovingItemSourceIndex: integer;
     FMovingItemSourceIndex: integer;
     FMovingItemMousePos, FMovingItemMouseOrigin, FMovingItemOrigin: TPoint;
     FMovingItemMousePos, FMovingItemMouseOrigin, FMovingItemOrigin: TPoint;
+    FRightClickOrigin: TPoint;
     FTimerScrollDeltaY: integer;
     FTimerScrollDeltaY: integer;
     FInHandleSelectLayer: Boolean;
     FInHandleSelectLayer: Boolean;
+    FLayerMenu: TPopupMenu;
+    FQueryLayerMenu: boolean;
+    FLayerMenuCoord: TPoint;
     procedure ApplyThemeAndDPI;
     procedure ApplyThemeAndDPI;
     procedure SetDPI(AValue: integer);
     procedure SetDPI(AValue: integer);
     procedure SetDarkTheme(AValue: boolean);
     procedure SetDarkTheme(AValue: boolean);
@@ -90,7 +94,7 @@ type
     procedure ComputeLayout(ABitmap: TBGRABitmap);
     procedure ComputeLayout(ABitmap: TBGRABitmap);
     procedure ComputeScrolling(AWithHorzScrollBar,AWithVertScrollBar: boolean);
     procedure ComputeScrolling(AWithHorzScrollBar,AWithVertScrollBar: boolean);
     procedure DoScrollVertically(AAmount: integer);
     procedure DoScrollVertically(AAmount: integer);
-    procedure HandleSelectLayer(i,x,y: integer);
+    function HandleSelectLayer(i,x,y: integer; AStartMoving: boolean = true): boolean;
     procedure HandleChangeLayerOpacity(X,{%H-}Y: integer);
     procedure HandleChangeLayerOpacity(X,{%H-}Y: integer);
     procedure UpdateLayerStackItem(AIndex: integer);
     procedure UpdateLayerStackItem(AIndex: integer);
     procedure NeedCheckers;
     procedure NeedCheckers;
@@ -99,6 +103,7 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     procedure AddButton(AAction: TBasicAction);
     procedure AddButton(AAction: TBasicAction);
     procedure AddButton(ACaption: string; AImageIndex: integer; AOnClick: TNotifyEvent);
     procedure AddButton(ACaption: string; AImageIndex: integer; AOnClick: TNotifyEvent);
+    procedure AddLayerMenu(AAction: TBasicAction);
     procedure ScrollToItem(AIndex: integer; AUpdateStack: boolean = true);
     procedure ScrollToItem(AIndex: integer; AUpdateStack: boolean = true);
     procedure InvalidateStack(AScrollIntoView: boolean);
     procedure InvalidateStack(AScrollIntoView: boolean);
     function GetWidthFor(AButtonCount: integer): integer;
     function GetWidthFor(AButtonCount: integer): integer;
@@ -162,6 +167,12 @@ begin
   begin
   begin
     FQuerySelectBlendOp := false;
     FQuerySelectBlendOp := false;
     SelectBlendOp;
     SelectBlendOp;
+  end else
+  if FQueryLayerMenu then
+  begin
+    FQueryLayerMenu := false;
+    with FLayerMenuCoord do
+      FLayerMenu.PopUp(X, Y);
   end
   end
   else
   else
     TimerQuery.Enabled:= false;
     TimerQuery.Enabled:= false;
@@ -254,7 +265,9 @@ begin
         end;
         end;
         exit;
         exit;
       end;
       end;
-  end;
+  end else
+  if Button = mbRight then
+    FRightClickOrigin := Point(X,Y);
 end;
 end;
 
 
 procedure TLayerStackInterface.BGRALayerStack_MouseMove(Sender: TObject;
 procedure TLayerStackInterface.BGRALayerStack_MouseMove(Sender: TObject;
@@ -295,7 +308,7 @@ end;
 
 
 procedure TLayerStackInterface.BGRALayerStack_MouseUp(Sender: TObject;
 procedure TLayerStackInterface.BGRALayerStack_MouseUp(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
-var destinationIndex, prevIndex: integer;
+var destinationIndex, prevIndex, i: integer;
   indexF: single;
   indexF: single;
   res: TModalResult;
   res: TModalResult;
   topmostInfo: TTopMostInfo;
   topmostInfo: TTopMostInfo;
@@ -348,6 +361,23 @@ begin
       FInHandleSelectLayer := false;
       FInHandleSelectLayer := false;
       FAskTransferSelectionLayerIndex := -1;
       FAskTransferSelectionLayerIndex := -1;
     end;
     end;
+  end else
+  if (Button = mbRight) and (Abs(X - FRightClickOrigin.X) <= 2) and
+    (Abs(Y - FRightClickOrigin.Y) <= 2) then
+  begin
+    for i := 0 to high(FLayerInfo) do
+      if IsPointInPolygon(FLayerInfo[i].RightPart.PreviewPts,pointF(FRightClickOrigin.x,FRightClickOrigin.y),true) then
+      begin
+        if HandleSelectLayer(i,x,y,false) then
+        begin
+          FQueryLayerMenu := true;
+          FLayerMenuCoord := BGRALayerStack.ClientToScreen(Point(
+            round(FRightClickOrigin.X / FScaling),
+            round(FRightClickOrigin.Y / FScaling)));
+          TimerQuery.Enabled:= true;
+        end;
+        exit;
+      end;
   end;
   end;
 end;
 end;
 
 
@@ -795,9 +825,10 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TLayerStackInterface.HandleSelectLayer(i, x, y: integer);
+function TLayerStackInterface.HandleSelectLayer(i, x, y: integer; AStartMoving: boolean): boolean;
 var prevIndex: integer;
 var prevIndex: integer;
 begin
 begin
+  result := false;
   FInHandleSelectLayer := true;
   FInHandleSelectLayer := true;
   if (i < LazPaintInstance.Image.NbLayers) then
   if (i < LazPaintInstance.Image.NbLayers) then
   begin
   begin
@@ -812,11 +843,15 @@ begin
     begin
     begin
       FRenaming := false;
       FRenaming := false;
       UpdateLayerStackItem(prevIndex);
       UpdateLayerStackItem(prevIndex);
-      FMovingItemStart := true;
-      FMovingItemSourceIndex := i;
-      FMovingItemMouseOrigin := point(x,y);
-      FMovingItemMousePos := point(x,y);
+      if AStartMoving then
+      begin
+        FMovingItemStart := true;
+        FMovingItemSourceIndex := i;
+        FMovingItemMouseOrigin := point(x,y);
+        FMovingItemMousePos := point(x,y);
+      end;
       UpdateLayerStackItem(i);
       UpdateLayerStackItem(i);
+      result := true;
     end;
     end;
   end;
   end;
   FInHandleSelectLayer := false;
   FInHandleSelectLayer := false;
@@ -1056,6 +1091,9 @@ begin
   TimerQuery.OnTimer:=@TimerQuery_Timer;
   TimerQuery.OnTimer:=@TimerQuery_Timer;
   FQuerySelectBlendOp:= false;
   FQuerySelectBlendOp:= false;
 
 
+  FLayerMenu := TPopupMenu.Create(AContainer);
+  FQueryLayerMenu:= false;
+
   ApplyThemeAndDPI;
   ApplyThemeAndDPI;
   LazPaintInstance.Image.OnImageChanged.AddObserver(@LazPaint_ImageChanged);
   LazPaintInstance.Image.OnImageChanged.AddObserver(@LazPaint_ImageChanged);
 end;
 end;
@@ -1101,6 +1139,15 @@ begin
   button.OnClick := AOnClick;
   button.OnClick := AOnClick;
 end;
 end;
 
 
+procedure TLayerStackInterface.AddLayerMenu(AAction: TBasicAction);
+var
+  item: TMenuItem;
+begin
+  item := TMenuItem.Create(FLayerMenu);
+  item.Action := AAction;
+  FLayerMenu.Items.Add(item);
+end;
+
 procedure TLayerStackInterface.ScrollToItem(AIndex: integer; AUpdateStack: boolean);
 procedure TLayerStackInterface.ScrollToItem(AIndex: integer; AUpdateStack: boolean);
 begin
 begin
   FScrollPos.X := 0;
   FScrollPos.X := 0;

+ 4 - 0
lazpaint/lazpaintinstance.pas

@@ -579,6 +579,10 @@ begin
   FLayerStack.AddButton(FMain.LayerHorizontalFlip);
   FLayerStack.AddButton(FMain.LayerHorizontalFlip);
   FLayerStack.AddButton(FMain.LayerVerticalFlip);
   FLayerStack.AddButton(FMain.LayerVerticalFlip);
   FLayerStack.AddButton(FMain.ToolLayerMapping);
   FLayerStack.AddButton(FMain.ToolLayerMapping);
+
+  FLayerStack.AddLayerMenu(FMain.LayerRemoveCurrent);
+  FLayerStack.AddLayerMenu(FMain.LayerDuplicate);
+  FLayerStack.AddLayerMenu(FMain.LayerRasterize);
 end;
 end;
 
 
 procedure TLazPaintInstance.CreateToolBox;
 procedure TLazPaintInstance.CreateToolBox;

+ 7 - 0
lazpaint/ulayerstack.pas

@@ -33,6 +33,7 @@ type
     { public declarations }
     { public declarations }
     procedure ScrollToItem(AIndex: integer; AUpdateStack: boolean = true);
     procedure ScrollToItem(AIndex: integer; AUpdateStack: boolean = true);
     procedure AddButton(AAction: TBasicAction);
     procedure AddButton(AAction: TBasicAction);
+    procedure AddLayerMenu(AAction: TBasicAction);
     procedure InvalidateStack(AScrollIntoView: boolean);
     procedure InvalidateStack(AScrollIntoView: boolean);
     property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
     property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
     property StackInterface: TLayerStackInterface read GetInterface;
     property StackInterface: TLayerStackInterface read GetInterface;
@@ -107,6 +108,12 @@ begin
     StackInterface.AddButton(AAction);
     StackInterface.AddButton(AAction);
 end;
 end;
 
 
+procedure TFLayerStack.AddLayerMenu(AAction: TBasicAction);
+begin
+  if Assigned(StackInterface) then
+    StackInterface.AddLayerMenu(AAction);
+end;
+
 procedure TFLayerStack.InvalidateStack(AScrollIntoView: boolean);
 procedure TFLayerStack.InvalidateStack(AScrollIntoView: boolean);
 begin
 begin
   if Assigned(FStackInterface) then
   if Assigned(FStackInterface) then