Add UndoManager.prototype.transact

The `transact` method takes a function and batches all operations within that function as a single transaction to be undone and redone. The edit session now uses generic operations to restore selection state around transactions. The `undo` and `do` methods on operations are now optional. In addition, the undo manager now supports an optional `redo` method on an operation for code that should *only* be run on redo, and not when the operation is initially pushed. This is used by edit session to restore selection state after redo.
This commit is contained in:
Nathan Sobo
2012-07-05 20:04:16 -06:00
parent c053be3394
commit 42eefb49a9
4 changed files with 49 additions and 61 deletions

View File

@@ -132,10 +132,7 @@ class Buffer
change: (oldRange, newText) ->
oldRange = Range.fromObject(oldRange)
operation = new BufferChangeOperation({buffer: this, oldRange, newText})
if @undoManager
@undoManager.pushOperation(operation)
else
operation.do()
@pushOperation(operation)
prefixAndSuffixForRange: (range) ->
prefix: @lines[range.start.row][0...range.start.column]
@@ -145,11 +142,14 @@ class Buffer
@lines[startRow..endRow] = newLines
@modified = true
startUndoBatch: (selectedBufferRanges) ->
@undoManager.startUndoBatch(selectedBufferRanges)
pushOperation: (operation) ->
if @undoManager
@undoManager.pushOperation(operation)
else
operation.do()
endUndoBatch: (selectedBufferRanges) ->
@undoManager.endUndoBatch(selectedBufferRanges)
transact: (fn) ->
@undoManager.transact(fn)
undo: ->
@undoManager.undo()