From 6ad21307cce6ca86d9b1705a0e985f971f5801cc Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 27 Nov 2015 16:27:01 +0100 Subject: [PATCH] Provide blockDecorationsHeight for each line number --- spec/text-editor-presenter-spec.coffee | 65 ++++++++++++++++++++++++++ src/text-editor-presenter.coffee | 3 +- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 615019ee4..8f7622f15 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -2563,6 +2563,71 @@ describe "TextEditorPresenter", -> expectValues lineNumberStateForScreenRow(presenter, 6), {screenRow: 6, bufferRow: 5, softWrapped: false} expectValues lineNumberStateForScreenRow(presenter, 7), {screenRow: 7, bufferRow: 6, softWrapped: false} + describe ".blockDecorations", -> + it "adds block decorations' height to the relevant line number state objects, both initially and when decorations change", -> + blockDecoration1 = editor.addBlockDecorationForScreenRow(0) + presenter = buildPresenter() + blockDecoration2 = editor.addBlockDecorationForScreenRow(3) + blockDecoration3 = editor.addBlockDecorationForScreenRow(3) + blockDecoration4 = editor.addBlockDecorationForScreenRow(7) + + presenter.setBlockDecorationDimensions(blockDecoration1, 0, 10) + presenter.setBlockDecorationDimensions(blockDecoration2, 0, 20) + presenter.setBlockDecorationDimensions(blockDecoration3, 0, 30) + presenter.setBlockDecorationDimensions(blockDecoration4, 0, 40) + + waitsForStateToUpdate presenter + runs -> + expect(lineNumberStateForScreenRow(presenter, 0).blockDecorationsHeight).toBe(10) + expect(lineNumberStateForScreenRow(presenter, 1).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 2).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 3).blockDecorationsHeight).toBe(20 + 30) + expect(lineNumberStateForScreenRow(presenter, 4).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 5).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 6).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 7).blockDecorationsHeight).toBe(40) + expect(lineNumberStateForScreenRow(presenter, 8).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 9).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 10).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 11).blockDecorationsHeight).toBe(0) + + waitsForStateToUpdate presenter, -> + blockDecoration1.getMarker().setHeadBufferPosition([1, 0]) + blockDecoration2.getMarker().setHeadBufferPosition([5, 0]) + blockDecoration3.getMarker().setHeadBufferPosition([9, 0]) + + runs -> + expect(lineNumberStateForScreenRow(presenter, 0).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 1).blockDecorationsHeight).toBe(10) + expect(lineNumberStateForScreenRow(presenter, 2).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 3).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 4).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 5).blockDecorationsHeight).toBe(20) + expect(lineNumberStateForScreenRow(presenter, 6).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 7).blockDecorationsHeight).toBe(40) + expect(lineNumberStateForScreenRow(presenter, 8).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 9).blockDecorationsHeight).toBe(30) + expect(lineNumberStateForScreenRow(presenter, 10).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 11).blockDecorationsHeight).toBe(0) + + waitsForStateToUpdate presenter, -> + blockDecoration1.destroy() + blockDecoration3.destroy() + + runs -> + expect(lineNumberStateForScreenRow(presenter, 0).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 1).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 2).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 3).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 4).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 5).blockDecorationsHeight).toBe(20) + expect(lineNumberStateForScreenRow(presenter, 6).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 7).blockDecorationsHeight).toBe(40) + expect(lineNumberStateForScreenRow(presenter, 8).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 9).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 10).blockDecorationsHeight).toBe(0) + expect(lineNumberStateForScreenRow(presenter, 11).blockDecorationsHeight).toBe(0) + describe ".decorationClasses", -> it "adds decoration classes to the relevant line number state objects, both initially and when decorations change", -> marker1 = editor.addMarkerLayer(maintainHistory: true).markBufferRange([[4, 0], [6, 2]], invalidate: 'touch') diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 2cf5b0d2a..d078594a3 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -693,8 +693,9 @@ class TextEditorPresenter line = @model.tokenizedLineForScreenRow(screenRow) decorationClasses = @lineNumberDecorationClassesForRow(screenRow) foldable = @model.isFoldableAtScreenRow(screenRow) + blockDecorationsHeight = @getScreenRowHeight(screenRow) - @lineHeight - tileState.lineNumbers[line.id] = {screenRow, bufferRow, softWrapped, decorationClasses, foldable} + tileState.lineNumbers[line.id] = {screenRow, bufferRow, softWrapped, decorationClasses, foldable, blockDecorationsHeight} visibleLineNumberIds[line.id] = true for id of tileState.lineNumbers