BsUndoRedo.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "BsUndoRedo.h"
  2. #include "BsEditorCommand.h"
  3. namespace BansheeEngine
  4. {
  5. const UINT32 UndoRedo::MAX_STACK_ELEMENTS = 1000;
  6. UndoRedo::UndoRedo()
  7. :mUndoStackPtr(0), mUndoNumElements(0),
  8. mRedoStackPtr(0), mRedoNumElements(0),
  9. mUndoStack(nullptr), mRedoStack(nullptr)
  10. {
  11. mUndoStack = cm_newN<EditorCommand*>(MAX_STACK_ELEMENTS);
  12. mRedoStack = cm_newN<EditorCommand*>(MAX_STACK_ELEMENTS);
  13. }
  14. UndoRedo::~UndoRedo()
  15. {
  16. clearUndoStack();
  17. clearRedoStack();
  18. cm_deleteN(mUndoStack, MAX_STACK_ELEMENTS);
  19. cm_deleteN(mRedoStack, MAX_STACK_ELEMENTS);
  20. }
  21. void UndoRedo::undo()
  22. {
  23. if(mUndoNumElements == 0)
  24. return;
  25. EditorCommand* command = mUndoStack[mUndoStackPtr];
  26. mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
  27. mUndoNumElements--;
  28. mRedoStackPtr = (mRedoStackPtr + 1) % MAX_STACK_ELEMENTS;
  29. mRedoStack[mRedoStackPtr] = command;
  30. mRedoNumElements++;
  31. command->revert();
  32. }
  33. void UndoRedo::redo()
  34. {
  35. if(mRedoNumElements == 0)
  36. return;
  37. EditorCommand* command = mRedoStack[mRedoStackPtr];
  38. mRedoStackPtr = (mRedoStackPtr - 1) % MAX_STACK_ELEMENTS;
  39. mRedoNumElements--;
  40. mUndoStackPtr = (mUndoStackPtr + 1) % MAX_STACK_ELEMENTS;
  41. mUndoStack[mUndoStackPtr] = command;
  42. mUndoNumElements++;
  43. command->commit();
  44. }
  45. void UndoRedo::registerCommand(EditorCommand* command)
  46. {
  47. mUndoStackPtr = (mUndoStackPtr + 1) % MAX_STACK_ELEMENTS;
  48. mUndoStack[mUndoStackPtr] = command;
  49. mUndoNumElements++;
  50. clearRedoStack();
  51. }
  52. void UndoRedo::clearUndoStack()
  53. {
  54. while(mUndoNumElements > 0)
  55. {
  56. EditorCommand* command = mUndoStack[mUndoStackPtr];
  57. mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
  58. mUndoNumElements--;
  59. EditorCommand::destroy(command);
  60. }
  61. }
  62. void UndoRedo::clearRedoStack()
  63. {
  64. while(mRedoNumElements > 0)
  65. {
  66. EditorCommand* command = mRedoStack[mRedoStackPtr];
  67. mRedoStackPtr = (mRedoStackPtr - 1) % MAX_STACK_ELEMENTS;
  68. mRedoNumElements--;
  69. EditorCommand::destroy(command);
  70. }
  71. }
  72. }