/// <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); }
public bool CanMerge(IOperationMergeJudge operationMergeJudge) { if (operationMergeJudge is KeyOperationMergeJudge <T> timeStampMergeInfo) { return(Equals(Key, timeStampMergeInfo.Key) && TimeStamp - timeStampMergeInfo.TimeStamp < Permission); } return(false); }
public MergeableOperation( Action <T> setter, T newValue, T oldValue, IOperationMergeJudge operationMergeJudge = null) { Setter = setter; PrevProperty = oldValue; Property = newValue; MergeJudge = operationMergeJudge; }