Key line numbers by buffer row and soft-wrap count

…instead of an array. This will make things simpler to diff in the
view.
This commit is contained in:
Nathan Sobo 2015-01-27 06:07:21 -07:00
parent 182531a010
commit 20838accc1
3 changed files with 26 additions and 10 deletions

View File

@ -856,7 +856,15 @@ describe "TextEditorPresenter", ->
describe ".gutter", ->
describe ".lineNumbers", ->
lineNumberStateForScreenRow = (presenter, screenRow) ->
presenter.state.gutter.lineNumbers[screenRow - presenter.getStartRow()]
editor = presenter.model
bufferRow = editor.bufferRowForScreenRow(screenRow)
wrapCount = screenRow - editor.screenRowForBufferRow(bufferRow)
if wrapCount > 0
key = bufferRow + '-' + wrapCount
else
key = bufferRow
presenter.state.gutter.lineNumbers[key]
it "contains states for line numbers that are visible on screen, plus and minus the overdraw margin", ->
editor.foldBufferRow(4)
@ -865,12 +873,12 @@ describe "TextEditorPresenter", ->
presenter = new TextEditorPresenter(model: editor, clientHeight: 25, scrollTop: 30, lineHeight: 10, lineOverdrawMargin: 1)
expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined()
expectValues lineNumberStateForScreenRow(presenter, 2), {bufferRow: 2, softWrapped: false, top: 2 * 10}
expectValues lineNumberStateForScreenRow(presenter, 3), {bufferRow: 3, softWrapped: false, top: 3 * 10}
expectValues lineNumberStateForScreenRow(presenter, 4), {bufferRow: 3, softWrapped: true, top: 4 * 10}
expectValues lineNumberStateForScreenRow(presenter, 5), {bufferRow: 4, softWrapped: false, top: 5 * 10}
expectValues lineNumberStateForScreenRow(presenter, 6), {bufferRow: 7, softWrapped: false, top: 6 * 10}
expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 8, softWrapped: false, top: 7 * 10}
expectValues lineNumberStateForScreenRow(presenter, 2), {screenRow: 2, bufferRow: 2, softWrapped: false, top: 2 * 10}
expectValues lineNumberStateForScreenRow(presenter, 3), {screenRow: 3, bufferRow: 3, softWrapped: false, top: 3 * 10}
expectValues lineNumberStateForScreenRow(presenter, 4), {screenRow: 4, bufferRow: 3, softWrapped: true, top: 4 * 10}
expectValues lineNumberStateForScreenRow(presenter, 5), {screenRow: 5, bufferRow: 4, softWrapped: false, top: 5 * 10}
expectValues lineNumberStateForScreenRow(presenter, 6), {screenRow: 6, bufferRow: 7, softWrapped: false, top: 6 * 10}
expectValues lineNumberStateForScreenRow(presenter, 7), {screenRow: 7, bufferRow: 8, softWrapped: false, top: 7 * 10}
expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined()
it "includes states for all line numbers if no external client height is assigned", ->

View File

@ -155,22 +155,28 @@ class TextEditorPresenter
@emitter.emit 'did-update-state'
updateLineNumbersState: ->
lastBufferRow = null
@state.gutter.lineNumbers = {}
startRow = @getStartRow()
endRow = @getEndRow()
lastBufferRow = null
wrapCount = 0
@state.gutter.lineNumbers = @model.bufferRowsForScreenRows(startRow, endRow - 1).map (bufferRow, i) =>
for bufferRow, i in @model.bufferRowsForScreenRows(startRow, endRow - 1)
screenRow = startRow + i
top = screenRow * @getLineHeight()
if bufferRow is lastBufferRow
wrapCount++
softWrapped = true
key = bufferRow + '-' + wrapCount
else
wrapCount = 0
softWrapped = false
lastBufferRow = bufferRow
key = bufferRow
decorationClasses = @lineNumberDecorationClassesForRow(screenRow)
foldable = @model.isFoldableAtScreenRow(screenRow)
{bufferRow, softWrapped, top, decorationClasses, foldable}
@state.gutter.lineNumbers[key] = {screenRow, bufferRow, softWrapped, top, decorationClasses, foldable}
@emitter.emit 'did-update-state'

View File

@ -717,6 +717,8 @@ class TextEditor extends Model
# {Delegates to: DisplayBuffer.bufferRowsForScreenRows}
bufferRowsForScreenRows: (startRow, endRow) -> @displayBuffer.bufferRowsForScreenRows(startRow, endRow)
screenRowForBufferRow: (row) -> @displayBuffer.screenRowForBufferRow(row)
# {Delegates to: DisplayBuffer.getMaxLineLength}
getMaxScreenLineLength: -> @displayBuffer.getMaxLineLength()