Add DisplayBufferMarker::onDidChange and ::onDidDestroy

This commit is contained in:
Nathan Sobo 2014-09-04 12:07:40 -06:00 committed by Ben Ogle
parent 651eb78315
commit 1131b33a83
4 changed files with 23 additions and 10 deletions

View File

@ -722,7 +722,7 @@ describe "DisplayBuffer", ->
beforeEach ->
marker = displayBuffer.markScreenRange([[5, 4], [5, 10]])
marker.on 'changed', markerChangedHandler = jasmine.createSpy("markerChangedHandler")
marker.onDidChange markerChangedHandler = jasmine.createSpy("markerChangedHandler")
it "triggers the 'changed' event whenever the markers head's screen position changes in the buffer or on screen", ->
marker.setHeadScreenPosition([8, 20])
@ -859,7 +859,7 @@ describe "DisplayBuffer", ->
it "updates markers before emitting buffer change events, but does not notify their observers until the change event", ->
marker2 = displayBuffer.markBufferRange([[8, 1], [8, 1]])
marker2.on 'changed', marker2ChangedHandler = jasmine.createSpy("marker2ChangedHandler")
marker2.onDidChange marker2ChangedHandler = jasmine.createSpy("marker2ChangedHandler")
displayBuffer.on 'changed', changeHandler = jasmine.createSpy("changeHandler").andCallFake -> onDisplayBufferChange()
# New change ----
@ -886,7 +886,7 @@ describe "DisplayBuffer", ->
marker2ChangedHandler.reset()
marker3 = displayBuffer.markBufferRange([[8, 1], [8, 2]])
marker3.on 'changed', marker3ChangedHandler = jasmine.createSpy("marker3ChangedHandler")
marker3.onDidChange marker3ChangedHandler = jasmine.createSpy("marker3ChangedHandler")
onDisplayBufferChange = ->
# calls change handler first

View File

@ -44,7 +44,7 @@ class Cursor extends Model
constructor: ({@editor, @marker, id}) ->
@assignId(id)
@updateVisibility()
@marker.on 'changed', (e) =>
@marker.onDidChange (e) =>
@updateVisibility()
{oldHeadScreenPosition, newHeadScreenPosition} = e
{oldHeadBufferPosition, newHeadBufferPosition} = e
@ -66,7 +66,7 @@ class Cursor extends Model
@emit 'moved', movedEvent
@editor.cursorMoved(this, movedEvent)
@marker.on 'destroyed', =>
@marker.onDidDestroy =>
@destroyed = true
@editor.removeCursor(this)
@emit 'destroyed'

View File

@ -1,10 +1,12 @@
{Range} = require 'text-buffer'
_ = require 'underscore-plus'
{Emitter, Subscriber} = require 'emissary'
{Subscriber} = require 'emissary'
EmitterMixin = require('emissary').Emitter
{Emitter} = require 'event-kit'
module.exports =
class DisplayBufferMarker
Emitter.includeInto(this)
EmitterMixin.includeInto(this)
Subscriber.includeInto(this)
bufferMarkerSubscription: null
@ -15,6 +17,7 @@ class DisplayBufferMarker
wasValid: true
constructor: ({@bufferMarker, @displayBuffer}) ->
@emitter = new Emitter
@id = @bufferMarker.id
@oldHeadBufferPosition = @getHeadBufferPosition()
@oldHeadScreenPosition = @getHeadScreenPosition()
@ -25,6 +28,12 @@ class DisplayBufferMarker
@subscribe @bufferMarker.onDidDestroy => @destroyed()
@subscribe @bufferMarker.onDidChange (event) => @notifyObservers(event)
onDidChange: (callback) ->
@emitter.on 'did-change', callback
onDidDestroy: (callback) ->
@emitter.on 'did-destroy', callback
copy: (attributes) ->
@displayBuffer.getMarker(@bufferMarker.copy(attributes).id)
@ -199,6 +208,8 @@ class DisplayBufferMarker
destroyed: ->
delete @displayBuffer.markers[@id]
@emit 'destroyed'
@emitter.emit 'did-destroy'
@emitter.dispose()
notifyObservers: ({textChanged}) ->
textChanged ?= false
@ -215,7 +226,7 @@ class DisplayBufferMarker
_.isEqual(newTailBufferPosition, @oldTailBufferPosition) and
_.isEqual(newTailScreenPosition, @oldTailScreenPosition)
@emit 'changed', {
changeEvent = {
@oldHeadScreenPosition, newHeadScreenPosition,
@oldTailScreenPosition, newTailScreenPosition,
@oldHeadBufferPosition, newHeadBufferPosition,
@ -223,6 +234,8 @@ class DisplayBufferMarker
textChanged,
isValid
}
@emit 'changed', changeEvent
@emitter.emit 'did-change', changeEvent
@oldHeadBufferPosition = newHeadBufferPosition
@oldHeadScreenPosition = newHeadScreenPosition

View File

@ -30,8 +30,8 @@ class Selection extends Model
@cursor.selection = this
@decoration = @editor.decorateMarker(@marker, type: 'highlight', class: 'selection')
@marker.on 'changed', => @screenRangeChanged()
@marker.on 'destroyed', =>
@marker.onDidChange => @screenRangeChanged()
@marker.onDidDestroy =>
@destroyed = true
@editor.removeSelection(this)
@emit 'destroyed' unless @editor.isDestroyed()