Пример #1
0
    private void DrawOperationMgrUI()
    {
        if (EditorUtils.DrawHeader("操作管理", "TerrainEditor"))
        {
            limitStackCount = EditorGUILayout.IntSlider("栈数限制", limitStackCount, 5, 100);

            if (GUILayout.Button("Undo" + "( " + (undoStack.Count > 0 ? undoStack.Peek().name : "无") + " )"))
            {
                if (undoStack.Count > 0)
                {
                    isUndoTopPop = true;
                    UndoRedoOperation undoRedoOperation = undoStack.Pop();
                    redoStack.Push(undoRedoOperation);
                    undoRedoOperation = undoStack.Pop();
                    undoRedoOperation.DoIt();
                    redoStack.Push(undoRedoOperation);
                }
            }
            if (GUILayout.Button("Redo" + "( " + (redoStack.Count > 0?redoStack.Peek().name:"无") + " )"))
            {
                if (redoStack.Count > 0)
                {
                    UndoRedoOperation undoRedoOperation = redoStack.Pop();
                    undoStack.Push(undoRedoOperation);
                    undoRedoOperation = redoStack.Pop();
                    undoRedoOperation.DoIt();
                    undoStack.Push(undoRedoOperation);
                }
            }
        }
    }
Пример #2
0
 void RaiseChanged(UndoRedoOperation undoRedo, string action)
 {
     if (Changed != null)
     {
         Changed(this, new UndoRedoEventArgs(undoRedo, action));
     }
 }
Пример #3
0
        public void PushReverseAction <T>(UndoRedoOperation <T> undoOperation, T undoData)
        {
            List <IUndoRedoAction> stack = null;

            if (_undoInProgress)
            {
                stack = _redoActions;
            }
            else
            {
                stack = _undoActions;
            }

            if ((!_undoInProgress) && (!_redoInProgress))
            {
                //_redoActions.Clear();
            }
            if (_curTran == null)
            {
                ListOperations.Push(stack, new UndoRedoAction <T>(undoOperation, undoData));
            }
            else
            {
                (stack[0] as UndoTransaction).AddUndoRedoOperation(new UndoRedoAction <T>(undoOperation, undoData));
            }

            if (stack.Count > _maximumActions)
            {
                stack.RemoveRange(_maximumActions - 1, stack.Count - _maximumActions);
            }
        }
Пример #4
0
        /// <summary>
        /// Pushes an item onto the undo/redo stack.
        /// 1) If this is called outside the context of a undo/redo operation, the item is added to the undo stack.
        /// 2) If this is called in the context of an undo operation, the item is added to redo stack.
        /// 3) If this is called in context of an redo operation, item is added to undo stack.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="undoOperation"></param>
        /// <param name="undoData"></param>
        /// <param name="description"></param>
        public void Push <T>(UndoRedoOperation <T> undoOperation, T undoData, string description = "")
        {
            Debug.Assert(null != undoOperation);

            if (IsStopPush)
            {
                return;
            }

            List <IUndoRedoRecord> stack = null;
            Action eventToFire;

            ///Determien the stack to which this operation will be added
            if (_undoGoingOn)
            {
                Trace.TraceInformation("Adding to redo stack {0} with data {1}", undoOperation.Method.Name, undoData);
                stack       = _redoStack;
                eventToFire = new Action(FireRedoStackStatusChanged);
            }
            else
            {
                Trace.TraceInformation("Adding to undo stack {0} with data {1}", undoOperation.Method.Name, undoData);
                stack       = _undoStack;
                eventToFire = new Action(FireUndoStackStatusChanged);
            }

            if ((!_undoGoingOn) && (!_redoGoingOn))
            {//if someone added an item to undo stack while there are items in redo stack.. clear the redo stack
                _redoStack.Clear();
                FireRedoStackStatusChanged();
            }
            ///If a transaction is going on, add the operation as a entry to the transaction operation
            if (!_hasTransaction)
            {
                stack.Push(new UndoRedoRecord <T>(undoOperation, undoData, description));
            }
            else
            {
                (stack[0] as UndoTransaction).AddUndoRedoOperation(new UndoRedoRecord <T>(undoOperation, undoData,
                                                                                          description));
            }

            //If the stack count exceeds maximum allowed items
            if (stack.Count > MaxItems)
            {
                object o = stack[stack.Count - 1];
                Trace.TraceInformation("Removing item {0}", o);
                stack.RemoveRange(MaxItems - 1, stack.Count - MaxItems);
            }
            //Fire event to inform consumers that the stack size has changed
            eventToFire();
        }
