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