From 7b4ebcdd4277dd4195c7c322f20a491ae26baee4 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 22 May 2012 12:09:37 -0700 Subject: [PATCH] Changes inside a fold correctly change the start/end row --- spec/app/renderer-spec.coffee | 11 +++++++++-- src/app/fold.coffee | 19 +++++++++++++------ src/app/renderer.coffee | 5 ++--- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index 901e6aee8..2c890ddcc 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -304,15 +304,22 @@ describe "Renderer", -> describe "when the old range is inside a fold", -> it "does not trigger a change event, but updates the fold and ensures the change is present when the fold is destroyed", -> - buffer.change([[2, 0], [2, 0]], 'abc') + buffer.insert([2, 0], '\n') + expect(fold1.startRow).toBe 2 + expect(fold1.endRow).toBe 5 expect(renderer.lineForRow(1).text).toBe "1" + expect(renderer.lineForRow(2).text).toBe "" expect(renderer.lineForRow(2).fold).toBe fold1 + expect(renderer.lineForRow(2).bufferDelta).toEqual [4, 0] expect(renderer.lineForRow(3).text).toMatch "5" expect(renderer.lineForRow(4).fold).toBe fold2 expect(renderer.lineForRow(5).text).toMatch /^9-+/ - expect(changeHandler).not.toHaveBeenCalled() + expect(changeHandler).toHaveBeenCalled() + [[event]] = changeHandler.argsForCall + expect(event.oldRange).toEqual [[2, 0], [2, 1]] + expect(event.newRange).toEqual [[2, 0], [2, 0]] describe "when the old range surrounds a fold", -> it "removes the fold and replaces the fold placeholder with the new text", -> diff --git a/src/app/fold.coffee b/src/app/fold.coffee index fef7c4db0..c8058d92e 100644 --- a/src/app/fold.coffee +++ b/src/app/fold.coffee @@ -27,8 +27,8 @@ class Fold return changeInsideFold = @startRow <= oldRange.start.row and @endRow >= oldRange.end.row - @startRow = @updateAnchorRow(@startRow, event) - @endRow = @updateAnchorRow(@endRow, event) + @updateStartRow(event) + @updateEndRow(event) if @startRow != oldStartRow @renderer.unregisterFold(oldStartRow, this) @@ -36,9 +36,16 @@ class Fold changeInsideFold - updateAnchorRow: (row, event) -> + updateStartRow: (event) -> { newRange, oldRange } = event - return row if row < oldRange.start.row + return if oldRange.start.row >= @startRow - deltaFromOldRangeEndRow = row - oldRange.end.row - newRange.end.row + deltaFromOldRangeEndRow \ No newline at end of file + deltaFromOldRangeEndRow = @startRow - oldRange.end.row + @startRow = newRange.end.row + deltaFromOldRangeEndRow + + updateEndRow: (event) -> + { newRange, oldRange } = event + return if oldRange.start.row > @endRow + + deltaFromOldRangeEndRow = @endRow - oldRange.end.row + @endRow = newRange.end.row + deltaFromOldRangeEndRow diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index 30c560ec2..e04ea9735 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -106,10 +106,9 @@ class Renderer handleBufferChange: (e) -> for row, folds of @activeFolds for fold in new Array(folds...) - changeInsideFold = true if fold.handleBufferChange(e) + fold.handleBufferChange(e) - unless changeInsideFold - @handleHighlighterChange(@lastHighlighterChangeEvent) + @handleHighlighterChange(@lastHighlighterChangeEvent) handleHighlighterChange: (e) -> oldBufferRange = e.oldRange.copy()