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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário