|
@@ -9,8 +9,10 @@ using PixiEditor.Models.Handlers.Toolbars;
|
|
using PixiEditor.Models.Handlers.Tools;
|
|
using PixiEditor.Models.Handlers.Tools;
|
|
using PixiEditor.Models.Tools;
|
|
using PixiEditor.Models.Tools;
|
|
using Drawie.Numerics;
|
|
using Drawie.Numerics;
|
|
|
|
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
|
|
using PixiEditor.Helpers;
|
|
using PixiEditor.Helpers;
|
|
using PixiEditor.Models.Controllers.InputDevice;
|
|
using PixiEditor.Models.Controllers.InputDevice;
|
|
|
|
+using PixiEditor.ViewModels.Document.TransformOverlays;
|
|
|
|
|
|
namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
|
|
namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
|
|
|
|
|
|
@@ -20,6 +22,8 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
|
|
|
|
protected Color StrokeColor => toolbar!.StrokeColor.ToColor();
|
|
protected Color StrokeColor => toolbar!.StrokeColor.ToColor();
|
|
protected double StrokeWidth => toolViewModel!.ToolSize;
|
|
protected double StrokeWidth => toolViewModel!.ToolSize;
|
|
|
|
+ protected abstract bool UseGlobalUndo { get; }
|
|
|
|
+ protected abstract bool ShowApplyButton { get; }
|
|
|
|
|
|
protected bool drawOnMask;
|
|
protected bool drawOnMask;
|
|
|
|
|
|
@@ -31,8 +35,10 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
private bool ignoreNextColorChange = false;
|
|
private bool ignoreNextColorChange = false;
|
|
private VecD lastStartPos;
|
|
private VecD lastStartPos;
|
|
|
|
|
|
- public override bool CanUndo => document.LineToolOverlayHandler.HasUndo;
|
|
|
|
- public override bool CanRedo => document.LineToolOverlayHandler.HasRedo;
|
|
|
|
|
|
+ private UndoStack<LineVectorData>? localUndoStack;
|
|
|
|
+
|
|
|
|
+ public override bool CanUndo => !UseGlobalUndo && localUndoStack is { UndoCount: > 0 };
|
|
|
|
+ public override bool CanRedo => !UseGlobalUndo && localUndoStack is { RedoCount: > 0 };
|
|
|
|
|
|
public override ExecutionState Start()
|
|
public override ExecutionState Start()
|
|
{
|
|
{
|
|
@@ -51,6 +57,8 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
return ExecutionState.Error;
|
|
return ExecutionState.Error;
|
|
if (!drawOnMask && member is not ILayerHandler)
|
|
if (!drawOnMask && member is not ILayerHandler)
|
|
return ExecutionState.Error;
|
|
return ExecutionState.Error;
|
|
|
|
+
|
|
|
|
+ localUndoStack = new UndoStack<LineVectorData>();
|
|
|
|
|
|
if (ActiveMode == ShapeToolMode.Drawing)
|
|
if (ActiveMode == ShapeToolMode.Drawing)
|
|
{
|
|
{
|
|
@@ -61,7 +69,7 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
}
|
|
}
|
|
|
|
|
|
document.LineToolOverlayHandler.Hide();
|
|
document.LineToolOverlayHandler.Hide();
|
|
- document.LineToolOverlayHandler.Show(startDrawingPos, startDrawingPos, false);
|
|
|
|
|
|
+ document.LineToolOverlayHandler.Show(startDrawingPos, startDrawingPos, false, AddToUndo);
|
|
document.LineToolOverlayHandler.ShowHandles = false;
|
|
document.LineToolOverlayHandler.ShowHandles = false;
|
|
document.LineToolOverlayHandler.IsSizeBoxEnabled = true;
|
|
document.LineToolOverlayHandler.IsSizeBoxEnabled = true;
|
|
|
|
|
|
@@ -85,6 +93,8 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
}
|
|
}
|
|
|
|
|
|
ActiveMode = ShapeToolMode.Transform;
|
|
ActiveMode = ShapeToolMode.Transform;
|
|
|
|
+
|
|
|
|
+ document.LineToolOverlayHandler.Show(data.Start, data.End, false, AddToUndo);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -97,7 +107,7 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
protected abstract bool InitShapeData(IReadOnlyLineData? data);
|
|
protected abstract bool InitShapeData(IReadOnlyLineData? data);
|
|
protected abstract IAction DrawLine(VecD pos);
|
|
protected abstract IAction DrawLine(VecD pos);
|
|
protected abstract IAction TransformOverlayMoved(VecD start, VecD end);
|
|
protected abstract IAction TransformOverlayMoved(VecD start, VecD end);
|
|
- protected abstract IAction SettingsChange();
|
|
|
|
|
|
+ protected abstract IAction[] SettingsChange();
|
|
protected abstract IAction EndDraw();
|
|
protected abstract IAction EndDraw();
|
|
|
|
|
|
protected override void PrecisePositionChangeDrawingMode(VecD pos)
|
|
protected override void PrecisePositionChangeDrawingMode(VecD pos)
|
|
@@ -159,8 +169,9 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ AddToUndo((lastStartPos, curPos));
|
|
document!.LineToolOverlayHandler.Hide();
|
|
document!.LineToolOverlayHandler.Hide();
|
|
- document!.LineToolOverlayHandler.Show(lastStartPos, curPos, true);
|
|
|
|
|
|
+ document!.LineToolOverlayHandler.Show(lastStartPos, curPos, ShowApplyButton, AddToUndo);
|
|
base.OnLeftMouseButtonUp(argsPositionOnCanvas);
|
|
base.OnLeftMouseButtonUp(argsPositionOnCanvas);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -200,28 +211,40 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
return;
|
|
return;
|
|
|
|
|
|
document!.LineToolOverlayHandler.Nudge(distance);
|
|
document!.LineToolOverlayHandler.Nudge(distance);
|
|
|
|
+ AddToUndo((document.LineToolOverlayHandler.LineStart, document.LineToolOverlayHandler.LineEnd));
|
|
}
|
|
}
|
|
|
|
|
|
public override void OnSettingsChanged(string name, object value)
|
|
public override void OnSettingsChanged(string name, object value)
|
|
{
|
|
{
|
|
- var colorChangedAction = SettingsChange();
|
|
|
|
- internals!.ActionAccumulator.AddActions(colorChangedAction);
|
|
|
|
|
|
+ var colorChangedActions = SettingsChange();
|
|
|
|
+ if (ActiveMode == ShapeToolMode.Transform)
|
|
|
|
+ {
|
|
|
|
+ internals!.ActionAccumulator.AddFinishedActions(colorChangedActions);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
public override void OnMidChangeUndo()
|
|
public override void OnMidChangeUndo()
|
|
{
|
|
{
|
|
- if (ActiveMode != ShapeToolMode.Transform)
|
|
|
|
|
|
+ if (ActiveMode != ShapeToolMode.Transform || localUndoStack == null)
|
|
return;
|
|
return;
|
|
|
|
|
|
- document!.LineToolOverlayHandler.Undo();
|
|
|
|
|
|
+ var undone = localUndoStack?.Undo();
|
|
|
|
+ if (undone is not null)
|
|
|
|
+ {
|
|
|
|
+ ApplyState(undone);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
public override void OnMidChangeRedo()
|
|
public override void OnMidChangeRedo()
|
|
{
|
|
{
|
|
- if (ActiveMode != ShapeToolMode.Transform)
|
|
|
|
|
|
+ if (ActiveMode != ShapeToolMode.Transform || localUndoStack == null)
|
|
return;
|
|
return;
|
|
|
|
|
|
- document!.LineToolOverlayHandler.Redo();
|
|
|
|
|
|
+ var redone = localUndoStack?.Redo();
|
|
|
|
+ if (redone is not null)
|
|
|
|
+ {
|
|
|
|
+ ApplyState(redone);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
public override void OnTransformApplied()
|
|
public override void OnTransformApplied()
|
|
@@ -244,4 +267,29 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
|
|
{
|
|
{
|
|
document!.LineToolOverlayHandler.Hide();
|
|
document!.LineToolOverlayHandler.Hide();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private void AddToUndo((VecD, VecD) newPos)
|
|
|
|
+ {
|
|
|
|
+ if (UseGlobalUndo)
|
|
|
|
+ {
|
|
|
|
+ internals!.ActionAccumulator.AddFinishedActions(EndDraw(), TransformOverlayMoved(newPos.Item1, newPos.Item2), EndDraw());
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ localUndoStack!.AddState(ConstructLineData(newPos.Item1, newPos.Item2));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ protected LineVectorData ConstructLineData(VecD start, VecD end)
|
|
|
|
+ {
|
|
|
|
+ return new LineVectorData(start, end) { StrokeWidth = (float)StrokeWidth, StrokeColor = StrokeColor };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void ApplyState(LineVectorData data)
|
|
|
|
+ {
|
|
|
|
+ toolbar!.StrokeColor = data.StrokeColor.ToColor();
|
|
|
|
+ toolbar!.ToolSize = data.StrokeWidth;
|
|
|
|
+
|
|
|
|
+ document!.LineToolOverlayHandler.Show(data.Start, data.End, ShowApplyButton, AddToUndo);
|
|
|
|
+ }
|
|
}
|
|
}
|