From 5ee3dbe7e0e71392a4057ce4807339765efd9ede Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 11 Nov 2016 12:03:38 -0800 Subject: [PATCH 1/2] Avoid redundant DisplayLayer resets in TextEditor.update --- src/text-editor.coffee | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 9cc7c83a4..497dd3c20 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -222,6 +222,7 @@ class TextEditor extends Model @backgroundWorkHandle = null update: (params) -> + currentSoftWrapColumn = @getSoftWrapColumn() displayLayerParams = {} for param in Object.keys(params) @@ -272,12 +273,16 @@ class TextEditor extends Model when 'softWrapAtPreferredLineLength' if value isnt @softWrapAtPreferredLineLength @softWrapAtPreferredLineLength = value - displayLayerParams.softWrapColumn = @getSoftWrapColumn() if @isSoftWrapped() + softWrapColumn = @getSoftWrapColumn() + if softWrapColumn isnt currentSoftWrapColumn + displayLayerParams.softWrapColumn = softWrapColumn when 'preferredLineLength' if value isnt @preferredLineLength @preferredLineLength = value - displayLayerParams.softWrapColumn = @getSoftWrapColumn() if @isSoftWrapped() + softWrapColumn = @getSoftWrapColumn() + if softWrapColumn isnt currentSoftWrapColumn + displayLayerParams.softWrapColumn = softWrapColumn when 'mini' if value isnt @mini @@ -322,12 +327,16 @@ class TextEditor extends Model when 'editorWidthInChars' if value > 0 and value isnt @editorWidthInChars @editorWidthInChars = value - displayLayerParams.softWrapColumn = @getSoftWrapColumn() if @isSoftWrapped() + softWrapColumn = @getSoftWrapColumn() + if softWrapColumn isnt currentSoftWrapColumn + displayLayerParams.softWrapColumn = softWrapColumn when 'width' if value isnt @width @width = value - displayLayerParams.softWrapColumn = @getSoftWrapColumn() if @isSoftWrapped() + softWrapColumn = @getSoftWrapColumn() + if softWrapColumn isnt currentSoftWrapColumn + displayLayerParams.softWrapColumn = softWrapColumn when 'scrollPastEnd' if value isnt @scrollPastEnd From 5509475173871733338d6689ec283bf1233a555c Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 11 Nov 2016 12:55:57 -0800 Subject: [PATCH 2/2] Ensure presenter forces DisplayLayer computations when rendering Signed-off-by: Nathan Sobo --- spec/text-editor-presenter-spec.coffee | 17 ----------------- src/text-editor-presenter.coffee | 21 ++++++++------------- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 8af2f9abd..9eb4a15d2 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -165,23 +165,6 @@ describe "TextEditorPresenter", -> expect(stateFn(presenter).tiles[10]).toBeUndefined() expect(stateFn(presenter).tiles[12]).toBeUndefined() - 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() - - presenter.setScreenRowsToMeasure([12]) - buffer.deleteRows(12, 13) - - expect(stateFn(presenter).tiles[12]).toBeUndefined() - describe "when there are block decorations", -> it "computes each tile's height and scrollTop based on block decorations' height", -> presenter = buildPresenter(explicitHeight: 120, scrollTop: 0, lineHeight: 10, tileSize: 2) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 22268af18..cc988bbea 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -306,9 +306,6 @@ class TextEditorPresenter getEndTileRow: -> @tileForRow(@endRow ? 0) - isValidScreenRow: (screenRow) -> - screenRow >= 0 and screenRow < @model.getApproximateScreenLineCount() - getScreenRowsToRender: -> startRow = @getStartTileRow() endRow = @getEndTileRow() + @tileSize @@ -320,7 +317,7 @@ class TextEditorPresenter if @screenRowsToMeasure? screenRows.push(@screenRowsToMeasure...) - screenRows = screenRows.filter @isValidScreenRow.bind(this) + screenRows = screenRows.filter (row) -> row >= 0 screenRows.sort (a, b) -> a - b _.uniq(screenRows, true) @@ -395,19 +392,17 @@ class TextEditorPresenter visibleTiles[tileStartRow] = true zIndex++ - if @mouseWheelScreenRow? and 0 <= @mouseWheelScreenRow < @model.getApproximateScreenLineCount() - mouseWheelTile = @tileForRow(@mouseWheelScreenRow) - - unless visibleTiles[mouseWheelTile]? - @lineNumberGutter.tiles[mouseWheelTile].display = "none" - @state.content.tiles[mouseWheelTile].display = "none" - visibleTiles[mouseWheelTile] = true + mouseWheelTileId = @tileForRow(@mouseWheelScreenRow) if @mouseWheelScreenRow? for id, tile of @state.content.tiles continue if visibleTiles.hasOwnProperty(id) - delete @state.content.tiles[id] - delete @lineNumberGutter.tiles[id] + if Number(id) is mouseWheelTileId + @state.content.tiles[id].display = "none" + @lineNumberGutter.tiles[id].display = "none" + else + delete @state.content.tiles[id] + delete @lineNumberGutter.tiles[id] updateLinesState: (tileState, screenRows) -> tileState.lines ?= {}