diff --git a/src/line-numbers-tile-component.coffee b/src/line-numbers-tile-component.coffee index c92367dc8..05a997216 100644 --- a/src/line-numbers-tile-component.coffee +++ b/src/line-numbers-tile-component.coffee @@ -8,6 +8,7 @@ class LineNumbersTileComponent constructor: ({@id}) -> @lineNumberNodesById = {} + @lineNumberIdsByScreenRow = {} @domNode = document.createElement("div") @domNode.style.position = "absolute" @domNode.style.display = "block" @@ -62,6 +63,7 @@ class LineNumbersTileComponent unless @newTileState.lineNumbers.hasOwnProperty(id) @lineNumberNodesById[id].remove() delete @lineNumberNodesById[id] + delete @lineNumberIdsByScreenRow[lineNumberState.screenRow] delete @oldTileState.lineNumbers[id] for id, lineNumberState of @newTileState.lineNumbers @@ -72,20 +74,29 @@ class LineNumbersTileComponent newLineNumbersHTML ?= "" newLineNumberIds.push(id) newLineNumbersHTML += @buildLineNumberHTML(lineNumberState) + @lineNumberIdsByScreenRow[lineNumberState.screenRow] = id @oldTileState.lineNumbers[id] = _.clone(lineNumberState) if newLineNumberIds? WrapperDiv.innerHTML = newLineNumbersHTML newLineNumberNodes = _.toArray(WrapperDiv.children) + newLineNumberNodes = _.sortBy(newLineNumberNodes, @screenRowForNode) + while newNode = newLineNumberNodes.shift() + oldLineNumberNodes = _.toArray(@domNode.children) + while oldNode = oldLineNumberNodes.shift() + break if @screenRowForNode(newNode) < @screenRowForNode(oldNode) - node = @domNode - for id, i in newLineNumberIds - lineNumberNode = newLineNumberNodes[i] - @lineNumberNodesById[id] = lineNumberNode - node.appendChild(lineNumberNode) + id = @lineNumberIdsByScreenRow[newNode.dataset.screenRow] + @lineNumberNodesById[id] = newNode + if oldNode? + @domNode.insertBefore(newNode, oldNode) + else + @domNode.appendChild(newNode) return + screenRowForNode: (node) -> parseInt(node.dataset.screenRow) + buildLineNumberHTML: (lineNumberState) -> {screenRow, bufferRow, softWrapped, top, decorationClasses, zIndex} = lineNumberState if screenRow? @@ -95,7 +106,7 @@ class LineNumbersTileComponent className = @buildLineNumberClassName(lineNumberState) innerHTML = @buildLineNumberInnerHTML(bufferRow, softWrapped) - "