Fix positioning for block decorations located at the beginning of a tile

This commit is contained in:
Antonio Scandurra
2017-04-24 19:23:49 +02:00
parent 638bb78ecb
commit 72351481c7
2 changed files with 28 additions and 32 deletions

View File

@@ -1609,33 +1609,7 @@ describe('TextEditorComponent', () => {
expect(element.contains(item5)).toBe(false)
expect(element.contains(item6)).toBe(false)
// scroll past the first tile
await setScrollTop(component, 3 * component.getLineHeight() + getElementHeight(item1) + getElementHeight(item2))
expect(component.getRenderedStartRow()).toBe(3)
expect(component.getRenderedEndRow()).toBe(9)
expect(component.getScrollHeight()).toBe(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item1) + getElementHeight(item2) + getElementHeight(item3) +
getElementHeight(item4) + getElementHeight(item5) + getElementHeight(item6)
)
assertTilesAreSizedAndPositionedCorrectly(component, [
{tileStartRow: 3, height: 3 * component.getLineHeight() + getElementHeight(item3)},
{tileStartRow: 6, height: 3 * component.getLineHeight() + getElementHeight(item4) + getElementHeight(item5)}
])
assertLinesAreAlignedWithLineNumbers(component)
expect(element.querySelectorAll('.line:not(.dummy)').length).toBe(6)
expect(element.contains(item1)).toBe(false)
expect(element.contains(item2)).toBe(false)
expect(item3.previousSibling).toBe(lineNodeForScreenRow(component, 3))
expect(item3.nextSibling).toBe(lineNodeForScreenRow(component, 4))
expect(item4.previousSibling).toBe(lineNodeForScreenRow(component, 6))
expect(item4.nextSibling).toBe(lineNodeForScreenRow(component, 7))
expect(item5.previousSibling).toBe(lineNodeForScreenRow(component, 7))
expect(item5.nextSibling).toBe(lineNodeForScreenRow(component, 8))
expect(element.contains(item6)).toBe(false)
// destroy decoration1
await setScrollTop(component, 0)
decoration1.destroy()
await component.getNextUpdatePromise()
expect(component.getRenderedStartRow()).toBe(0)
@@ -1711,6 +1685,30 @@ describe('TextEditorComponent', () => {
expect(element.contains(item5)).toBe(false)
expect(element.contains(item6)).toBe(false)
// scroll past the first tile
await setScrollTop(component, 3 * component.getLineHeight() + getElementHeight(item3))
expect(component.getRenderedStartRow()).toBe(3)
expect(component.getRenderedEndRow()).toBe(9)
expect(component.getScrollHeight()).toBe(
editor.getScreenLineCount() * component.getLineHeight() +
getElementHeight(item2) + getElementHeight(item3) +
getElementHeight(item4) + getElementHeight(item5) + getElementHeight(item6)
)
assertTilesAreSizedAndPositionedCorrectly(component, [
{tileStartRow: 3, height: 3 * component.getLineHeight() + getElementHeight(item2)},
{tileStartRow: 6, height: 3 * component.getLineHeight()}
])
assertLinesAreAlignedWithLineNumbers(component)
expect(element.querySelectorAll('.line:not(.dummy)').length).toBe(6)
expect(element.contains(item1)).toBe(false)
expect(item2.previousSibling).toBeNull()
expect(item2.nextSibling).toBe(lineNodeForScreenRow(component, 3))
expect(element.contains(item3)).toBe(false)
expect(element.contains(item4)).toBe(false)
expect(element.contains(item5)).toBe(false)
expect(element.contains(item6)).toBe(false)
await setScrollTop(component, 0)
// undo the previous change
editor.undo()
await component.getNextUpdatePromise()

View File

@@ -2742,12 +2742,10 @@ class LineNumberGutterComponent {
style: {width: width + 'px'},
dataset: {bufferRow}
}
if (row === 0 || i > 0) {
let currentRowTop = rootComponent.pixelPositionAfterBlocksForRow(row)
let previousRowBottom = rootComponent.pixelPositionAfterBlocksForRow(row - 1) + lineHeight
if (currentRowTop > previousRowBottom) {
lineNumberProps.style.marginTop = (currentRowTop - previousRowBottom) + 'px'
}
const currentRowTop = rootComponent.pixelPositionAfterBlocksForRow(row)
const previousRowBottom = rootComponent.pixelPositionAfterBlocksForRow(row - 1) + lineHeight
if (currentRowTop > previousRowBottom) {
lineNumberProps.style.marginTop = (currentRowTop - previousRowBottom) + 'px'
}
tileChildren[row - tileStartRow] = $.div(lineNumberProps,