From c0bed9ab50ebaa704009931cbcbc56c71a2942da Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 May 2016 10:49:59 +0200 Subject: [PATCH 1/2] :bug: Enforce block decorations to be 'before' by default --- spec/text-editor-presenter-spec.coffee | 15 +++++++++++++++ src/text-editor-presenter.coffee | 8 ++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index c770c74c1..70c5cd0e0 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1370,6 +1370,13 @@ describe "TextEditorPresenter", -> expect(lineStateForScreenRow(presenter, 12).precedingBlockDecorations).toEqual([]) expect(lineStateForScreenRow(presenter, 12).followingBlockDecorations).toEqual([]) + it "inserts block decorations before the line if not specified otherwise", -> + blockDecoration = editor.decorateMarker(editor.markScreenPosition([4, 0]), {type: "block"}) + presenter = buildPresenter() + + expect(lineStateForScreenRow(presenter, 4).precedingBlockDecorations).toEqual [blockDecoration] + expect(lineStateForScreenRow(presenter, 4).followingBlockDecorations).toEqual [] + describe ".decorationClasses", -> it "adds decoration classes to the relevant line state objects, both initially and when decorations change", -> marker1 = editor.addMarkerLayer(maintainHistory: true).markBufferRange([[4, 0], [6, 2]], invalidate: 'touch') @@ -1604,6 +1611,14 @@ describe "TextEditorPresenter", -> runs -> expect(stateForCursor(presenter, 0)).toEqual {top: 0, left: 0, width: 10, height: 10} + it "considers block decorations to be before a line by default", -> + editor.setCursorScreenPosition([4, 0]) + blockDecoration = editor.decorateMarker(editor.markScreenPosition([4, 0]), {type: "block"}) + presenter = buildPresenter() + presenter.setBlockDecorationDimensions(blockDecoration, 0, 6) + + expect(stateForCursor(presenter, 0)).toEqual {top: 4 * 10 + 6, left: 0, width: 10, height: 10} + it "updates when ::scrollTop changes", -> editor.setSelectedBufferRanges([ [[1, 2], [1, 2]], diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 14ed2bdc9..5ce25f81a 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1083,12 +1083,12 @@ class TextEditorPresenter return if @blockDecorationsToRenderById[decoration.getId()] screenRow = decoration.getMarker().getHeadScreenPosition().row - if decoration.getProperties().position is "before" - @precedingBlockDecorationsByScreenRow[screenRow] ?= [] - @precedingBlockDecorationsByScreenRow[screenRow].push(decoration) - else + if decoration.getProperties().position is "after" @followingBlockDecorationsByScreenRow[screenRow] ?= [] @followingBlockDecorationsByScreenRow[screenRow].push(decoration) + else + @precedingBlockDecorationsByScreenRow[screenRow] ?= [] + @precedingBlockDecorationsByScreenRow[screenRow].push(decoration) @state.content.blockDecorations[decoration.getId()] = {decoration, screenRow, isVisible} @blockDecorationsToRenderById[decoration.getId()] = true From 209e9d8d9ca75171971f6197e1507aa1e98d8f2e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 24 May 2016 10:54:01 +0200 Subject: [PATCH 2/2] Add coverage for position: 'after' in cursor's state specs --- spec/text-editor-presenter-spec.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 70c5cd0e0..e658140a5 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1589,15 +1589,15 @@ describe "TextEditorPresenter", -> expect(stateForCursor(presenter, 4)).toEqual {top: 8 * 10, left: 4 * 10, width: 10, height: 10} blockDecoration1 = addBlockDecorationBeforeScreenRow(0) - blockDecoration2 = addBlockDecorationBeforeScreenRow(1) + blockDecoration2 = addBlockDecorationAfterScreenRow(1) waitsForStateToUpdate presenter, -> presenter.setBlockDecorationDimensions(blockDecoration1, 0, 30) presenter.setBlockDecorationDimensions(blockDecoration2, 0, 10) runs -> - expect(stateForCursor(presenter, 0)).toEqual {top: 50, left: 2 * 10, width: 10, height: 10} - expect(stateForCursor(presenter, 1)).toEqual {top: 60, left: 4 * 10, width: 10, height: 10} + expect(stateForCursor(presenter, 0)).toEqual {top: 1 * 10 + 30, left: 2 * 10, width: 10, height: 10} + expect(stateForCursor(presenter, 1)).toEqual {top: 2 * 10 + 30 + 10, left: 4 * 10, width: 10, height: 10} expect(stateForCursor(presenter, 2)).toBeUndefined() expect(stateForCursor(presenter, 3)).toBeUndefined() expect(stateForCursor(presenter, 4)).toBeUndefined()