123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace SketchAssistantWPF
- {
- public class ActionHistory
- {
- //History of Actions taken
- List<SketchAction> actionHistory;
- //The current position in the actionHistory
- Tuple<int, SketchAction> currentAction;
- public ActionHistory()
- {
- actionHistory = new List<SketchAction>();
- currentAction = new Tuple<int, SketchAction>(-1, null);
- AddNewAction(new SketchAction(SketchAction.ActionType.Start, -1));
- }
- /// <summary>
- /// Resets the action history to its initial state.
- /// </summary>
- /// <returns>The new Last Action taken.</returns>
- public String Reset()
- {
- actionHistory.Clear();
- currentAction = new Tuple<int, SketchAction>(-1, null);
- return AddNewAction(new SketchAction(SketchAction.ActionType.Start, -1));
- }
- /// <summary>
- /// Adds a new action to the action history.
- /// </summary>
- /// <param name="newAction">The newly added action.</param>
- /// <returns>The message to be displayed</returns>
- public String AddNewAction(SketchAction newAction)
- {
- //The current Action is before the last action taken, delete everything after the current action.
- if (currentAction.Item1 < actionHistory.Count - 1)
- {
- actionHistory.RemoveRange(currentAction.Item1 + 1, actionHistory.Count - (currentAction.Item1 + 1));
- }
- actionHistory.Add(newAction);
- currentAction = new Tuple<int, SketchAction>(actionHistory.Count - 1, newAction);
- return UpdateStatusLabel();
- }
- /// <summary>
- /// Changes the currentAction.
- /// </summary>
- /// <param name="moveBack">If True, moves the current action back one slot, if False, moves it forward.</param>
- /// <returns>The message to be displayed</returns>
- public String MoveAction(bool moveBack)
- {
- if (moveBack && CanUndo())
- {
- currentAction = new Tuple<int, SketchAction>(currentAction.Item1 - 1, actionHistory[currentAction.Item1 - 1]);
- }
- if (!moveBack && CanRedo())
- {
- currentAction = new Tuple<int, SketchAction>(currentAction.Item1 + 1, actionHistory[currentAction.Item1 + 1]);
- }
- return UpdateStatusLabel();
- }
- /// <summary>
- /// Returns the current action.
- /// </summary>
- /// <returns>The current action.</returns>
- public SketchAction GetCurrentAction()
- {
- return currentAction.Item2;
- }
- /// <summary>
- /// Return whether or not an action can be undone.
- /// </summary>
- /// <returns>True if an action can be undone.</returns>
- public bool CanUndo()
- {
- if (currentAction.Item1 > 0) { return true; }
- else { return false; }
- }
- /// <summary>
- /// Return whether or not an action can be redone.
- /// </summary>
- /// <returns>True if an action can be redone.</returns>
- public bool CanRedo()
- {
- if (currentAction.Item1 < actionHistory.Count - 1) { return true; }
- else { return false; }
- }
- /// <summary>
- /// Returns whether or not the history is empty.
- /// </summary>
- /// <returns>true if the history is empty, otherwise false</returns>
- public bool IsEmpty()
- {
- if (actionHistory.Count == 1) { return true; }
- else { return false; }
- }
- /// <summary>
- /// Updates the status label if there is one given.
- /// </summary>
- /// <returns>The message to be displayed</returns>
- private String UpdateStatusLabel()
- {
- return "Last Action: " + currentAction.Item2.GetActionInformation();
- }
- }
- }
|