|
@@ -1,8 +1,6 @@
|
|
|
using ChunkyImageLib.DataHolders;
|
|
|
using PixiEditor.Helpers.Extensions;
|
|
|
using PixiEditor.ChangeableDocument.Actions;
|
|
|
-using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
|
|
|
-using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
|
|
|
using Drawie.Backend.Core.ColorsImpl;
|
|
|
using PixiEditor.Models.Handlers;
|
|
|
using PixiEditor.Models.Handlers.Toolbars;
|
|
@@ -10,7 +8,8 @@ using PixiEditor.Models.Handlers.Tools;
|
|
|
using PixiEditor.Models.Tools;
|
|
|
using Drawie.Numerics;
|
|
|
using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
|
|
|
-using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
|
|
|
+using PixiEditor.ViewModels.Document.TransformOverlays;
|
|
|
+using PixiEditor.Views.Overlays.TransformOverlay;
|
|
|
|
|
|
namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
|
|
|
|
|
@@ -35,10 +34,13 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
protected IFillableShapeToolbar toolbar;
|
|
|
private IColorsHandler? colorsVM;
|
|
|
private bool ignoreNextColorChange = false;
|
|
|
+
|
|
|
+ protected abstract bool UseGlobalUndo { get; }
|
|
|
+ protected abstract bool ShowApplyButton { get; }
|
|
|
|
|
|
- public override bool CanUndo => document.TransformHandler.HasUndo;
|
|
|
- public override bool CanRedo => document.TransformHandler.HasRedo;
|
|
|
-
|
|
|
+ public override bool CanUndo => !UseGlobalUndo && document.TransformHandler.HasUndo;
|
|
|
+ public override bool CanRedo => !UseGlobalUndo && document.TransformHandler.HasRedo;
|
|
|
+
|
|
|
public override ExecutionState Start()
|
|
|
{
|
|
|
if (base.Start() == ExecutionState.Error)
|
|
@@ -55,7 +57,7 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
return ExecutionState.Error;
|
|
|
if (!drawOnMask && member is not ILayerHandler)
|
|
|
return ExecutionState.Error;
|
|
|
-
|
|
|
+
|
|
|
if (ActiveMode == ShapeToolMode.Drawing)
|
|
|
{
|
|
|
if (toolbar.SyncWithPrimaryColor)
|
|
@@ -68,7 +70,7 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
lastRect = new RectD(startDrawingPos, VecD.Zero);
|
|
|
|
|
|
document!.TransformHandler.ShowTransform(TransformMode, false, new ShapeCorners((RectD)lastRect.Inflate(1)),
|
|
|
- false);
|
|
|
+ false, UseGlobalUndo ? AddToUndo : null);
|
|
|
document.TransformHandler.ShowHandles = false;
|
|
|
document.TransformHandler.IsSizeBoxEnabled = true;
|
|
|
document.TransformHandler.CanAlignToPixels = AlignToPixels;
|
|
@@ -91,6 +93,11 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
toolbar.ToolSize = shapeData.StrokeWidth;
|
|
|
toolbar.Fill = shapeData.FillColor != Colors.Transparent;
|
|
|
initialCorners = shapeData.TransformationCorners;
|
|
|
+
|
|
|
+ ShapeCorners corners = vectorLayerHandler.TransformationCorners;
|
|
|
+ document.TransformHandler.ShowTransform(
|
|
|
+ TransformMode, false, corners, false, UseGlobalUndo ? AddToUndo : null);
|
|
|
+ document.TransformHandler.CanAlignToPixels = false;
|
|
|
|
|
|
ActiveMode = ShapeToolMode.Transform;
|
|
|
}
|
|
@@ -118,8 +125,8 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
VecI pos2 = (VecI)(((VecD)curPos).ProjectOntoLine(startPos, startPos + new VecD(1, -1)) -
|
|
|
new VecD(0.25).Multiply((curPos - startPos).Signs())).Round();
|
|
|
if ((pos1 - curPos).LengthSquared > (pos2 - curPos).LengthSquared)
|
|
|
- return (VecI)pos2;
|
|
|
- return (VecI)pos1;
|
|
|
+ return pos2;
|
|
|
+ return pos1;
|
|
|
}
|
|
|
|
|
|
public static VecD GetSquaredPosition(VecD startPos, VecD curPos)
|
|
@@ -138,13 +145,19 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
if (ActiveMode != ShapeToolMode.Transform)
|
|
|
return;
|
|
|
|
|
|
+ var shapeData = ShapeDataFromCorners(corners);
|
|
|
+ IAction drawAction = TransformMovedAction(shapeData, corners);
|
|
|
+
|
|
|
+ internals!.ActionAccumulator.AddActions(drawAction);
|
|
|
+ }
|
|
|
+
|
|
|
+ private ShapeData ShapeDataFromCorners(ShapeCorners corners)
|
|
|
+ {
|
|
|
var rect = RectD.FromCenterAndSize(corners.RectCenter, corners.RectSize);
|
|
|
ShapeData shapeData = new ShapeData(rect.Center, rect.Size, corners.RectRotation, (float)StrokeWidth,
|
|
|
StrokeColor,
|
|
|
FillColor) { AntiAliasing = toolbar.AntiAliasing };
|
|
|
- IAction drawAction = TransformMovedAction(shapeData, corners);
|
|
|
-
|
|
|
- internals!.ActionAccumulator.AddActions(drawAction);
|
|
|
+ return shapeData;
|
|
|
}
|
|
|
|
|
|
public override void OnTransformApplied()
|
|
@@ -190,14 +203,16 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
{
|
|
|
if (ActiveMode != ShapeToolMode.Transform)
|
|
|
return;
|
|
|
- document!.TransformHandler.Undo();
|
|
|
+
|
|
|
+ document.TransformHandler.Undo();
|
|
|
}
|
|
|
|
|
|
public override void OnMidChangeRedo()
|
|
|
{
|
|
|
if (ActiveMode != ShapeToolMode.Transform)
|
|
|
return;
|
|
|
- document!.TransformHandler.Redo();
|
|
|
+
|
|
|
+ document.TransformHandler.Redo();
|
|
|
}
|
|
|
|
|
|
protected override void PrecisePositionChangeDrawingMode(VecD pos)
|
|
@@ -240,7 +255,7 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
|
|
|
startDrawingPos = startPos;
|
|
|
|
|
|
- document!.TransformHandler.ShowTransform(TransformMode, false, new ShapeCorners((RectD)lastRect), false);
|
|
|
+ document!.TransformHandler.ShowTransform(TransformMode, false, new ShapeCorners((RectD)lastRect), false, UseGlobalUndo ? AddToUndo : null);
|
|
|
document.TransformHandler.CanAlignToPixels = AlignToPixels;
|
|
|
document!.TransformHandler.Corners = new ShapeCorners((RectD)lastRect);
|
|
|
}
|
|
@@ -318,6 +333,7 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
if (CanEditShape(layer))
|
|
|
{
|
|
|
internals!.ActionAccumulator.AddActions(SettingsChangedAction());
|
|
|
+ // TODO add to undo
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -354,7 +370,7 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
if (mode == ShapeToolMode.Transform)
|
|
|
{
|
|
|
document.TransformHandler.HideTransform();
|
|
|
- document!.TransformHandler.ShowTransform(TransformMode, false, initialCorners, true);
|
|
|
+ document!.TransformHandler.ShowTransform(TransformMode, false, initialCorners, ShowApplyButton, UseGlobalUndo ? AddToUndo : null);
|
|
|
document.TransformHandler.CanAlignToPixels = AlignToPixels;
|
|
|
}
|
|
|
}
|
|
@@ -369,4 +385,12 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
|
|
|
{
|
|
|
document!.TransformHandler.HideTransform();
|
|
|
}
|
|
|
+
|
|
|
+ private void AddToUndo(ShapeCorners corners)
|
|
|
+ {
|
|
|
+ if (UseGlobalUndo)
|
|
|
+ {
|
|
|
+ internals!.ActionAccumulator.AddFinishedActions(EndDrawAction(), TransformMovedAction(ShapeDataFromCorners(corners), corners), EndDrawAction());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|