/// <summary> /// OperationManagerのUndoStackとマージします。 /// 統合されたOperationはUndoStackから除外されます。 /// Operationが統合された場合OperationManagerのRedoStackはクリアされます。 /// </summary> /// <param name="operationController"></param> /// <returns></returns> public IOperation Merge(IOperationController operationController) { if (operationController.CanUndo is false) { return(this); } if (MergeJudge is null) { return(this); } var topCommand = operationController.Peek(); var prevValue = PrevProperty; var mergeInfo = MergeJudge; while (topCommand is MergeableOperation <T> propertyChangeOperation) { if (MergeJudge.CanMerge(propertyChangeOperation.MergeJudge) is false) { break; } mergeInfo = propertyChangeOperation.MergeJudge; prevValue = propertyChangeOperation.PrevProperty; operationController.Pop(); topCommand = operationController.Peek(); } PrevProperty = prevValue; MergeJudge = mergeInfo; return(this); }
/// <summary> /// OperationManagerのUndoStackとマージします。 /// 統合されたOperationはUndoStackから除外されます。 /// Operationが統合された場合OperationManagerのRedoStackはクリアされます。 /// </summary> public IOperation Merge(IOperationController operationController) { if (operationController.CanUndo is false) { return(this); } if (MergeJudge is null) { return(this); } var topCommand = operationController.Peek(); var mergeInfo = MergeJudge; while (topCommand is MergeableOperation mergeableOperation) { if (MergeJudge.CanMerge(mergeableOperation.MergeJudge) is false) { break; } mergeInfo = mergeableOperation.MergeJudge; _rollBack = mergeableOperation._rollBack; operationController.Pop(); topCommand = operationController.Peek(); } MergeJudge = MergeJudge.Update(mergeInfo); return(this); }
public static void MoveTo(this IOperationController controller, IOperation target) { var isRollBack = controller.Operations.Contains(target); var isRollForward = controller.RollForwardTargets.Contains(target); if (isRollBack is false && isRollForward is false) { return; } if (isRollBack) { while (controller.Peek() != target) { controller.Undo(); } } if (isRollForward) { while (controller.RollForwardTargets.FirstOrDefault() != target) { controller.Redo(); } controller.Redo(); } }