flabbet 3 năm trước cách đây
mục cha
commit
d1ade4dbb7

+ 1 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/EllipseToolExecutor.cs

@@ -23,7 +23,7 @@ internal class EllipseToolExecutor : ShapeToolExecutor<EllipseToolViewModel>
 
     protected override void DrawShape(VecI currentPos) => DrawEllipseOrCircle(currentPos);
 
-    protected override IAction TransformMovedAction(ShapeData data) =>
+    protected override IAction TransformMovedAction(ShapeData data, ShapeCorners corners) =>
         new DrawEllipse_Action(memberGuid, (RectI)RectD.FromCenterAndSize(data.Center, data.Size), strokeColor,
             fillColor, strokeWidth, drawOnMask);
 

+ 58 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineToolExecutor.cs

@@ -0,0 +1,58 @@
+using ChunkyImageLib.DataHolders;
+using PixiEditor.ChangeableDocument.Actions;
+using PixiEditor.Models.Enums;
+using PixiEditor.ViewModels.SubViewModels.Document;
+using PixiEditor.ViewModels.SubViewModels.Tools.Tools;
+using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
+
+namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
+#nullable enable
+internal class LineToolExecutor : ShapeToolExecutor<LineToolViewModel>
+{
+    public override ExecutionState Start()
+    {
+        ColorsViewModel? colorsVM = ViewModelMain.Current?.ColorsSubViewModel;
+        toolViewModel = ViewModelMain.Current?.ToolsSubViewModel.GetTool<LineToolViewModel>();
+        BasicToolbar? toolbar = (BasicToolbar?)toolViewModel?.Toolbar;
+        StructureMemberViewModel? member = document?.SelectedStructureMember;
+        if (colorsVM is null || toolbar is null || member is null)
+            return ExecutionState.Error;
+        drawOnMask = member.ShouldDrawOnMask;
+        if (drawOnMask && !member.HasMaskBindable)
+            return ExecutionState.Error;
+        if (!drawOnMask && member is not LayerViewModel)
+            return ExecutionState.Error;
+        
+        startPos = controller!.LastPixelPosition;
+        strokeColor = colorsVM.PrimaryColor;
+        strokeWidth = toolbar.ToolSize;
+        memberGuid = member.GuidValue;
+
+        colorsVM.AddSwatch(strokeColor);
+        DrawShape(startPos);
+        return ExecutionState.Success;
+    }
+
+    private void DrawLine(VecI curPos)
+    {
+        RectI rect = RectI.FromTwoPoints(startPos, curPos);
+        if (rect.Width == 0)
+            rect.Width = 1;
+        if (rect.Height == 0)
+            rect.Height = 1;
+
+        lastRect = rect;
+
+        helpers!.ActionAccumulator.AddActions(new DrawLine_Action(memberGuid, startPos, curPos, strokeWidth, strokeColor, SKStrokeCap.Butt, drawOnMask));
+    }
+
+    protected override void DrawShape(VecI currentPos) => DrawLine(currentPos);
+
+    protected override IAction TransformMovedAction(ShapeData data, ShapeCorners corners)
+    {
+        return new DrawLine_Action(memberGuid, (VecI)corners.TopLeft, (VecI)corners.BottomRight.Ceiling(), strokeWidth, strokeColor, SKStrokeCap.Butt,
+            drawOnMask);
+    }
+
+    protected override IAction EndDrawAction() => new EndDrawLine_Action();
+}

+ 1 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/RectangleToolExecutor.cs

@@ -21,7 +21,7 @@ internal class RectangleToolExecutor : ShapeToolExecutor<RectangleToolViewModel>
 
     protected override void DrawShape(VecI currentPos) => DrawRectangle(currentPos);
 
-    protected override IAction TransformMovedAction(ShapeData data) => new DrawRectangle_Action(memberGuid, data, drawOnMask);
+    protected override IAction TransformMovedAction(ShapeData data, ShapeCorners corners) => new DrawRectangle_Action(memberGuid, data, drawOnMask);
 
     protected override IAction EndDrawAction() => new EndDrawRectangle_Action();
 }

+ 3 - 4
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/ShapeToolExecutor.cs

@@ -48,19 +48,18 @@ internal abstract class ShapeToolExecutor<T> : UpdateableChangeExecutor where T
     }
 
     protected abstract void DrawShape(VecI currentPos);
-    protected abstract IAction TransformMovedAction(ShapeData data);
+    protected abstract IAction TransformMovedAction(ShapeData data, ShapeCorners corners);
     protected abstract IAction EndDrawAction();
 
     public override void OnTransformMoved(ShapeCorners corners)
     {
         if (!transforming)
             return;
-
+        
         var rect = (RectI)RectD.FromCenterAndSize(corners.RectCenter, corners.RectSize);
-
         ShapeData shapeData = new ShapeData(rect.Center, rect.Size, corners.RectRotation, strokeWidth, strokeColor,
             fillColor);
-        IAction drawAction = TransformMovedAction(shapeData);
+        IAction drawAction = TransformMovedAction(shapeData, corners);
         
         helpers!.ActionAccumulator.AddActions(drawAction);
     }

+ 2 - 2
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentViewModel.cs

@@ -305,8 +305,8 @@ internal class DocumentViewModel : NotifyableObject
     public void UseRectangleTool() => Helpers.ChangeController.TryStartUpdateableChange<RectangleToolExecutor>();
     
     public void UseEllipseTool() => Helpers.ChangeController.TryStartUpdateableChange<EllipseToolExecutor>();
-    
-    
+
+    public void UseLineTool() => Helpers.ChangeController.TryStartUpdateableChange<LineToolExecutor>();
 
     public void Undo()
     {

+ 6 - 0
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/LineToolViewModel.cs

@@ -1,4 +1,5 @@
 using System.Windows.Input;
+using ChunkyImageLib.DataHolders;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
 
@@ -24,4 +25,9 @@ internal class LineToolViewModel : ShapeTool
         else
             ActionDisplay = defaultActionDisplay;
     }
+    
+    public override void OnLeftMouseButtonDown(VecD pos)
+    {
+        ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.UseLineTool();
+    }
 }