In Editor.updateRenderedLines, cap renderFrom to the last screen row

If we remove a large number of screen lines when we are scrolled down,
the current @firstRenderedScreenRow may end up being larger than the
number of screen rows we now have. Setting renderFrom to the
@firstRenderedScreenRow in this case was causing the renderFrom to be
larger than the renderTo, which was causing problems downstream with
the new mapping code.
This commit is contained in:
Nathan Sobo
2013-05-10 12:55:44 -06:00
parent 7d28edc116
commit b4dec8ccbb
2 changed files with 14 additions and 4 deletions

View File

@@ -1388,6 +1388,15 @@ describe "Editor", ->
expect(editor.renderedLines.find('.line').length).toBe 1
expect(editor.renderedLines.find('.line').text()).toBe buffer.lineForRow(0)
describe "when folding leaves fewer screen lines than the first rendered screen line (regression)", ->
it "clears all screen lines and does not throw any exceptions", ->
editor.lineOverdraw = 1
editor.attachToDom(heightInLines: 5)
editor.scrollToBottom()
editor.activeEditSession.foldBufferRow(0)
expect(editor.renderedLines.find('.line').length).toBe 1
expect(editor.renderedLines.find('.line').text()).toBe buffer.lineForRow(0)
describe "when autoscrolling at the end of the document", ->
it "renders lines properly", ->
editor.edit(project.buildEditSession('two-hundred.txt'))

View File

@@ -1149,13 +1149,14 @@ class Editor extends View
updateRenderedLines: ->
firstVisibleScreenRow = @getFirstVisibleScreenRow()
lastVisibleScreenRow = @getLastVisibleScreenRow()
lastScreenRow = @getLastScreenRow()
if @firstRenderedScreenRow? and firstVisibleScreenRow >= @firstRenderedScreenRow and lastVisibleScreenRow <= @lastRenderedScreenRow
renderFrom = @firstRenderedScreenRow
renderTo = Math.min(@getLastScreenRow(), @lastRenderedScreenRow)
renderFrom = Math.min(lastScreenRow, @firstRenderedScreenRow)
renderTo = Math.min(lastScreenRow, @lastRenderedScreenRow)
else
renderFrom = Math.max(0, firstVisibleScreenRow - @lineOverdraw)
renderTo = Math.min(@getLastScreenRow(), lastVisibleScreenRow + @lineOverdraw)
renderFrom = Math.min(lastScreenRow, Math.max(0, firstVisibleScreenRow - @lineOverdraw))
renderTo = Math.min(lastScreenRow, lastVisibleScreenRow + @lineOverdraw)
if @pendingChanges.length == 0 and @firstRenderedScreenRow and @firstRenderedScreenRow <= renderFrom and renderTo <= @lastRenderedScreenRow
return