From 17b50ee8dcc91c7cb93f2b370e72e1f5eac10cc5 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Wed, 30 May 2012 16:55:15 -0700 Subject: [PATCH] Folds include their first line --- spec/app/editor-spec.coffee | 4 ++-- spec/app/fold-suggester-spec.coffee | 6 +++--- spec/app/renderer-spec.coffee | 16 +++++----------- src/app/fold-suggester.coffee | 2 +- src/app/renderer.coffee | 23 +++++++++-------------- 5 files changed, 20 insertions(+), 31 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index cf20a16d6..1d6f781b9 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -2443,10 +2443,10 @@ describe "Editor", -> editor.setCursorBufferPosition([1,0]) editor.trigger "toggle-fold" - expect(editor.screenLineForRow(2).fold).toBeDefined() + expect(editor.screenLineForRow(1).fold).toBeDefined() editor.trigger "toggle-fold" - expect(editor.screenLineForRow(2).fold).toBeUndefined() + expect(editor.screenLineForRow(1).fold).toBeUndefined() describe "primitive folding", -> beforeEach -> diff --git a/spec/app/fold-suggester-spec.coffee b/spec/app/fold-suggester-spec.coffee index b60693656..cb284d431 100644 --- a/spec/app/fold-suggester-spec.coffee +++ b/spec/app/fold-suggester-spec.coffee @@ -19,8 +19,8 @@ describe "FoldSuggester", -> describe ".rowRangeForFoldAtBufferRow(bufferRow)", -> it "returns the start/end rows of the foldable region starting at the given row", -> - expect(foldSuggester.rowRangeForFoldAtBufferRow(0)).toEqual [1, 12] - expect(foldSuggester.rowRangeForFoldAtBufferRow(1)).toEqual [2, 9] + expect(foldSuggester.rowRangeForFoldAtBufferRow(0)).toEqual [0, 12] + expect(foldSuggester.rowRangeForFoldAtBufferRow(1)).toEqual [1, 9] expect(foldSuggester.rowRangeForFoldAtBufferRow(2)).toBeNull() - expect(foldSuggester.rowRangeForFoldAtBufferRow(4)).toEqual [5, 7] + expect(foldSuggester.rowRangeForFoldAtBufferRow(4)).toEqual [4, 7] diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index 20c41b1a9..f230d874c 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -161,26 +161,20 @@ describe "Renderer", -> describe "when bufferRow can be folded", -> it "creates/destroys a fold based on the syntactic region starting at the given row", -> renderer.toggleFoldAtBufferRow(1) - fold = renderer.lineForRow(2).fold - expect(fold.startRow).toBe 2 + fold = renderer.lineForRow(1).fold + expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 renderer.toggleFoldAtBufferRow(1) - expect(renderer.lineForRow(2).fold).toBeUndefined() + expect(renderer.lineForRow(1).fold).toBeUndefined() describe "when bufferRow can't be folded", -> it "searches upward for the first row that begins a syntatic region containing the given buffer row (and folds it)", -> renderer.toggleFoldAtBufferRow(8) - fold = renderer.lineForRow(2).fold - expect(fold.startRow).toBe 2 + fold = renderer.lineForRow(1).fold + expect(fold.startRow).toBe 1 expect(fold.endRow).toBe 9 - describe "when the cursor is on a folded line", -> - it "destroys the fold", -> - renderer.toggleFoldAtBufferRow(1) - renderer.toggleFoldAtBufferRow(2) - expect(renderer.lineForRow(2).fold).toBeUndefined() - describe "primitive folding", -> beforeEach -> buffer = new Buffer(require.resolve 'fixtures/two-hundred.txt') diff --git a/src/app/fold-suggester.coffee b/src/app/fold-suggester.coffee index a44c7bc15..e3747636e 100644 --- a/src/app/fold-suggester.coffee +++ b/src/app/fold-suggester.coffee @@ -12,6 +12,6 @@ class FoldSuggester rowRangeForFoldAtBufferRow: (bufferRow) -> if aceRange = @aceFoldMode?.getFoldWidgetRange(@aceFoldAdaptor, null, bufferRow) - [aceRange.start.row + 1, aceRange.end.row] + [aceRange.start.row, aceRange.end.row] else null diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index 5c92f0e1d..1f6c349cc 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -54,21 +54,16 @@ class Renderer @lineMap.bufferRowsForScreenRows(startRow, endRow) toggleFoldAtBufferRow: (bufferRow) -> - if fold = @largestFoldForBufferRow(bufferRow) - fold.destroy() - else - rowToFold = bufferRow - while rowToFold >= 0 - rowRange = @foldSuggester.rowRangeForFoldAtBufferRow(rowToFold) - if rowRange and (rowRange[0] - 1) <= bufferRow <= rowRange[1] - if fold = @largestFoldForBufferRow(rowRange[0]) - fold.destroy() - else - @createFold(rowRange...) + for currentRow in [bufferRow..0] + [startRow, endRow] = @foldSuggester.rowRangeForFoldAtBufferRow(currentRow) ? [] + continue unless startRow and startRow <= bufferRow <= endRow - return - else - rowToFold-- + if fold = @largestFoldForBufferRow(startRow) + fold.destroy() + else + @createFold(startRow, endRow) + + break createFold: (startRow, endRow) -> fold = new Fold(this, startRow, endRow)