Render the longest screen row without painting it

This commit is contained in:
Antonio Scandurra
2015-09-15 16:53:55 +02:00
parent 8e06e06899
commit a6c13d097a
2 changed files with 53 additions and 1 deletions

View File

@@ -219,6 +219,54 @@ describe "TextEditorComponent", ->
expectTileContainsRow(tilesNodes[2], 7, top: 1 * lineHeightInPixels)
expectTileContainsRow(tilesNodes[2], 8, top: 2 * lineHeightInPixels)
fffit "renders the longest screen row even when it's not visible", ->
wrapperNode.style.height = 2 * lineHeightInPixels + 'px'
component.measureDimensions()
nextAnimationFrame()
tileNodes = component.tileNodesForLines()
expect(tileNodes.length).toBe(3)
expect(getComputedStyle(tileNodes[0]).visibility).toBe("visible")
expect(tileNodes[0].querySelectorAll(".line").length).toBe(3)
expect(getComputedStyle(tileNodes[1]).visibility).toBe("visible")
expect(tileNodes[1].querySelectorAll(".line").length).toBe(3)
# tile with the longest screen row
expect(getComputedStyle(tileNodes[2]).visibility).toBe("hidden")
expect(tileNodes[2].querySelectorAll(".line").length).toBe(1)
verticalScrollbarNode.scrollTop = 4 * lineHeightInPixels
verticalScrollbarNode.dispatchEvent(new UIEvent('scroll'))
nextAnimationFrame()
tileNodes = component.tileNodesForLines()
expect(tileNodes.length).toBe(2) # don't render an extra tile if the longest screen row is already visible
expect(getComputedStyle(tileNodes[0]).visibility).toBe("visible")
expect(tileNodes[0].querySelectorAll(".line").length).toBe(3)
expect(getComputedStyle(tileNodes[1]).visibility).toBe("visible")
expect(tileNodes[1].querySelectorAll(".line").length).toBe(3)
verticalScrollbarNode.scrollTop = 0 * lineHeightInPixels
verticalScrollbarNode.dispatchEvent(new UIEvent('scroll'))
nextAnimationFrame()
tileNodes = component.tileNodesForLines()
expect(tileNodes.length).toBe(3)
expect(getComputedStyle(tileNodes[0]).visibility).toBe("visible")
expect(tileNodes[0].querySelectorAll(".line").length).toBe(3)
expect(getComputedStyle(tileNodes[1]).visibility).toBe("visible")
expect(tileNodes[1].querySelectorAll(".line").length).toBe(3)
# tile with the longest screen row
expect(getComputedStyle(tileNodes[2]).visibility).toBe("hidden")
expect(tileNodes[2].querySelectorAll(".line").length).toBe(1)
it "updates the lines when lines are inserted or removed above the rendered row range", ->
wrapperNode.style.height = 4.5 * lineHeightInPixels + 'px'
component.measureDimensions()
@@ -2986,7 +3034,7 @@ describe "TextEditorComponent", ->
atom.views.performDocumentPoll()
nextAnimationFrame()
expect(componentNode.querySelectorAll('.line')).toHaveLength(6)
expect(componentNode.querySelectorAll('.line')).toHaveLength(7) # visible rows + the longest screen row
gutterWidth = componentNode.querySelector('.gutter').offsetWidth
componentNode.style.width = gutterWidth + 14 * charWidth + editor.getVerticalScrollbarWidth() + 'px'

View File

@@ -47,6 +47,10 @@ class LinesTileComponent
@domNode.style.zIndex = @newTileState.zIndex
@oldTileState.zIndex = @newTileState.zIndex
if @newTileState.visibility isnt @oldTileState.visibility
@domNode.style.visibility = @newTileState.visibility
@oldTileState.visibility = @newTileState.visibility
if @newTileState.display isnt @oldTileState.display
@domNode.style.display = @newTileState.display
@oldTileState.display = @newTileState.display