From a685f3dc374401f0170a8eb7663eb973a1d21053 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 3 Feb 2015 21:02:33 -0700 Subject: [PATCH] Prevent updates for off-screen line decoration markers on change When there were lots of off-screen markers, we were performing lots of redundant updates when off-screen markers changed. Now we only perform updates if they intersect the visible row range. @maxbrunsfeld this should improve the situation for folding/unfolding when there are lots of others folds. Let me know. --- src/text-editor-presenter.coffee | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 7eb29b6b0..aeff452a5 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -563,12 +563,27 @@ class TextEditorPresenter decorationMarkerDidChange: (decoration, change) -> if decoration.isType('line') or decoration.isType('line-number') - @removeFromLineDecorationCaches(decoration, new Range(change.oldTailScreenPosition, change.oldHeadScreenPosition)) - @addToLineDecorationCaches(decoration, new Range(change.newTailScreenPosition, change.newHeadScreenPosition)) - @updateLinesState() if decoration.isType('line') - @updateLineNumbersState() if decoration.isType('line-number') + intersectsVisibleRowRange = false + startRow = @computeStartRow() + endRow = @computeEndRow() + oldRange = new Range(change.oldTailScreenPosition, change.oldHeadScreenPosition) + newRange = new Range(change.newTailScreenPosition, change.newHeadScreenPosition) + + if oldRange.intersectsRowRange(startRow, endRow - 1) + @removeFromLineDecorationCaches(decoration, oldRange) + intersectsVisibleRowRange = true + + if newRange.intersectsRowRange(startRow, endRow - 1) + @addToLineDecorationCaches(decoration, newRange) + intersectsVisibleRowRange = true + + if intersectsVisibleRowRange + @updateLinesState() if decoration.isType('line') + @updateLineNumbersState() if decoration.isType('line-number') + if decoration.isType('highlight') @updateHighlightState(decoration) + if decoration.isType('overlay') @updateOverlaysState()