From 168cda4f75d3a55d2596eda25dcee42eaaa85b15 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 18 Apr 2014 13:23:20 -0600 Subject: [PATCH] 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. --- src/editor-scroll-view-component.coffee | 32 ++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) 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