From 2b6973d4b1cd25e6fdf82b0c32e7fb2616b8d7dc Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 30 Sep 2015 17:44:26 +0200 Subject: [PATCH] Fix a :bug: where some invalid lines were being measured --- spec/text-editor-presenter-spec.coffee | 24 ++++++++++++++++++++++++ src/text-editor-presenter.coffee | 15 ++++----------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index edec7eff2..88b26d62d 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -102,6 +102,30 @@ describe "TextEditorPresenter", -> expect(stateFn(presenter).tiles[12]).toBeUndefined() + it "includes state for tiles containing screen rows to measure", -> + presenter = buildPresenter(explicitHeight: 6, scrollTop: 0, lineHeight: 1, tileSize: 2) + presenter.setScreenRowsToMeasure([10, 12]) + + expect(stateFn(presenter).tiles[0]).toBeDefined() + expect(stateFn(presenter).tiles[2]).toBeDefined() + expect(stateFn(presenter).tiles[4]).toBeDefined() + expect(stateFn(presenter).tiles[6]).toBeDefined() + expect(stateFn(presenter).tiles[8]).toBeUndefined() + expect(stateFn(presenter).tiles[10]).toBeDefined() + expect(stateFn(presenter).tiles[12]).toBeDefined() + + it "excludes invalid tiles for screen rows to measure", -> + presenter = buildPresenter(explicitHeight: 6, scrollTop: 0, lineHeight: 1, tileSize: 2) + presenter.setScreenRowsToMeasure([20, 30]) # unexisting rows + + expect(stateFn(presenter).tiles[0]).toBeDefined() + expect(stateFn(presenter).tiles[2]).toBeDefined() + expect(stateFn(presenter).tiles[4]).toBeDefined() + expect(stateFn(presenter).tiles[6]).toBeDefined() + expect(stateFn(presenter).tiles[8]).toBeUndefined() + expect(stateFn(presenter).tiles[10]).toBeUndefined() + expect(stateFn(presenter).tiles[12]).toBeUndefined() + it "includes state for all tiles if no external ::explicitHeight is assigned", -> presenter = buildPresenter(explicitHeight: null, tileSize: 2) expect(stateFn(presenter).tiles[0]).toBeDefined() diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 92eadb6db..3d7298bcf 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -30,6 +30,7 @@ class TextEditorPresenter @lineDecorationsByScreenRow = {} @lineNumberDecorationsByScreenRow = {} @customGutterDecorationsByGutterNameAndScreenRow = {} + @screenRowsToMeasure = [] @transferMeasurementsToModel() @transferMeasurementsFromModel() @observeModel() @@ -370,8 +371,8 @@ class TextEditorPresenter screenRows = [startRow...endRow] if longestScreenRow = @model.getLongestScreenRow() screenRows.push(longestScreenRow) - if @screenRowsToMeasure? - screenRows.push(@screenRowsToMeasure...) + for row in @screenRowsToMeasure when @constrainRow(row) is row + screenRows.push(row) screenRows.sort (a, b) -> a - b _.uniq(screenRows, true) @@ -384,14 +385,6 @@ class TextEditorPresenter @shouldUpdateLineNumbersState = true @shouldUpdateDecorations = true - clearScreenRowsToMeasure: -> - return if not screenRows? or screenRows.length is 0 - - @screenRowsToMeasure = [] - @shouldUpdateLinesState = true - @shouldUpdateLineNumbersState = true - @shouldUpdateDecorations = true - updateTilesState: -> return unless @startRow? and @endRow? and @lineHeight? @@ -403,7 +396,7 @@ class TextEditorPresenter zIndex = 0 for tileStartRow in [@tileForRow(endRow)..@tileForRow(startRow)] by -@tileSize - tileEndRow = Math.min(@model.getScreenLineCount(), tileStartRow + @tileSize) + tileEndRow = @constrainRow(tileStartRow + @tileSize) rowsWithinTile = [] while screenRowIndex >= 0