diff --git a/src/editor-scroll-view-component.coffee b/src/editor-scroll-view-component.coffee index 1ee1a6f92..b4e099166 100644 --- a/src/editor-scroll-view-component.coffee +++ b/src/editor-scroll-view-component.coffee @@ -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