From e1c3d2ef571139f8bdf03ef509d91f3702d63680 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 1 Oct 2015 17:42:44 +0200 Subject: [PATCH] :racehorse: Avoid recomputing state for lines twice --- src/text-editor-presenter.coffee | 40 +++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 75fd7f9a0..e6707b7fe 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -82,8 +82,14 @@ class TextEditorPresenter @updateCommonGutterState() @updateReflowState() + if @shouldUpdateDecorations + @fetchDecorations() + @updateLineDecorations() + if @shouldUpdateLinesState or @shouldUpdateLineNumbersState @updateTilesState() + @shouldUpdateLinesState = false + @shouldUpdateLineNumbersState = false @shouldUpdateTilesState = true @updating = false @@ -105,7 +111,7 @@ class TextEditorPresenter @updateScrollbarsState() if @shouldUpdateScrollbarsState @updateHiddenInputState() if @shouldUpdateHiddenInputState @updateContentState() if @shouldUpdateContentState - @updateDecorations() if @shouldUpdateDecorations + @updateHighlightDecorations() if @shouldUpdateDecorations @updateTilesState() if @shouldUpdateTilesState @updateCursorsState() if @shouldUpdateCursorsState @updateOverlaysState() if @shouldUpdateOverlaysState @@ -1195,22 +1201,34 @@ class TextEditorPresenter @emitDidUpdateState() - updateDecorations: -> - @rangesByDecorationId = {} - @lineDecorationsByScreenRow = {} - @lineNumberDecorationsByScreenRow = {} - @customGutterDecorationsByGutterNameAndScreenRow = {} - @visibleHighlights = {} + fetchDecorations: -> + @decorations = [] return unless 0 <= @startRow <= @endRow <= Infinity for markerId, decorations of @model.decorationsForScreenRowRange(@startRow, @endRow - 1) range = @model.getMarker(markerId).getScreenRange() for decoration in decorations - if decoration.isType('line') or decoration.isType('gutter') - @addToLineDecorationCaches(decoration, range) - else if decoration.isType('highlight') - @updateHighlightState(decoration, range) + @decorations.push({decoration, range}) + + updateLineDecorations: -> + @rangesByDecorationId = {} + @lineDecorationsByScreenRow = {} + @lineNumberDecorationsByScreenRow = {} + @customGutterDecorationsByGutterNameAndScreenRow = {} + + for {decoration, range} in @decorations + if decoration.isType('line') or decoration.isType('gutter') + @addToLineDecorationCaches(decoration, range) + + return + + updateHighlightDecorations: -> + @visibleHighlights = {} + + for {decoration, range} in @decorations + if decoration.isType('highlight') + @updateHighlightState(decoration, range) for tileId, tileState of @state.content.tiles for id, highlight of tileState.highlights