|
-
- require("Commands")
-
- -- Undo redo管理器
- -- 负责编辑器的撤销和恢复操作
-
- local UndoRedoManager = class("UndoRedoManager")
-
- function UndoRedoManager:ctor()
- -- redo 列表
- self.redoStack = {};
- -- undo 列表
- self.undoStack = {};
- -- 最大的撤销步数
- self.maxStack = 100;
- end
-
- -- 执行一个操作
- function UndoRedoManager:doCommand(command)
- if command:redo() then
- self:addCommand(command);
- else
- if type(command.clear) == "function" then
- command:clear();
- end
- end
- end
-
- -- 压入一个操作
- function UndoRedoManager:addCommand(command)
- -- 清空恢复操作列表
- self:clearRedo();
- -- 如果队列满了则需要踢出最久的那个操作
- if #self.undoStack > self.maxStack then
- local undoIt = self.undoStack[table.nums(self.undoStack)];
- if type(undoIt.clear) == "function" then
- undoIt.clear();
- end
-
- table.remove(self.undoStack, #self.undoStack);
- end
-
- table.insert(self.undoStack, command);
- end
-
- -- redo操作
- function UndoRedoManager:redo()
- if #self.redoStack <= 0 then
- return
- end
-
- local redoT = self.redoStack[table.nums(self.redoStack)];
- redoT:redo();
-
- -- 加入到恢复列表里面去
- table.insert(self.undoStack, redoT);
- -- 从撤销列表里面去掉这个操作
- table.remove(self.redoStack, #self.redoStack);
- end
-
- -- undo操作
- function UndoRedoManager:undo()
- if #self.undoStack <= 0 then
- return
- end
-
- local undoT = self.undoStack[table.nums(self.undoStack)];
- undoT:undo();
-
- -- 加入到撤销列表里面去
- table.insert(self.redoStack, undoT);
- -- 从恢复列表里面去掉这个操作
- table.remove(self.undoStack, #self.undoStack);
- end
-
- function UndoRedoManager:canRedo()
- return #self.redoStack > 0;
- end
-
- function UndoRedoManager:canUndo()
- return #self.undoStack > 0;
- end
-
- function UndoRedoManager:clearRedo()
- -- 清空一些数据
- for i, v in pairs(self.redoStack) do
- if type(v.clear) == "function" then
- v:clear();
- end
- end
-
- -- 清空恢复列表
- self.redoStack = {};
- end
-
- function UndoRedoManager:clearUndo()
- -- 清空一些数据
- for i, v in pairs(self.undoStack) do
- if type(v.clear) == "function" then
- v:clear();
- end
- end
-
- -- 清空撤销列表
- self.undoStack = {};
- end
-
- -- 清空所有的撤销、恢复操作
- function UndoRedoManager:clear()
- self:clearRedo();
- self:clearUndo();
- end
-
- return UndoRedoManager
|