From fd152ef2a90193a98fc483829aef811a048a20df Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Sat, 2 Jun 2012 09:21:06 -0700 Subject: [PATCH] When a fold is created inside an existing fold, don't trigger change events or update line map. --- spec/app/renderer-spec.coffee | 22 ++++++++++++++++++--- src/app/renderer.coffee | 36 +++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index c1abb55d2..5225d2386 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -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] diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index f60525ec4..8f4e48c1a 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -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] ? []