diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 52d2e2bc0..f28dade69 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1273,8 +1273,8 @@ describe "TextEditorPresenter", -> expect(lineStateForScreenRow(presenter, 0).endOfLineInvisibles).toEqual [atom.config.get('editor.invisibles.eol')] expect(lineStateForScreenRow(presenter, 1).endOfLineInvisibles).toEqual [atom.config.get('editor.invisibles.cr'), atom.config.get('editor.invisibles.eol')] - describe ".hasBlockDecorations", -> - it "is true when block decorations are present before a line, both initially and when decorations change", -> + describe ".blockDecorations", -> + it "contains all block decorations that are present before a line, both initially and when decorations change", -> blockDecoration1 = editor.addBlockDecorationForScreenRow(0) presenter = buildPresenter() blockDecoration2 = editor.addBlockDecorationForScreenRow(3) @@ -1282,58 +1282,58 @@ describe "TextEditorPresenter", -> waitsForStateToUpdate presenter runs -> - expect(lineStateForScreenRow(presenter, 0).hasBlockDecorations).toBe(true) - expect(lineStateForScreenRow(presenter, 1).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 2).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 3).hasBlockDecorations).toBe(true) - expect(lineStateForScreenRow(presenter, 4).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 5).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 6).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 7).hasBlockDecorations).toBe(true) - expect(lineStateForScreenRow(presenter, 8).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 9).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 10).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 11).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 12).hasBlockDecorations).toBe(false) + expect(lineStateForScreenRow(presenter, 0).blockDecorations).toEqual([blockDecoration1]) + expect(lineStateForScreenRow(presenter, 1).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 2).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 3).blockDecorations).toEqual([blockDecoration2]) + expect(lineStateForScreenRow(presenter, 4).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 5).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 6).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 7).blockDecorations).toEqual([blockDecoration3]) + expect(lineStateForScreenRow(presenter, 8).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 9).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 10).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 11).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 12).blockDecorations).toEqual([]) waitsForStateToUpdate presenter, -> blockDecoration1.getMarker().setHeadBufferPosition([1, 0]) - blockDecoration2.getMarker().setHeadBufferPosition([5, 0]) + blockDecoration2.getMarker().setHeadBufferPosition([9, 0]) blockDecoration3.getMarker().setHeadBufferPosition([9, 0]) runs -> - expect(lineStateForScreenRow(presenter, 0).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 1).hasBlockDecorations).toBe(true) - expect(lineStateForScreenRow(presenter, 2).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 3).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 4).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 5).hasBlockDecorations).toBe(true) - expect(lineStateForScreenRow(presenter, 6).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 7).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 8).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 9).hasBlockDecorations).toBe(true) - expect(lineStateForScreenRow(presenter, 10).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 11).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 12).hasBlockDecorations).toBe(false) + expect(lineStateForScreenRow(presenter, 0).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 1).blockDecorations).toEqual([blockDecoration1]) + expect(lineStateForScreenRow(presenter, 2).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 3).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 4).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 5).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 6).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 7).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 8).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 9).blockDecorations).toEqual([blockDecoration3, blockDecoration2]) + expect(lineStateForScreenRow(presenter, 10).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 11).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 12).blockDecorations).toEqual([]) waitsForStateToUpdate presenter, -> blockDecoration1.destroy() blockDecoration3.destroy() runs -> - expect(lineStateForScreenRow(presenter, 0).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 1).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 2).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 3).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 4).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 5).hasBlockDecorations).toBe(true) - expect(lineStateForScreenRow(presenter, 6).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 7).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 8).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 9).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 10).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 11).hasBlockDecorations).toBe(false) - expect(lineStateForScreenRow(presenter, 12).hasBlockDecorations).toBe(false) + expect(lineStateForScreenRow(presenter, 0).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 1).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 2).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 3).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 4).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 5).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 6).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 7).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 8).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 9).blockDecorations).toEqual([blockDecoration2]) + expect(lineStateForScreenRow(presenter, 10).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 11).blockDecorations).toEqual([]) + expect(lineStateForScreenRow(presenter, 12).blockDecorations).toEqual([]) describe ".decorationClasses", -> it "adds decoration classes to the relevant line state objects, both initially and when decorations change", -> diff --git a/src/block-decorations-component.coffee b/src/block-decorations-component.coffee index 50ac52fc7..2a8574ef6 100644 --- a/src/block-decorations-component.coffee +++ b/src/block-decorations-component.coffee @@ -47,7 +47,7 @@ class BlockDecorationsComponent createAndAppendBlockDecorationNode: (id) -> blockDecorationState = @newState.blockDecorations[id] blockDecorationNode = @views.getView(blockDecorationState.decoration.getProperties().item) - blockDecorationNode.classList.add("block-decoration-row-#{blockDecorationState.screenRow}") + blockDecorationNode.id = "atom--block-decoration-#{id}" unless blockDecorationState.isVisible blockDecorationNode.classList.add("atom--invisible-block-decoration") @@ -57,14 +57,9 @@ class BlockDecorationsComponent updateBlockDecorationNode: (id) -> newBlockDecorationState = @newState.blockDecorations[id] - oldBlockDecorationState = @oldState.blockDecorations[id] blockDecorationNode = @blockDecorationNodesById[id] if newBlockDecorationState.isVisible blockDecorationNode.classList.remove("atom--invisible-block-decoration") else blockDecorationNode.classList.add("atom--invisible-block-decoration") - - if newBlockDecorationState.screenRow isnt oldBlockDecorationState.screenRow - blockDecorationNode.classList.remove("block-decoration-row-#{oldBlockDecorationState.screenRow}") - blockDecorationNode.classList.add("block-decoration-row-#{newBlockDecorationState.screenRow}") diff --git a/src/lines-tile-component.coffee b/src/lines-tile-component.coffee index f4b0dbab5..f447c3352 100644 --- a/src/lines-tile-component.coffee +++ b/src/lines-tile-component.coffee @@ -138,11 +138,11 @@ class LinesTileComponent @updateBlockDecorationInsertionPoint(id) updateBlockDecorationInsertionPoint: (id) -> - {screenRow} = @newTileState.lines[id] - + {blockDecorations, screenRow} = @newTileState.lines[id] + elementsIds = blockDecorations.map((d) -> "#atom--block-decoration-#{d.id}").join(',') if insertionPoint = @insertionPointsByLineId[id] insertionPoint.dataset.screenRow = screenRow - insertionPoint.setAttribute("select", ".block-decoration-row-#{screenRow}") + insertionPoint.setAttribute("select", elementsIds) findNodeNextTo: (node) -> for nextNode, index in @domNode.children diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index b2bc16ca9..637a3a011 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -499,7 +499,8 @@ class TextEditorPresenter lineState = tileState.lines[line.id] lineState.screenRow = screenRow lineState.decorationClasses = @lineDecorationClassesForRow(screenRow) - lineState.hasBlockDecorations = blockDecorations.length isnt 0 + lineState.blockDecorations = blockDecorations + lineState.hasBlockDecorations = blockDecorations.length > 0 else tileState.lines[line.id] = screenRow: screenRow @@ -516,7 +517,8 @@ class TextEditorPresenter tabLength: line.tabLength fold: line.fold decorationClasses: @lineDecorationClassesForRow(screenRow) - hasBlockDecorations: blockDecorations.length isnt 0 + blockDecorations: blockDecorations + hasBlockDecorations: blockDecorations.length > 0 for id, line of tileState.lines delete tileState.lines[id] unless visibleLineIds.hasOwnProperty(id)