54 lines
1.5 KiB
Lua
54 lines
1.5 KiB
Lua
-- Path of Building
|
|
--
|
|
-- Class: Undo Handler
|
|
-- Handler for classes that need to provide undo/redo functionality
|
|
-- Classes that use this must define 2 functions:
|
|
-- undoState = :CreateUndoState() Returns a new undo state that reflects the current state
|
|
-- :RestoreUndoState(undoState) Reverts the current state to the given undo state
|
|
--
|
|
local launch, main = ...
|
|
|
|
local t_insert = table.insert
|
|
local t_remove = table.remove
|
|
|
|
local UndoHandlerClass = common.NewClass("UndoHandler", function(self)
|
|
self.undo = { }
|
|
self.redo = { }
|
|
end)
|
|
|
|
-- Initialises the undo/redo buffers
|
|
-- Should be called after the current state is first loaded/initialised
|
|
function UndoHandlerClass:ResetUndo()
|
|
self.undo = wipeTable(self.undo)
|
|
self.redo = wipeTable(self.redo)
|
|
self.undo[1] = self:CreateUndoState()
|
|
end
|
|
|
|
-- Adds a new undo state to the undo buffer, and also clears the redo buffer
|
|
-- Should be called after the user makes a change to the current state
|
|
function UndoHandlerClass:AddUndoState(noClearRedo)
|
|
t_insert(self.undo, 1, self:CreateUndoState())
|
|
self.undo[102] = nil
|
|
self.modFlag = true
|
|
if not noClearRedo then
|
|
self.redo = wipeTable(self.redo)
|
|
end
|
|
end
|
|
|
|
-- Reverts the current state to the previous undo state
|
|
function UndoHandlerClass:Undo()
|
|
if self.undo[2] then
|
|
t_insert(self.redo, 1, t_remove(self.undo, 1))
|
|
self:RestoreUndoState(t_remove(self.undo, 1))
|
|
self:AddUndoState(true)
|
|
end
|
|
end
|
|
|
|
-- Reverts the most recent undo operation
|
|
function UndoHandlerClass:Redo()
|
|
if self.redo[1] then
|
|
self:RestoreUndoState(t_remove(self.redo, 1))
|
|
self:AddUndoState(true)
|
|
end
|
|
end
|