Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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();
            }
        }