/// <summary> /// Juggles stacks to "Redo the latest recorded undone action" /// </summary> public void Redo() { var redoAct = RedoStack.Pop(); redoAct(); DoStack.Push(redoAct); UndoStack.Push(BackupStack.Pop()); }
/// <summary> /// Juggles stacks to "Undo" the latest recorded action /// </summary> public void Undo() { var undoAct = UndoStack.Pop(); undoAct(); BackupStack.Push(undoAct); RedoStack.Push(DoStack.Pop()); }
/// <summary> /// 작업을 추가합니다. /// </summary> /// <param name="task"></param> public virtual void Push(TaskData task) { ClearUndoStack(); DoStack.Push(task); task.Do(); Update(); }
/// <summary> /// Juggles stacks to "Do" something /// </summary> /// <param name="DoAct">Do Action</param> /// <param name="UndoAct">Undo Action</param> /// <param name="Entry">Weather there should be a new entry for this action in the stacks</param> public void Do(Action DoAct, Action UndoAct, bool Entry) { if (Entry) { DoStack.Push(DoAct); UndoStack.Push(UndoAct); RedoStack.Clear(); BackupStack.Clear(); } DoAct(); }
protected virtual void ClearUndoStack() { foreach (TaskData task in UndoStack.ToArray().Reverse()) { // 삭제될 Task의 Source를 참조하고 있는지 확인함 if (!task.IsStable && DoStack.Count(t => t.Source.Equals(task.Source)) == 0) { task.Dispose(); } } UndoStack.Clear(); }
/// <summary> /// 이전 상태로 되돌아갑니다. /// </summary> /// <returns></returns> public bool Undo() { if (DoStack.Count > 0) { TaskData task = DoStack.Pop(); UndoStack.Push(task); task.Undo(); Update(); return(true); } return(false); }
/// <summary> /// 이전 상태로 되돌린 작업을 취소합니다. /// </summary> /// <returns></returns> public bool Redo() { if (CanRedo) { TaskData task = UndoStack.Pop(); DoStack.Push(task); task.Do(); Update(); return(true); } return(false); }