When a fold is created inside an existing fold, don't trigger change events or update line map.

This commit is contained in:
Corey Johnson & Nathan Sobo
2012-06-02 09:21:06 -07:00
parent 433a4db5ae
commit fd152ef2a9
2 changed files with 41 additions and 17 deletions

View File

@@ -315,6 +315,25 @@ describe "Renderer", ->
newFold = renderer.createFold(0,10)
expect(newFold).toBe fold
expect(renderer.activeFolds[0].length).toBe 1
describe "when a fold is created inside an existing folded region", ->
it "creates/destroys the fold, but does not trigger change event", ->
outerFold = renderer.createFold(0, 10)
changeHandler.reset()
innerFold = renderer.createFold(2, 5)
expect(changeHandler).not.toHaveBeenCalled()
[line0, line1] = renderer.linesForRows(0, 1)
expect(line0.fold).toBe outerFold
expect(line1.fold).toBeUndefined()
changeHandler.reset()
innerFold.destroy()
expect(changeHandler).not.toHaveBeenCalled()
[line0, line1] = renderer.linesForRows(0, 1)
expect(line0.fold).toBe outerFold
expect(line1.fold).toBeUndefined()
describe "when the buffer changes", ->
[fold1, fold2] = []
beforeEach ->
@@ -583,6 +602,3 @@ describe "Renderer", ->
describe ".bufferRowsForScreenRows()", ->
it "returns the buffer rows corresponding to each screen row in the given range", ->
renderer.setMaxLineLength(50)
renderer.createFold(4, 7)
expect(renderer.bufferRowsForScreenRows()).toEqual [0, 1, 2, 3, 3, 4, 8, 8, 9, 10, 11, 12]

View File

@@ -54,7 +54,7 @@ class Renderer
@lineMap.bufferRowsForScreenRows(startRow, endRow)
foldAll: ->
for currentRow in [@buffer.getLastRow()..0]
for currentRow in [0..@buffer.getLastRow()]
[startRow, endRow] = @foldSuggester.rowRangeForFoldAtBufferRow(currentRow) ? []
continue unless startRow?
@@ -72,6 +72,11 @@ class Renderer
break
isFoldContainedByActiveFold: (fold) ->
for row, folds of @activeFolds
for otherFold in folds
return otherFold if fold != otherFold and fold.isContainedByFold(otherFold)
foldFor: (startRow, endRow) ->
_.find @activeFolds[startRow] ? [], (fold) ->
fold.startRow == startRow and fold.endRow == endRow
@@ -81,27 +86,30 @@ class Renderer
fold = new Fold(this, startRow, endRow)
@registerFold(fold)
bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)])
oldScreenRange = @screenLineRangeForBufferRange(bufferRange)
unless @isFoldContainedByActiveFold(fold)
bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)])
oldScreenRange = @screenLineRangeForBufferRange(bufferRange)
lines = @buildLineForBufferRow(startRow)
@lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines)
newScreenRange = @screenLineRangeForBufferRange(bufferRange)
lines = @buildLineForBufferRow(startRow)
@lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines)
newScreenRange = @screenLineRangeForBufferRange(bufferRange)
@trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true
@trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true
fold
destroyFold: (fold) ->
@unregisterFold(fold.startRow, fold)
{ startRow, endRow } = fold
bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)])
oldScreenRange = @screenLineRangeForBufferRange(bufferRange)
lines = @buildLinesForBufferRows(startRow, endRow)
@lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines)
newScreenRange = @screenLineRangeForBufferRange(bufferRange)
unless @isFoldContainedByActiveFold(fold)
{ startRow, endRow } = fold
bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)])
oldScreenRange = @screenLineRangeForBufferRange(bufferRange)
lines = @buildLinesForBufferRows(startRow, endRow)
@lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines)
newScreenRange = @screenLineRangeForBufferRange(bufferRange)
@trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true
@trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true
destroyFoldsContainingBufferRow: (bufferRow) ->
folds = @activeFolds[bufferRow] ? []