BsUndoRedo.cpp 2.1 KB

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