Pause measurement on overflowchanged during updates

Content updates trigger overflowchanged, but we're mainly using it to
detect when the editor component has been resized. Pausing measurement
during content updates makes them faster.
This commit is contained in:
Nathan Sobo
2014-04-18 13:23:20 -06:00
parent fdccc0bcc2
commit 168cda4f75

View File

@@ -1,5 +1,6 @@
React = require 'react'
{div} = require 'reactionary'
{debounce} = require 'underscore-plus'
InputComponent = require './input-component'
LinesComponent = require './lines-component'
@@ -10,6 +11,10 @@ module.exports =
EditorScrollViewComponent = React.createClass
displayName: 'EditorScrollViewComponent'
measurementPaused: false
measurementPending: false
measurementRequested: false
render: ->
{editor, fontSize, fontFamily, lineHeight, showIndentGuide, cursorBlinkPeriod, cursorBlinkResumeDelay} = @props
{visibleRowRange, preservedScreenRow, pendingChanges, cursorsMoved, onInputFocused, onInputBlurred} = @props
@@ -38,9 +43,34 @@ EditorScrollViewComponent = React.createClass
SelectionsComponent({editor})
componentDidMount: ->
@getDOMNode().addEventListener 'overflowchanged', @measureHeightAndWidth
@getDOMNode().addEventListener 'overflowchanged', @requestMeasurement
@measureHeightAndWidth()
componentDidUpdate: ->
@pauseMeasurement()
requestMeasurement: ->
if @measurementPaused
@measurementRequested = true
else unless @measurementPending
@measurementPending = true
requestAnimationFrame =>
@measurementPending = false
@measureHeightAndWidth()
pauseMeasurement: ->
@measurementPaused = true
@resumeOverflowChangedEventsAfterDelay ?= debounce(@resumeMeasurement, 500)
@resumeOverflowChangedEventsAfterDelay()
resumeMeasurement: ->
@measurementPaused = false
if @measurementRequested
@measurementRequested = false
@requestMeasurement()
resumeMeasurementAfterDelay: null
onInput: (char, replaceLastCharacter) ->
{editor} = @props