Rework Buffer's 'contents-modified' event

This event now fires whenever the content of the buffer changes (after 
a rate-limiting delay) with a single boolean indicating the modified
status of the buffer. There's now a separate event called
'modified-status-changed' to indicate events that change the boolean
value of the isModified method, so we don't need to fire
'contents-modified' when the underlying file is deleted for instance.
This commit is contained in:
Nathan Sobo
2013-02-28 08:35:32 -07:00
committed by probablycorey
parent a1dc2cfc2d
commit 298a963148
4 changed files with 24 additions and 56 deletions

View File

@@ -1105,61 +1105,30 @@ describe 'Buffer', ->
expect(buffer.isEmpty()).toBeFalsy()
describe "'contents-modified' event", ->
describe "when the buffer is deleted", ->
it "triggers the contents-modified event", ->
delay = buffer.stoppedChangingDelay
path = "/tmp/atom-file-to-delete.txt"
fs.write(path, 'delete me')
bufferToDelete = new Buffer(path)
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
bufferToDelete.on 'contents-modified', contentsModifiedHandler
it "triggers the 'contents-modified' event with the current modified status when the buffer changes, rate-limiting events with a delay", ->
delay = buffer.stoppedChangingDelay
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
buffer.on 'contents-modified', contentsModifiedHandler
expect(bufferToDelete.getPath()).toBe path
expect(bufferToDelete.isModified()).toBeFalsy()
expect(contentsModifiedHandler).not.toHaveBeenCalled()
buffer.insert([0, 0], 'a')
expect(contentsModifiedHandler).not.toHaveBeenCalled()
removeHandler = jasmine.createSpy('removeHandler')
bufferToDelete.file.on 'removed', removeHandler
fs.remove(path)
waitsFor "file to be removed", ->
removeHandler.callCount > 0
advanceClock(delay / 2)
runs ->
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:true)
bufferToDelete.destroy()
buffer.insert([0, 0], 'b')
expect(contentsModifiedHandler).not.toHaveBeenCalled()
describe "when the buffer text has been changed", ->
it "triggers the contents-modified event 'stoppedChangingDelay' ms after the last buffer change", ->
delay = buffer.stoppedChangingDelay
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
buffer.on 'contents-modified', contentsModifiedHandler
advanceClock(delay / 2)
expect(contentsModifiedHandler).not.toHaveBeenCalled()
buffer.insert([0, 0], 'a')
expect(contentsModifiedHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
expect(contentsModifiedHandler).toHaveBeenCalledWith(true)
advanceClock(delay / 2)
buffer.insert([0, 0], 'b')
expect(contentsModifiedHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
expect(contentsModifiedHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
expect(contentsModifiedHandler).toHaveBeenCalled()
it "triggers the contents-modified event with data about whether its contents differ from the contents on disk", ->
delay = buffer.stoppedChangingDelay
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
buffer.on 'contents-modified', contentsModifiedHandler
buffer.insert([0, 0], 'a')
advanceClock(delay)
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:true)
buffer.delete([[0, 0], [0, 1]], '')
advanceClock(delay)
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:false)
contentsModifiedHandler.reset()
buffer.undo()
buffer.undo()
advanceClock(delay)
expect(contentsModifiedHandler).toHaveBeenCalledWith(false)
describe ".append(text)", ->
it "adds text to the end of the buffer", ->

View File

@@ -73,7 +73,7 @@ class BufferChangeOperation
event = { oldRange, newRange, oldText, newText }
@updateMarkers(event)
@buffer.trigger 'changed', event
@buffer.scheduleModifiedStatusChangedEvent()
@buffer.scheduleModifiedEvents()
@resumeMarkerObservation()
@buffer.trigger 'markers-updated'

View File

@@ -70,7 +70,6 @@ class Buffer
@file.on "removed", =>
@updateCachedDiskContents()
@trigger "modified-status-changed", @isModified()
@trigger "contents-modified", {differsFromDisk: true}
@file.on "moved", =>
@trigger "path-changed", this
@@ -427,15 +426,15 @@ class Buffer
return unless path
git?.checkoutHead(path)
scheduleModifiedStatusChangedEvent: ->
scheduleModifiedEvents: ->
clearTimeout(@stoppedChangingTimeout) if @stoppedChangingTimeout
stoppedChangingCallback = =>
@stoppedChangingTimeout = null
modifiedStatus = @isModified()
@trigger 'contents-modified', modifiedStatus
unless modifiedStatus is @previousModifiedStatus
@previousModifiedStatus = modifiedStatus
@trigger 'modified-status-changed', modifiedStatus
@trigger 'contents-modified', {differsFromDisk: @isModified()}
@stoppedChangingTimeout = setTimeout(stoppedChangingCallback, @stoppedChangingDelay)
fileExists: ->

View File

@@ -47,7 +47,7 @@ class StatusBarView extends View
subscribeToBuffer: ->
@buffer?.off '.status-bar'
@buffer = @editor.getBuffer()
@buffer.on 'contents-modified.status-bar', (e) => @updateBufferHasModifiedText(e.differsFromDisk)
@buffer.on 'modified-status-changed.status-bar', (isModified) => @updateBufferHasModifiedText(isModified)
@buffer.on 'saved.status-bar', => @updateStatusBar()
@updateStatusBar()
@@ -60,8 +60,8 @@ class StatusBarView extends View
updateGrammarText: ->
@grammarName.text(@editor.getGrammar().name)
updateBufferHasModifiedText: (differsFromDisk)->
if differsFromDisk
updateBufferHasModifiedText: (isModified)->
if isModified
@bufferModified.text('*') unless @isModified
@isModified = true
else