Пример #5
0
        /// <summary>
        /// 向撤销/重做堆栈推入操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="undoOperation"></param>
        /// <param name="undoData"></param>
        /// <param name="description"></param>
        public void Push <T>(UndoRedoOperation <T> undoOperation, T undoData, string description = "")
        {
            List <IUndoRedoRecord> stack;
            Action eventToFire;

            // 通过撤销/重做标识决定如何堆栈
            if (_UndoGoingOn)
            {
                stack       = _RedoStack;
                eventToFire = FireRedoStackStatusChanged;
            }
            else
            {
                stack       = _UndoStack;
                eventToFire = FireUndoStackStatusChanged;
            }

            if (!_UndoGoingOn && !_RedoGoingOn)
            {
                _RedoStack.Clear();
                FireRedoStackStatusChanged();
            }

            // 如果正在进行事务,则将该操作作为条目添加到事务操作中
            if (_CurTran == null)
            {
                stack.Push(new UndoRedoRecord <T>(undoOperation, undoData, description));
            }
            else
            {
                ((UndoTransaction)stack[0]).AddUndoRedoOperation(new UndoRedoRecord <T>(undoOperation, undoData,
                                                                                        description));
            }

            // 堆栈计数超过允许的最大项
            if (stack.Count > MaxItems)
            {
                stack.RemoveRange(MaxItems - 1, stack.Count - MaxItems);
            }

            // 通知消费者堆栈大小已更改
            eventToFire();
        }
Пример #6
0
        /// <summary>
        /// Pushes the specified undo operation.
        /// </summary>
        /// <typeparam name="T">type of the first paramater of the operation to be performed</typeparam>
        /// <typeparam name="K">type of the second paramater of the operation to be performed</typeparam>
        /// <param name="undoOperation">The undo operation.</param>
        /// <param name="undoData">The undo data.</param>
        /// <param name="undoData1">The undo data1.</param>
        /// <param name="description">The description.</param>
        public void Push <T, K>(UndoRedoOperation <T, K> undoOperation, T undoData, K undoData1, string description = "")
        {
            Action eventToFire           = this.GetEventToBeFired();
            List <IUndoRedoRecord> stack = this.GetStackToAddTo();

            this.ClearRedoStackIfAddedItemToUndo();

            // If a transaction is going on, add the operation as a entry to the transaction operation
            if (this.currentTransaction == null)
            {
                stack.Push(new UndoRedoRecord <T, K>(undoOperation, undoData, undoData1, description));
            }
            else
            {
                (stack[0] as UndoTransaction).AddUndoRedoOperation(new UndoRedoRecord <T, K>(undoOperation, undoData, undoData1, description));
            }

            this.TrimStackMaximumExceed(stack);

            // Fire event to inform consumers that the stack size has changed
            eventToFire();
        }
Пример #7
0
        public void InsertUndoRedoOperation(UndoRedoOperation operation, object operationArgs)
        {
            switch (operation)
            {
            case UndoRedoOperation.AddStrokes:
                InsertAddStrokeOperation((StrokeOperationArgs)operationArgs);
                break;

            case UndoRedoOperation.EraseStrokes:
                InsertEraseStrokeOperation((StrokeOperationArgs)operationArgs);
                break;

            case UndoRedoOperation.EraseAllStrokes:
                InsertEraseAllStrokesOperation((StrokeOperationArgs)operationArgs);
                break;

            case UndoRedoOperation.FillCell:
                InsertFillCellOperation((CellOperationArgs)operationArgs);
                break;

            case UndoRedoOperation.EraseCell:
                InsertEraseCellOperation((CellOperationArgs)operationArgs);
                break;

            case UndoRedoOperation.EraseAllCells:
                InsertEraseAllCellsOperation((CellOperationArgs)operationArgs);
                break;

            case UndoRedoOperation.None:
            default:
                break;
            }

            if (operation != UndoRedoOperation.None)
            {
                HighestUsedTransactionId = TransactionId;
                ClearRedoStack();
            }
        }
Пример #8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="T:UndoRedoEventArgs" /> class.
 /// </summary>
 /// <param name="undoRedo">The undo redo.</param>
 /// <param name="action">The action.</param>
 public UndoRedoEventArgs(UndoRedoOperation undoRedo, string action)
 {
     UndoRedo = undoRedo;
     Action   = action;
 }
Пример #9
0
 /// <summary>
 /// Sets the information.
 /// </summary>
 /// <param name="operationToSet">The operation.</param>
 /// <param name="undoDataToSet">The undo data.</param>
 /// <param name="descriptionToSet">The description.</param>
 public void SetInfo(UndoRedoOperation <T> operationToSet, T undoDataToSet, string descriptionToSet = "")
 {
     this.operation   = operationToSet;
     this.undoData    = undoDataToSet;
     this.description = descriptionToSet;
 }
Пример #10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="UndoRedoRecord{T}"/> class.
 /// </summary>
 /// <param name="operation">The operation.</param>
 /// <param name="undoData">The undo data.</param>
 /// <param name="description">The description.</param>
 public UndoRedoRecord(UndoRedoOperation <T> operation, T undoData, string description = "")
 {
     this.SetInfo(operation, undoData, description);
 }
Пример #11
0
 public void SetInfo(UndoRedoOperation <T> operation, T undoData, string description = "")
 {
     _operation   = operation;
     _undoData    = undoData;
     _description = description;
 }
Пример #12
0
 public void SetInfo(UndoRedoOperation <T> operation, T undoData, string description = "")
 {
     m_Operation   = operation;
     m_UndoData    = undoData;
     m_Description = description;
 }
Пример #13
0
 public void Push(UndoRedoOperation operation)
 {
     UndoStack.Push(operation);
 }
Пример #14
0
 public UndoRedoAction(UndoRedoOperation <T> operation, T actionData)
 {
     _operation  = operation;
     _actionData = actionData;
 }