🐛 Correctly measure RTL characters

This will fix also the "hidden cursor" issue we were experiencing.

/cc: @izuzak
This commit is contained in:
Antonio Scandurra 2015-10-02 12:48:07 +02:00
parent 2ffa7da59e
commit b7e373fdca
2 changed files with 25 additions and 11 deletions

View File

@ -103,6 +103,23 @@ describe "LinesYardstick", ->
expect(linesYardstick.pixelPositionForScreenPosition([2, 6])).toEqual({left: 72, top: 28})
expect(linesYardstick.pixelPositionForScreenPosition([5, 10])).toEqual({left: 120, top: 70})
it "correctly handles RTL characters", ->
atom.styles.addStyleSheet """
* {
font-size: 14px;
font-family: monospace;
}
"""
editor.setText("السلام عليكم")
expect(linesYardstick.pixelPositionForScreenPosition([0, 0]).left).toBe 0
expect(linesYardstick.pixelPositionForScreenPosition([0, 1]).left).toBe 8
expect(linesYardstick.pixelPositionForScreenPosition([0, 2]).left).toBe 17
expect(linesYardstick.pixelPositionForScreenPosition([0, 5]).left).toBe 34
expect(linesYardstick.pixelPositionForScreenPosition([0, 7]).left).toBe 50
expect(linesYardstick.pixelPositionForScreenPosition([0, 9]).left).toBe 67
expect(linesYardstick.pixelPositionForScreenPosition([0, 11]).left).toBe 84
describe "::screenPositionForPixelPosition(pixelPosition)", ->
it "converts pixel positions to screen positions", ->
atom.styles.addStyleSheet """

View File

@ -161,20 +161,17 @@ class LinesYardstick
0
leftPixelPositionForCharInTextNode: (lineNode, textNode, charIndex) ->
@rangeForMeasurement.setStart(textNode, 0)
@rangeForMeasurement.setEnd(textNode, charIndex)
width = @rangeForMeasurement.getBoundingClientRect().width
@rangeForMeasurement.setStart(textNode, 0)
@rangeForMeasurement.setEnd(textNode, textNode.textContent.length)
left = @rangeForMeasurement.getBoundingClientRect().left
position =
if charIndex is 0
@rangeForMeasurement.setStart(textNode, 0)
@rangeForMeasurement.getBoundingClientRect().left
else if charIndex is textNode.textContent.length
@rangeForMeasurement.setStart(textNode, 0)
@rangeForMeasurement.getBoundingClientRect().right
else
@rangeForMeasurement.setStart(textNode, charIndex)
@rangeForMeasurement.getBoundingClientRect().left
offset = lineNode.getBoundingClientRect().left
position - lineNode.getBoundingClientRect().left
left + width - offset
pixelRectForScreenRange: (screenRange) ->
lineHeight = @model.getLineHeightInPixels()