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.
This commit is contained in:
Nathan Sobo
2014-04-18 15:59:32 -06:00
parent 168cda4f75
commit 4e27e765d0

View File

@@ -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