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 -> beforeEach ->
marker = displayBuffer.markScreenRange([[5, 4], [5, 10]]) 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", -> it "triggers the 'changed' event whenever the markers head's screen position changes in the buffer or on screen", ->
marker.setHeadScreenPosition([8, 20]) 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", -> 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 = 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() displayBuffer.on 'changed', changeHandler = jasmine.createSpy("changeHandler").andCallFake -> onDisplayBufferChange()
# New change ---- # New change ----
@ -886,7 +886,7 @@ describe "DisplayBuffer", ->
marker2ChangedHandler.reset() marker2ChangedHandler.reset()
marker3 = displayBuffer.markBufferRange([[8, 1], [8, 2]]) marker3 = displayBuffer.markBufferRange([[8, 1], [8, 2]])
marker3.on 'changed', marker3ChangedHandler = jasmine.createSpy("marker3ChangedHandler") marker3.onDidChange marker3ChangedHandler = jasmine.createSpy("marker3ChangedHandler")
onDisplayBufferChange = -> onDisplayBufferChange = ->
# calls change handler first # calls change handler first

View File

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

View File

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

View File

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