summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/rectangles/util/undo.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts/rectangles/util/undo.js')
-rw-r--r--public/assets/javascripts/rectangles/util/undo.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/public/assets/javascripts/rectangles/util/undo.js b/public/assets/javascripts/rectangles/util/undo.js
new file mode 100644
index 0000000..3700817
--- /dev/null
+++ b/public/assets/javascripts/rectangles/util/undo.js
@@ -0,0 +1,42 @@
+(function(){
+
+ var UndoStack = function(){
+ this.stack = []
+ this.types = {}
+ this.pointer = -1
+ }
+ UndoStack.prototype.push = function(action){
+ this.pointer++
+ this.stack[this.pointer] = action
+ this.purge()
+ }
+ UndoStack.prototype.purge = function(){
+ if (this.stack.length-1 == this.pointer) return
+ this.stack.length = this.pointer+1
+ }
+ UndoStack.prototype.undo = function(){
+ if (this.pointer == -1) return false
+ var action = this.stack[this.pointer]
+ this.types[ action.type ].undo(action)
+ this.pointer--
+ return this.pointer > -1
+ }
+ UndoStack.prototype.redo = function(){
+ if (this.pointer == this.stack.length-1) return false
+ this.pointer++
+ var action = this.stack[this.pointer]
+ this.types[ action.type ].redo(action)
+ return this.pointer < this.stack.length-1
+ }
+ UndoStack.prototype.register = function(actionType){
+ this.types[ actionType.type ] = actionType
+ }
+
+ if ('window' in this) {
+ window.UndoStack = new UndoStack
+ }
+ else {
+ module.exports = new UndoStack
+ }
+
+})()