Preserve tiles that are the target of mousewheel events

This allows velocity-style mouse wheel scrolling to continue once the
tile has been scrolled off screen.
Esse commit está contido em:
Nathan Sobo
2014-08-08 09:52:35 -06:00
commit 0d587028af
4 arquivos alterados com 50 adições e 4 exclusões
+11
Ver Arquivo
@@ -12,6 +12,7 @@ class EditorTileComponent
lineHeightInPixels: null
lineWidths: null
backgroundColor: null
preserved: false
constructor: (@presenter) ->
@lineNodesByLineId = {}
@@ -22,6 +23,7 @@ class EditorTileComponent
@cursorNodesById = {}
@domNode = document.createElement('div')
@domNode.dataset.tile = true
@domNode.style.position = 'absolute'
@domNode.style.overflow = 'hidden'
@@ -43,6 +45,15 @@ class EditorTileComponent
# @clearScreenRowCaches() if newProps.lineHeightInPixels isnt @props.lineHeightInPixels
# @updateCursors()
preserve: ->
return if @preserved
@domNode.style.visibility = 'hidden'
@preserved = true
revive: (@presenter) ->
@domNode.style.visibility = ''
@visible = true
updateTransform: ->
{left, top} = @presenter
unless left is @left and top is @top
+12 -2
Ver Arquivo
@@ -24,6 +24,7 @@ GutterComponent = React.createClass
componentDidMount: ->
@appendDummyTile()
@getDOMNode().addEventListener 'mousewheel', @onMouseWheel
componentDidUpdate: (oldProps) ->
if @props.performedInitialMeasurement
@@ -36,12 +37,16 @@ GutterComponent = React.createClass
for tileStartRow, tileComponent of @tileComponentsByStartRow
unless gutterPresenter.tiles[tileStartRow]?
domNode.removeChild(tileComponent.domNode)
delete @tileComponentsByStartRow[tileStartRow]
if tileComponent.domNode is @preservedTileNode
tileComponent.preserve()
else
domNode.removeChild(tileComponent.domNode)
delete @tileComponentsByStartRow[tileStartRow]
for tileStartRow, tilePresenter of gutterPresenter.tiles
if tileComponent = @tileComponentsByStartRow[tileStartRow]
tileComponent = @tileComponentsByStartRow[tileStartRow]
tileComponent.revive(tilePresenter) if tileComponent.preserved
tileComponent.update()
else
tileComponent = new GutterTileComponent(tilePresenter)
@@ -77,3 +82,8 @@ GutterComponent = React.createClass
editor.unfoldBufferRow(bufferRow)
else
editor.foldBufferRow(bufferRow)
onMouseWheel: (event) ->
node = event.target
node = node.parentNode until not node? or node.dataset.tile
@preservedTileNode = node
+12
Ver Arquivo
@@ -3,12 +3,15 @@ WrapperDiv = document.createElement('div')
module.exports =
class GutterTileComponent
preserved: false
constructor: (@presenter) ->
@lineNumberNodesById = {}
@screenRowsByLineNumberId = {}
@lineNumberDecorationsByLineNumberId = {}
@domNode = document.createElement('div')
@domNode.dataset.tile = true
@domNode.style.overflow = 'hidden'
if @presenter.dummy
@domNode.style.visibility = 'hidden'
@@ -30,6 +33,15 @@ class GutterTileComponent
@updateBackgroundColor()
@updateLineNumbers()
preserve: ->
return if @preserved
@domNode.style.visibility = 'hidden'
@preserved = true
revive: (@presenter) ->
@domNode.style.visibility = ''
@visible = true
updateTransform: ->
{top} = @presenter
unless top is @top
+15 -2
Ver Arquivo
@@ -18,6 +18,7 @@ LinesComponent = React.createClass
displayName: 'LinesComponent'
tileSize: 5
preservedTileNode: null
render: ->
div className: 'lines'
@@ -26,6 +27,9 @@ LinesComponent = React.createClass
@measuredLines = new WeakSet
@tileComponentsByStartRow = {}
componentDidMount: ->
@getDOMNode().addEventListener 'mousewheel', @onMouseWheel
shouldComponentUpdate: (newProps) ->
return true
@@ -80,12 +84,16 @@ LinesComponent = React.createClass
for tileStartRow, tileComponent of @tileComponentsByStartRow
unless contentPresenter.tiles[tileStartRow]?
domNode.removeChild(tileComponent.domNode)
delete @tileComponentsByStartRow[tileStartRow]
if tileComponent.domNode is @preservedTileNode
tileComponent.preserve()
else
domNode.removeChild(tileComponent.domNode)
delete @tileComponentsByStartRow[tileStartRow]
for tileStartRow, tilePresenter of contentPresenter.tiles
if tileComponent = @tileComponentsByStartRow[tileStartRow]
tileComponent = @tileComponentsByStartRow[tileStartRow]
tileComponent.revive(tilePresenter) if tileComponent.preserved
tileComponent.update()
else
tileComponent = new EditorTileComponent(tilePresenter)
@@ -153,3 +161,8 @@ LinesComponent = React.createClass
clearScopedCharWidths: ->
@measuredLines.clear()
@props.editor.clearScopedCharWidths()
onMouseWheel: (event) ->
node = event.target
node = node.parentNode until node.dataset.tile
@preservedTileNode = node