Use translate3d to scroll lines / gutter in attempt to improve repaint.

Also: Add custom scrollTop method to editor that manages all the custom optimizations we are doing around scrolling.
This commit is contained in:
Nathan Sobo
2012-05-16 13:47:59 -06:00
parent 66b711a026
commit 2d8ba3b1ee
3 changed files with 119 additions and 62 deletions

View File

@@ -214,10 +214,7 @@ class Editor extends View
false
@verticalScrollbar.on 'scroll', =>
@updateLines()
scrollTop = @verticalScrollbar.scrollTop()
@scrollView.scrollTop(scrollTop)
@gutter.scrollTop(scrollTop)
@scrollTop(@verticalScrollbar.scrollTop(), adjustVerticalScrollbar: false)
@scrollView.on 'scroll', =>
if @scrollView.scrollLeft() == 0
@@ -262,6 +259,24 @@ class Editor extends View
@verticalScrollbarContent.height(linesHeight)
@lines.css('padding-bottom', linesHeight)
scrollTop: (scrollTop, options) ->
return @cachedScrollTop or 0 unless scrollTop?
scrollTop = Math.max(0, scrollTop)
return if scrollTop == @cachedScrollTop
@cachedScrollTop = scrollTop
@updateLines() if @attached
transform = "translate3d(0px, #{-scrollTop}px, 0px)"
@lines.css('-webkit-transform', transform)
@gutter.lineNumbers.css('-webkit-transform', transform)
if options?.adjustVerticalScrollbar ? true
@verticalScrollbar.scrollTop(scrollTop)
scrollBottom: ->
@scrollTop() + @scrollView.height()
renderLines: ->
@lineCache = []
@lines.find('.line').remove()
@@ -307,10 +322,10 @@ class Editor extends View
@lastRenderedScreenRow = lastVisibleScreenRow
getFirstVisibleScreenRow: ->
Math.floor(@verticalScrollbar.scrollTop() / @lineHeight)
Math.floor(@scrollTop() / @lineHeight)
getLastVisibleScreenRow: ->
Math.ceil((@verticalScrollbar.scrollTop() + @scrollView.height()) / @lineHeight) - 1
Math.ceil((@scrollTop() + @scrollView.height()) / @lineHeight) - 1
getScreenLines: ->
@renderer.getLines()
@@ -379,14 +394,14 @@ class Editor extends View
setScrollPositionFromActiveEditSession: ->
editSession = @getActiveEditSession()
@verticalScrollbar.scrollTop(editSession.scrollTop ? 0)
@scrollTop(editSession.scrollTop ? 0)
@scrollView.scrollLeft(editSession.scrollLeft ? 0)
saveCurrentEditSession: ->
@editSessions[@activeEditSessionIndex] =
buffer: @buffer
cursorScreenPosition: @getCursorScreenPosition()
scrollTop: @verticalScrollbar.scrollTop()
scrollTop: @scrollTop()
scrollLeft: @scrollView.scrollLeft()
handleBufferChange: (e) ->
@@ -530,7 +545,7 @@ class Editor extends View
screenPositionFromMouseEvent: (e) ->
{ pageX, pageY } = e
@screenPositionFromPixelPosition
top: pageY - @scrollView.offset().top + @scrollView.scrollTop()
top: pageY - @scrollView.offset().top + @scrollTop()
left: pageX - @scrollView.offset().left + @scrollView.scrollLeft()
calculateDimensions: ->
@@ -697,10 +712,11 @@ class Editor extends View
desiredTop = pixelPosition.top - margin
desiredBottom = pixelPosition.top + @lineHeight + margin
if desiredBottom > @verticalScrollbar.scrollBottom()
@verticalScrollbar.scrollBottom(desiredBottom)
else if desiredTop < @verticalScrollbar.scrollTop()
@verticalScrollbar.scrollTop(desiredTop)
scrollViewHeight = @scrollView.height()
if desiredBottom > @scrollTop() + scrollViewHeight
@scrollTop(desiredBottom - scrollViewHeight)
else if desiredTop < @scrollTop()
@scrollTop(desiredTop)
scrollHorizontally: (pixelPosition) ->
return if @softWrap

View File

@@ -122,10 +122,12 @@ class Autocomplete extends View
setPosition: (originalCursorPosition) ->
{ left, top } = @editor.pixelPositionForScreenPosition(originalCursorPosition)
potentialTop = top + @editor.lineHeight
potentialBottom = potentialTop + @outerHeight()
if potentialBottom > @editor.verticalScrollbar.scrollBottom()
@css(left: left, bottom: @editor.lines.height() - top, top: 'inherit')
if potentialBottom > @editor.scrollBottom()
@css(left: left, bottom: @editor.lines.outerHeight() - top, top: 'inherit')
else
@css(left: left, top: potentialTop, bottom: 'inherit')