mirror of
https://github.com/atom/atom.git
synced 2026-04-28 03:01:47 -04:00
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:
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user