From 4e27e765d037d895c44098903213e43d6549dcfb Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 18 Apr 2014 15:59:32 -0600 Subject: [PATCH] Measure width and height when window size changes Since overflowchanged events are paused for a bit after updates to prevent thrashing, this ensures the editor is still updated promptly when resizing. --- src/editor-scroll-view-component.coffee | 58 +++++++++++++++---------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/editor-scroll-view-component.coffee b/src/editor-scroll-view-component.coffee index b4e099166..e89ffec12 100644 --- a/src/editor-scroll-view-component.coffee +++ b/src/editor-scroll-view-component.coffee @@ -11,9 +11,9 @@ module.exports = EditorScrollViewComponent = React.createClass displayName: 'EditorScrollViewComponent' - measurementPaused: false measurementPending: false - measurementRequested: false + overflowChangedEventsPaused: false + overflowChangedWhilePaused: false render: -> {editor, fontSize, fontFamily, lineHeight, showIndentGuide, cursorBlinkPeriod, cursorBlinkResumeDelay} = @props @@ -43,33 +43,45 @@ EditorScrollViewComponent = React.createClass SelectionsComponent({editor}) componentDidMount: -> - @getDOMNode().addEventListener 'overflowchanged', @requestMeasurement + @getDOMNode().addEventListener 'overflowchanged', @onOverflowChanged + window.addEventListener('resize', @onWindowResize) + @measureHeightAndWidth() + componentDidUnmount: -> + window.removeEventListener('resize', @onWindowResize) + componentDidUpdate: -> - @pauseMeasurement() + @pauseOverflowChangedEvents() - 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 + onOverflowChanged: -> + if @overflowChangedEventsPaused + @overflowChangedWhilePaused = true + else @requestMeasurement() - resumeMeasurementAfterDelay: null + onWindowResize: -> + @requestMeasurement() + + pauseOverflowChangedEvents: -> + @overflowChangedEventsPaused = true + @resumeOverflowChangedEventsAfterDelay ?= debounce(@resumeOverflowChangedEvents, 500) + @resumeOverflowChangedEventsAfterDelay() + + resumeOverflowChangedEvents: -> + if @overflowChangedWhilePaused + @overflowChangedWhilePaused = false + @requestMeasurement() + + resumeOverflowChangedEventsAfterDelay: null + + requestMeasurement: -> + return if @measurementPending + + @measurementPending = true + requestAnimationFrame => + @measurementPending = false + @measureHeightAndWidth() onInput: (char, replaceLastCharacter) -> {editor} = @props