Simplify marker events

Instead of marker-added and marker-removed events which are emitted
when markers are created/invalidated/revalidated/destroyed, we now
just have marker-created events that are triggered *only* when markers
are created for the first time. The marker itself emits a 'destroyed'
event when it is destroyed. The marker already notifies observers when
its validation status changes, so that's covered.
This commit is contained in:
Nathan Sobo
2013-04-29 19:06:14 -06:00
parent b2d34d93ab
commit 4ca00f7347
6 changed files with 24 additions and 45 deletions

View File

@@ -525,6 +525,16 @@ describe "DisplayBuffer", ->
expect(marker1.getBufferRange()).toEqual [[8, 4], [8, 10]]
expect(marker2.getScreenRange()).toEqual [[5, 4], [5, 10]]
it "emits a 'marker-created' event on the DisplayBuffer whenever a marker is created", ->
displayBuffer.on 'marker-created', markerCreatedHandler = jasmine.createSpy("markerCreatedHandler")
marker1 = displayBuffer.markScreenRange([[5, 4], [5, 10]])
expect(markerCreatedHandler).toHaveBeenCalledWith(marker1)
markerCreatedHandler.reset()
marker2 = buffer.markRange([[5, 4], [5, 10]])
expect(markerCreatedHandler).toHaveBeenCalledWith(displayBuffer.getMarker(marker2.id))
it "allows marker head and tail positions to be manipulated in both screen and buffer coordinates", ->
marker = displayBuffer.markScreenRange([[5, 4], [5, 10]])
marker.setHeadScreenPosition([5, 4])
@@ -737,22 +747,3 @@ describe "DisplayBuffer", ->
marker.destroy()
expect(marker.isValid()).toBeFalsy()
expect(displayBuffer.getMarker(marker.id)).toBeUndefined()
describe "marker-added and marker-removed events", ->
it "emits the appropriate event when a marker is created, destroyed, or its validity changes", ->
displayBuffer.on 'marker-added', markerAddedHandler = jasmine.createSpy("markerAddedHandler")
displayBuffer.on 'marker-removed', markerRemovedHandler = jasmine.createSpy("markerRemovedHandler")
marker = displayBuffer.markBufferRange([[5, 4], [5, 10]])
expect(markerAddedHandler).toHaveBeenCalledWith(marker)
markerAddedHandler.reset()
buffer.change([[5, 3], [5, 11]], 'hey')
expect(markerRemovedHandler).toHaveBeenCalledWith(marker)
markerRemovedHandler.reset()
buffer.undo()
expect(markerAddedHandler).toHaveBeenCalledWith(marker)
marker.destroy()
expect(markerRemovedHandler).toHaveBeenCalledWith(marker)

View File

@@ -781,11 +781,10 @@ describe 'Buffer', ->
expect(buffer.positionForCharacterIndex(20)).toEqual [3, 0]
describe "markers", ->
[markerAddedHandler, markerRemovedHandler] = []
markerCreatedHandler = null
beforeEach ->
buffer.on('marker-added', markerAddedHandler = jasmine.createSpy("markerAddedHandler"))
buffer.on('marker-removed', markerRemovedHandler = jasmine.createSpy("markerRemovedHandler"))
buffer.on('marker-created', markerCreatedHandler = jasmine.createSpy("markerCreatedHandler"))
describe "marker creation", ->
it "allows markers to be created with ranges and positions", ->
@@ -806,9 +805,9 @@ describe 'Buffer', ->
expect(marker.getHeadPosition()).toEqual [4, 20]
expect(marker.getTailPosition()).toEqual [4, 23]
it "emits the 'marker-added' event when markers are created", ->
it "emits the 'marker-created' event when markers are created", ->
marker = buffer.markRange([[4, 20], [4, 23]])
expect(markerAddedHandler).toHaveBeenCalledWith(marker)
expect(markerCreatedHandler).toHaveBeenCalledWith(marker)
describe "marker manipulation", ->
marker = null
@@ -1005,9 +1004,10 @@ describe 'Buffer', ->
buffer.undo()
expect(buffer.getMarker(marker2.id)).toBeUndefined()
it "emits 'marker-removed' when markers are destroyed", ->
it "emits 'destroyed' on the marker when it is destroyed", ->
marker.on 'destroyed', destroyedHandler = jasmine.createSpy("destroyedHandler")
marker.destroy()
expect(markerRemovedHandler).toHaveBeenCalledWith(marker)
expect(destroyedHandler).toHaveBeenCalled()
describe "marker updates due to buffer changes", ->
[marker1, marker2, marker3] = []
@@ -1185,17 +1185,6 @@ describe 'Buffer', ->
expect(marker4.isValid()).toBeTruthy()
expect(marker4.getRange()).toEqual [[4, 20], [4, 23]]
it "emits 'marker-added' and 'marker-removed' events when markers are invalidated or revalidated", ->
marker2.destroy()
marker3.destroy()
markerRemovedHandler.reset()
buffer.change([[4, 21], [4, 24]], "foo")
expect(markerRemovedHandler).toHaveBeenCalledWith(marker1)
buffer.undo()
expect(markerAddedHandler).toHaveBeenCalledWith(marker1)
describe ".markersForPosition(position)", ->
it "returns all markers that intersect the given position", ->
m1 = buffer.markRange([[3, 4], [3, 10]])

View File

@@ -165,6 +165,7 @@ class BufferMarker
# Destroys the marker
destroy: ->
@buffer.destroyMarker(@id)
@trigger 'destroyed'
# Returns a {Boolean} indicating whether the marker is valid. Markers can be
# invalidated when a region surrounding them in the buffer is changed.

View File

@@ -15,6 +15,7 @@ class DisplayBufferMarker
constructor: ({@bufferMarker, @displayBuffer}) ->
@id = @bufferMarker.id
@bufferMarker.on 'destroyed', => @destroyed()
###
# Public #
@@ -155,6 +156,9 @@ class DisplayBufferMarker
# Internal #
###
destroyed: ->
delete @displayBuffer.markers[@id]
observeBufferMarkerIfNeeded: ->
return if @subscriptionCount()
@getHeadScreenPosition() # memoize current value

View File

@@ -33,12 +33,7 @@ class DisplayBuffer
@tokenizedBuffer.on 'grammar-changed', (grammar) => @trigger 'grammar-changed', grammar
@tokenizedBuffer.on 'changed', @handleTokenizedBufferChange
@buffer.on 'markers-updated', @handleMarkersUpdated
@buffer.on 'marker-added', (marker) =>
@trigger 'marker-added', @getMarker(marker.id)
@buffer.on 'marker-removed', (marker) =>
marker = @getMarker(marker.id)
delete @markers[marker.id]
@trigger 'marker-removed', marker
@buffer.on 'marker-created', (marker) => @trigger 'marker-created', @getMarker(marker.id)
buildLineMap: ->
@lineMap = new LineMap

View File

@@ -476,7 +476,7 @@ class Buffer
attributes
}, options))
@validMarkers[marker.id] = marker
@trigger 'marker-added', marker
@trigger 'marker-created', marker
marker
# Public: Constructs a new marker at a given position.
@@ -650,7 +650,6 @@ class Buffer
if marker = @validMarkers[id] ? @invalidMarkers[id]
delete @validMarkers[id]
delete @invalidMarkers[id]
@trigger 'marker-removed', marker
scheduleModifiedEvents: ->
clearTimeout(@stoppedChangingTimeout) if @stoppedChangingTimeout