diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 6b9b521a8..d45f1652e 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -2457,6 +2457,14 @@ describe "Editor", -> editor.trigger "toggle-fold" expect(editor.screenLineForRow(1).fold).toBeUndefined() + describe "when a fold-all event is triggered", -> + it "creates folds on every line that can be folded", -> + editor.setCursorBufferPosition([5,13]) + + editor.trigger "fold-all" + expect(editor.screenLineForRow(0).fold).toBeDefined() + expect(editor.screenLineForRow(1)).toBeUndefined() + describe "primitive folding", -> beforeEach -> editor.setBuffer(new Buffer(require.resolve('fixtures/two-hundred.txt'))) diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index f230d874c..f315f8574 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -157,6 +157,25 @@ describe "Renderer", -> expect(renderer.lineForRow(2).foldable).toBeTruthy() expect(renderer.lineForRow(3).foldable).toBeFalsy() + describe ".foldAll()", -> + it "folds every foldable line", -> + renderer.foldAll() + fold = renderer.lineForRow(0).fold + expect(fold).toBeDefined() + expect([fold.startRow, fold.endRow]).toEqual [0,12] + + expect(Object.keys(renderer.activeFolds).length).toBe(3) + expect(renderer.activeFolds[1].length).toBe(1) + expect(renderer.activeFolds[4].length).toBe(1) + + it "doesn't fold lines that are already folded", -> + renderer.toggleFoldAtBufferRow(4) + renderer.foldAll() + expect(Object.keys(renderer.activeFolds).length).toBe(3) + expect(renderer.activeFolds[0].length).toBe(1) + expect(renderer.activeFolds[1].length).toBe(1) + expect(renderer.activeFolds[4].length).toBe(1) + describe ".toggleFoldAtBufferRow(bufferRow)", -> describe "when bufferRow can be folded", -> it "creates/destroys a fold based on the syntactic region starting at the given row", -> diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 15e19dc0a..99d98958e 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -120,6 +120,7 @@ class Editor extends View 'undo': @undo 'redo': @redo 'toggle-soft-wrap': @toggleSoftWrap + 'fold-all': @foldAll 'toggle-fold': @toggleFold 'fold-selection': @foldSelection 'unfold': => @unfoldRow(@getCursorBufferPosition().row) @@ -805,6 +806,9 @@ class Editor extends View for cursor in @getCursors() do (cursor) -> cursor.resetCursorAnimation() + foldAll: -> + @renderer.foldAll() + toggleFold: -> @renderer.toggleFoldAtBufferRow(@getCursorBufferPosition().row) diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index 57698ca54..d141ba97c 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -53,6 +53,13 @@ class Renderer bufferRowsForScreenRows: (startRow, endRow) -> @lineMap.bufferRowsForScreenRows(startRow, endRow) + foldAll: -> + for currentRow in [@buffer.getLastRow()..0] + [startRow, endRow] = @foldSuggester.rowRangeForFoldAtBufferRow(currentRow) ? [] + continue unless startRow? + + @createFold(startRow, endRow) + toggleFoldAtBufferRow: (bufferRow) -> for currentRow in [bufferRow..0] [startRow, endRow] = @foldSuggester.rowRangeForFoldAtBufferRow(currentRow) ? [] @@ -65,7 +72,12 @@ class Renderer break + foldFor: (startRow, endRow) -> + _.find @activeFolds[startRow] ? [], (fold) -> + fold.startRow == startRow and fold.endRow == endRow + createFold: (startRow, endRow) -> + return fold if fold = @foldFor(startRow, endRow) fold = new Fold(this, startRow, endRow) @registerFold(fold)