Re-measure character widths when stylesheets change

Fixes #2845
This commit is contained in:
Nathan Sobo 2014-07-07 15:39:00 -06:00
parent 06095e57d7
commit e1e510e473
2 changed files with 34 additions and 0 deletions

View File

@ -587,6 +587,31 @@ describe "EditorComponent", ->
expect(cursorRect.left).toBe rangeRect.left
expect(cursorRect.width).toBe rangeRect.width
it "positions cursors correctly after character widths are changed via a stylesheet change", ->
atom.config.set('editor.fontFamily', 'sans-serif')
editor.setCursorScreenPosition([0, 16])
runSetImmediateCallbacks()
atom.themes.applyStylesheet 'test', """
.function.js {
font-weight: bold;
}
"""
runSetImmediateCallbacks() # re-measure characters once for a synchronous set of stylesheet changes
runSetImmediateCallbacks() # update based on new measurements
cursor = node.querySelector('.cursor')
cursorRect = cursor.getBoundingClientRect()
cursorLocationTextNode = component.lineNodeForScreenRow(0).querySelector('.storage.type.function.js').firstChild
range = document.createRange()
range.setStart(cursorLocationTextNode, 0)
range.setEnd(cursorLocationTextNode, 1)
rangeRect = range.getBoundingClientRect()
expect(cursorRect.left).toBe rangeRect.left
expect(cursorRect.width).toBe rangeRect.width
it "sets the cursor to the default character width at the end of a line", ->
editor.setCursorScreenPosition([0, Infinity])
runSetImmediateCallbacks()

View File

@ -28,6 +28,7 @@ EditorComponent = React.createClass
updateRequested: false
updatesPaused: false
updateRequestedWhilePaused: false
characterWidthRemeasurementRequested: false
cursorsMoved: false
selectionChanged: false
selectionAdded: false
@ -653,6 +654,7 @@ EditorComponent = React.createClass
onStylesheetsChanged: (stylesheet) ->
@refreshScrollbars() if @containsScrollbarSelector(stylesheet)
@requestCharacterWidthRemeasurement()
onScreenLinesChanged: (change) ->
{editor} = @props
@ -793,6 +795,13 @@ EditorComponent = React.createClass
else if @remeasureCharacterWidthsWhenShown and @state.visible and not prevState.visible
@remeasureCharacterWidths()
requestCharacterWidthRemeasurement: ->
unless @characterWidthRemeasurementRequested
@characterWidthRemeasurementRequested = true
setImmediate =>
@characterWidthRemeasurementRequested = false
@remeasureCharacterWidths()
remeasureCharacterWidths: ->
@remeasureCharacterWidthsWhenShown = false
@refs.lines.remeasureCharacterWidths()