From a9cb1bda8d217ee5f4ea614487d8323a0fbd4cf9 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 27 Nov 2015 10:16:38 +0100 Subject: [PATCH] Use `::positionForRow` in `::updateTilesState` The algorithm is still super sloooow :snail:, but we'll fix that in a later commit. --- spec/text-editor-presenter-spec.coffee | 31 ++++++++++++++++++++++++++ src/text-editor-presenter.coffee | 12 +++++----- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 010a9fc2d..9edd8e9f8 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -168,6 +168,37 @@ describe "TextEditorPresenter", -> expect(stateFn(presenter).tiles[12]).toBeUndefined() + it "computes each tile's height and scrollTop based on block decorations' height", -> + presenter = buildPresenter(explicitHeight: 120, scrollTop: 0, lineHeight: 10, tileSize: 2) + + blockDecoration1 = editor.addBlockDecorationForScreenRow(3) + blockDecoration2 = editor.addBlockDecorationForScreenRow(5) + presenter.setBlockDecorationDimensions(blockDecoration1, 0, 30) + presenter.setBlockDecorationDimensions(blockDecoration2, 0, 40) + + expect(stateFn(presenter).tiles[0].height).toBe(20) + expect(stateFn(presenter).tiles[0].top).toBe(0) + expect(stateFn(presenter).tiles[2].height).toBe(20 + 30) + expect(stateFn(presenter).tiles[2].top).toBe(20) + expect(stateFn(presenter).tiles[4].height).toBe(20 + 40) + expect(stateFn(presenter).tiles[4].top).toBe(20 + 30 + 20) + expect(stateFn(presenter).tiles[6].height).toBe(20) + expect(stateFn(presenter).tiles[6].top).toBe((20 + 40) + (20 + 30) + 20) + expect(stateFn(presenter).tiles[8]).toBeUndefined() + + presenter.setScrollTop(20) + + expect(stateFn(presenter).tiles[0]).toBeUndefined() + expect(stateFn(presenter).tiles[2].height).toBe(20 + 30) + expect(stateFn(presenter).tiles[2].top).toBe(0) + expect(stateFn(presenter).tiles[4].height).toBe(20 + 40) + expect(stateFn(presenter).tiles[4].top).toBe(30 + 20) + expect(stateFn(presenter).tiles[6].height).toBe(20) + expect(stateFn(presenter).tiles[6].top).toBe((20 + 40) + (20 + 30)) + expect(stateFn(presenter).tiles[8].height).toBe(20) + expect(stateFn(presenter).tiles[8].top).toBe((20 + 40) + (20 + 30) + 20) + expect(stateFn(presenter).tiles[10]).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 ab9def07e..5cec15278 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -429,14 +429,14 @@ class TextEditorPresenter tile = @state.content.tiles[tileStartRow] ?= {} tile.top = @positionForRow(tileStartRow) - @scrollTop tile.left = -@scrollLeft - tile.height = @tileSize * @lineHeight + tile.height = @positionForRow(tileStartRow + @tileSize) - @positionForRow(tileStartRow) tile.display = "block" tile.zIndex = zIndex tile.highlights ?= {} gutterTile = @lineNumberGutter.tiles[tileStartRow] ?= {} - gutterTile.top = tileStartRow * @lineHeight - @scrollTop - gutterTile.height = @tileSize * @lineHeight + gutterTile.top = @positionForRow(tileStartRow) - @scrollTop + gutterTile.height = @positionForRow(tileStartRow + @tileSize) - @positionForRow(tileStartRow) gutterTile.display = "block" gutterTile.zIndex = zIndex @@ -697,7 +697,8 @@ class TextEditorPresenter top = 0 for tileRow in [0..@model.getScreenLineCount()] by @tileSize for row in [tileRow...Math.min(tileRow + @tileSize, @model.getScreenLineCount())] by 1 - nextTop = top + @lineHeight + blockDecorationsForCurrentRow = _.values(@blockDecorationsDimensionsByScreenRow[row]) + nextTop = top + @lineHeight + @getBlockDecorationsHeight(blockDecorationsForCurrentRow) if floor return row if nextTop > position else @@ -710,7 +711,8 @@ class TextEditorPresenter for tileRow in [0..@model.getScreenLineCount()] by @tileSize for row in [tileRow...Math.min(tileRow + @tileSize, @model.getScreenLineCount())] by 1 return top if row is targetRow - top += @lineHeight + blockDecorationsForNextRow = _.values(@blockDecorationsDimensionsByScreenRow[row + 1]) + top += @lineHeight + @getBlockDecorationsHeight(blockDecorationsForNextRow) top updateStartRow: ->