Mailspring/src/undo-manager.coffee

51 lines
1.3 KiB
CoffeeScript
Raw Normal View History

_ = require 'underscore'
module.exports =
class UndoManager
constructor: ->
@_historyIndex = -1
@_markerIndex = -1
@_history = []
@_markers = []
@_MAX_HISTORY_SIZE = 1000
current: ->
return @_history[@_historyIndex]
undo: ->
@__saveHistoryMarker()
if @_historyIndex > 0
@_markerIndex -= 1
@_historyIndex = @_markers[@_markerIndex]
return @_history[@_historyIndex]
else return null
redo: ->
@__saveHistoryMarker()
if @_historyIndex < (@_history.length - 1)
@_markerIndex += 1
@_historyIndex = @_markers[@_markerIndex]
return @_history[@_historyIndex]
else return null
saveToHistory: (historyItem) =>
if not _.isEqual((_.last(@_history) ? {}), historyItem)
@_historyIndex += 1
@_history.length = @_historyIndex
@_history.push(historyItem)
@_saveHistoryMarker()
while @_history.length > @_MAX_HISTORY_SIZE
@_history.shift()
@_historyIndex -= 1
__saveHistoryMarker: =>
if @_markers[@_markerIndex] isnt @_historyIndex
@_markerIndex += 1
@_markers.length = @_markerIndex
@_markers.push(@_historyIndex)
while @_markers.length > @_MAX_HISTORY_SIZE
@_markers.shift()
@_markerIndex -= 1
_saveHistoryMarker: _.debounce(UndoManager::__saveHistoryMarker, 300)