You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
2.3 KiB

  1. require("Commands")
  2. -- Undo redo管理器
  3. -- 负责编辑器的撤销和恢复操作
  4. local UndoRedoManager = class("UndoRedoManager")
  5. function UndoRedoManager:ctor()
  6. -- redo 列表
  7. self.redoStack = {};
  8. -- undo 列表
  9. self.undoStack = {};
  10. -- 最大的撤销步数
  11. self.maxStack = 100;
  12. end
  13. -- 执行一个操作
  14. function UndoRedoManager:doCommand(command)
  15. if command:redo() then
  16. self:addCommand(command);
  17. else
  18. if type(command.clear) == "function" then
  19. command:clear();
  20. end
  21. end
  22. end
  23. -- 压入一个操作
  24. function UndoRedoManager:addCommand(command)
  25. -- 清空恢复操作列表
  26. self:clearRedo();
  27. -- 如果队列满了则需要踢出最久的那个操作
  28. if #self.undoStack > self.maxStack then
  29. local undoIt = self.undoStack[table.nums(self.undoStack)];
  30. if type(undoIt.clear) == "function" then
  31. undoIt.clear();
  32. end
  33. table.remove(self.undoStack, #self.undoStack);
  34. end
  35. table.insert(self.undoStack, command);
  36. end
  37. -- redo操作
  38. function UndoRedoManager:redo()
  39. if #self.redoStack <= 0 then
  40. return
  41. end
  42. local redoT = self.redoStack[table.nums(self.redoStack)];
  43. redoT:redo();
  44. -- 加入到恢复列表里面去
  45. table.insert(self.undoStack, redoT);
  46. -- 从撤销列表里面去掉这个操作
  47. table.remove(self.redoStack, #self.redoStack);
  48. end
  49. -- undo操作
  50. function UndoRedoManager:undo()
  51. if #self.undoStack <= 0 then
  52. return
  53. end
  54. local undoT = self.undoStack[table.nums(self.undoStack)];
  55. undoT:undo();
  56. -- 加入到撤销列表里面去
  57. table.insert(self.redoStack, undoT);
  58. -- 从恢复列表里面去掉这个操作
  59. table.remove(self.undoStack, #self.undoStack);
  60. end
  61. function UndoRedoManager:canRedo()
  62. return #self.redoStack > 0;
  63. end
  64. function UndoRedoManager:canUndo()
  65. return #self.undoStack > 0;
  66. end
  67. function UndoRedoManager:clearRedo()
  68. -- 清空一些数据
  69. for i, v in pairs(self.redoStack) do
  70. if type(v.clear) == "function" then
  71. v:clear();
  72. end
  73. end
  74. -- 清空恢复列表
  75. self.redoStack = {};
  76. end
  77. function UndoRedoManager:clearUndo()
  78. -- 清空一些数据
  79. for i, v in pairs(self.undoStack) do
  80. if type(v.clear) == "function" then
  81. v:clear();
  82. end
  83. end
  84. -- 清空撤销列表
  85. self.undoStack = {};
  86. end
  87. -- 清空所有的撤销、恢复操作
  88. function UndoRedoManager:clear()
  89. self:clearRedo();
  90. self:clearUndo();
  91. end
  92. return UndoRedoManager