From 8da44c4dfc44703cb5daf699370a68c46079aad7 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 17 Nov 2015 11:45:51 -0800 Subject: [PATCH] Discard highlights that end above the visible row range Fixes #9628 --- spec/text-editor-presenter-spec.coffee | 12 ++++++++++++ src/text-editor-presenter.coffee | 26 ++++++++++++++++++-------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 54899a1d6..06a857a64 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1704,6 +1704,18 @@ describe "TextEditorPresenter", -> expectUndefinedStateForHighlight(presenter, highlight) + it "does not include highlights that end before the first visible row", -> + editor.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.") + editor.setSoftWrapped(true) + editor.setWidth(100, true) + editor.setDefaultCharWidth(10) + + marker = editor.markBufferRange([[0, 0], [0, 4]], invalidate: 'never') + highlight = editor.decorateMarker(marker, type: 'highlight', class: 'a') + presenter = buildPresenter(explicitHeight: 30, scrollTop: 10, tileSize: 2) + + expect(stateForHighlightInTile(presenter, highlight, 0)).toBeUndefined() + it "updates when ::scrollTop changes", -> editor.setSelectedBufferRanges([ [[6, 2], [6, 4]], diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 7bd66b87f..b1f28af11 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1244,14 +1244,7 @@ class TextEditorPresenter updateHighlightState: (decorationId, properties, screenRange) -> return unless @startRow? and @endRow? and @lineHeight? and @hasPixelPositionRequirements() - return if screenRange.isEmpty() - - if screenRange.start.row < @startRow - screenRange.start.row = @startRow - screenRange.start.column = 0 - if screenRange.end.row >= @endRow - screenRange.end.row = @endRow - screenRange.end.column = 0 + @constrainRangeToVisibleRowRange(screenRange) return if screenRange.isEmpty() @@ -1281,6 +1274,23 @@ class TextEditorPresenter true + constrainRangeToVisibleRowRange: (screenRange) -> + if screenRange.start.row < @startRow + screenRange.start.row = @startRow + screenRange.start.column = 0 + + if screenRange.end.row < @startRow + screenRange.end.row = @startRow + screenRange.end.column = 0 + + if screenRange.start.row >= @endRow + screenRange.start.row = @endRow + screenRange.start.column = 0 + + if screenRange.end.row >= @endRow + screenRange.end.row = @endRow + screenRange.end.column = 0 + repositionRegionWithinTile: (region, tileStartRow) -> region.top += @scrollTop - tileStartRow * @lineHeight region.left += @scrollLeft