diff --git a/spec/editor-spec.coffee b/spec/editor-spec.coffee index 4ba1e82de..a2477e078 100644 --- a/spec/editor-spec.coffee +++ b/spec/editor-spec.coffee @@ -3207,7 +3207,7 @@ describe "Editor", -> expect(editor.getScrollTop()).toBe 0 fdescribe "decorations", -> - it "can add decorations", -> + it "can add and remove decorations", -> decoration = {type: 'gutter-class', class: 'one'} editor.addDecorationForBufferRow(2, decoration) editor.addDecorationForBufferRow(2, decoration) @@ -3215,3 +3215,7 @@ describe "Editor", -> decorations = editor.decorationsForBufferRow(2) expect(decorations).toHaveLength 1 expect(decorations).toContain decoration + + editor.removeDecorationForBufferRow(2, decoration) + decorations = editor.decorationsForBufferRow(2) + expect(decorations).toHaveLength 0 diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 2f924acf0..4ee37c5df 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -727,18 +727,20 @@ class DisplayBuffer extends Model for current in @decorations[bufferRow] return if _.isEqual(current, decoration) @decorations[bufferRow].push(decoration) - @emit 'decoration-changed', {bufferRow, add: decoration} + @emit 'decoration-changed', {bufferRow, decoration, action: 'add'} removeDecorationForBufferRow: (bufferRow, decoration) -> return unless @decorations[bufferRow] removed = @findDecorationsForBufferRow(bufferRow, decoration) - @decorations[bufferRow] = _.without(@decorations, removed) - @emit 'decoration-changed', {bufferRow, remove: removed} + @decorations[bufferRow] = _.without(@decorations[bufferRow], removed...) + + for decoration in removed + @emit 'decoration-changed', {bufferRow, decoration, action: 'remove'} findDecorationsForBufferRow: (bufferRow, options) -> return unless @decorations[bufferRow] - (dec for dec in @decorations[bufferRow] when _.isEqual(options, _.pick(decoration, _.keys(options)))) + (dec for dec in @decorations[bufferRow] when _.isEqual(options, _.pick(dec, _.keys(options)))) addGutterClassForMarker: (bufferRow) -> removeGutterClassForMarker: (bufferRow) -> diff --git a/src/editor.coffee b/src/editor.coffee index 8b062de8d..94701e15b 100644 --- a/src/editor.coffee +++ b/src/editor.coffee @@ -214,6 +214,7 @@ class Editor extends Model @subscribe @displayBuffer, 'grammar-changed', => @handleGrammarChange() @subscribe @displayBuffer, 'tokenized', => @handleTokenization() @subscribe @displayBuffer, 'soft-wrap-changed', (args...) => @emit 'soft-wrap-changed', args... + @subscribe @displayBuffer, "decoration-changed", (e) => @emit 'decoration-changed', e getViewClass: -> if atom.config.get('core.useReactEditor') diff --git a/src/gutter-component.coffee b/src/gutter-component.coffee index 836ebd467..54850906d 100644 --- a/src/gutter-component.coffee +++ b/src/gutter-component.coffee @@ -24,6 +24,7 @@ GutterComponent = React.createClass @lineNumberNodesById = {} @lineNumberIdsByScreenRow = {} @screenRowsByLineNumberId = {} + @decoratorUpdates = {} componentDidMount: -> @appendDummyLineNumber() @@ -141,6 +142,7 @@ GutterComponent = React.createClass classes = "line-number" classes += ' foldable' if not softWrapped and @props.editor.isFoldableAtBufferRow(bufferRow) classes += ' folded' if @props.editor.isFoldedAtBufferRow(bufferRow) + "