WIP: Handle buffer change events correctly with respect to folded lines

We're handling changes that straddle the start row and are in the middle of the fold, but we're still screwing up when the old range straddles the end row.
This commit is contained in:
Corey Johnson & Nathan Sobo
2012-05-22 19:02:13 -07:00
parent 13416bd6f2
commit 04f4a9a765
3 changed files with 98 additions and 28 deletions

View File

@@ -15,18 +15,19 @@ class Fold
destroy: ->
@renderer.destroyFold(this)
inspect: ->
"Fold(#{@startRow}, #{@endRow})"
getBufferDelta: ->
new Point(@endRow - @startRow + 1, 0)
handleBufferChange: (event) ->
oldStartRow = @startRow
{ oldRange } = event
if oldRange.start.row <= @startRow and oldRange.end.row >= @endRow
@renderer.unregisterFold(oldStartRow, this)
if @isContainedByRange(event.oldRange)
@renderer.unregisterFold(@startRow, this)
return
changeInsideFold = @startRow <= oldRange.start.row and @endRow >= oldRange.end.row
@updateStartRow(event)
@updateEndRow(event)
@@ -34,18 +35,34 @@ class Fold
@renderer.unregisterFold(oldStartRow, this)
@renderer.registerFold(@startRow, this)
changeInsideFold
isContainedByRange: (range) ->
range.start.row <= @startRow and @endRow <= range.end.row
updateStartRow: (event) ->
{ newRange, oldRange } = event
return if oldRange.start.row >= @startRow
deltaFromOldRangeEndRow = @startRow - oldRange.end.row
@startRow = newRange.end.row + deltaFromOldRangeEndRow
if oldRange.end.row < @startRow
delta = newRange.end.row - oldRange.end.row
else if newRange.end.row < @startRow
delta = newRange.end.row - @startRow
else
delta = 0
console.log "start row delta", delta
@startRow += delta
updateEndRow: (event) ->
{ newRange, oldRange } = event
return if oldRange.start.row > @endRow
deltaFromOldRangeEndRow = @endRow - oldRange.end.row
@endRow = newRange.end.row + deltaFromOldRangeEndRow
if oldRange.end.row <= @endRow
delta = newRange.end.row - oldRange.end.row
else if newRange.end.row <= @endRow
console.log "newRange.end.row", newRange.end.row, " - @endRow", @endRow
delta = newRange.end.row - @endRow
else
delta = 0
console.log "end row delta", delta
@endRow += delta

View File

@@ -111,12 +111,15 @@ class Renderer
@handleHighlighterChange(@lastHighlighterChangeEvent)
handleHighlighterChange: (e) ->
{ oldRange, newRange } = e
oldRange = @bufferRangeForScreenRange(@screenRangeForBufferRange(e.oldRange.copy()))
newRange = @bufferRangeForScreenRange(@screenRangeForBufferRange(e.newRange.copy()))
oldScreenRange = @screenLineRangeForBufferRange(oldRange)
newScreenLines = @buildLinesForBufferRows(newRange.start.row, newRange.end.row)
@lineMap.replaceScreenRows oldScreenRange.start.row, oldScreenRange.end.row, newScreenLines
newScreenRange = @screenLineRangeForBufferRange(newRange)
console.log "New Screen Range", newScreenRange.inspect()
@trigger 'change', { oldRange: oldScreenRange, newRange: newScreenRange, bufferChanged: true }
@@ -176,6 +179,7 @@ class Renderer
@foldsById[fold.id] = fold
unregisterFold: (bufferRow, fold) ->
console.log "unregistering fold", fold.id
folds = @activeFolds[bufferRow]
_.remove(folds, fold)
delete @foldsById[fold.id]