mirror of
https://github.com/atom/atom.git
synced 2026-04-06 03:02:13 -04:00
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:
committed by
probablycorey
parent
a1dc2cfc2d
commit
298a963148
@@ -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", ->
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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: ->
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user