From 42e743f44a09da685e82fe32bec27f2b1fb7c269 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Wed, 30 May 2012 16:29:45 -0700 Subject: [PATCH] Renderer.toggleFold works for folded, foldable and non-foldable lines When a line is not foldable, we search upward for a suggested fold that contains it and apply that fold instead. If called with a row that is already folded, it unfolds it. --- spec/app/editor-spec.coffee | 1 - spec/app/renderer-spec.coffee | 20 +++++++++++++------- src/app/keymaps/editor.coffee | 3 ++- src/app/renderer.coffee | 15 +++++++++++---- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index a2fa69ab3..cf20a16d6 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -2445,7 +2445,6 @@ describe "Editor", -> editor.trigger "toggle-fold" expect(editor.screenLineForRow(2).fold).toBeDefined() - editor.moveCursorDown() editor.trigger "toggle-fold" expect(editor.screenLineForRow(2).fold).toBeUndefined() diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index d3c4d44f8..20c41b1a9 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -165,15 +165,21 @@ describe "Renderer", -> expect(fold.startRow).toBe 2 expect(fold.endRow).toBe 9 - renderer.toggleFoldAtBufferRow(2) + renderer.toggleFoldAtBufferRow(1) expect(renderer.lineForRow(2).fold).toBeUndefined() - describe ".createFoldAtBufferRow(bufferRow)", -> - it "creates a fold based on the syntactic region starting at the given row", -> - renderer.createFoldAtBufferRow(1) - fold = renderer.lineForRow(2).fold - expect(fold.startRow).toBe 2 - expect(fold.endRow).toBe 9 + 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 + 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 -> diff --git a/src/app/keymaps/editor.coffee b/src/app/keymaps/editor.coffee index fe392b3dd..fb17f104f 100644 --- a/src/app/keymaps/editor.coffee +++ b/src/app/keymaps/editor.coffee @@ -27,7 +27,8 @@ window.keymap.bindKeys '.editor', 'meta-z': 'undo' 'meta-Z': 'redo' 'alt-meta-w': 'toggle-soft-wrap' - 'alt-meta-f': 'fold-selection' + 'alt-meta-f': 'toggle-fold' + 'alt-meta-ctrl-f': 'fold-selection' 'alt-meta-u': 'unfold' 'alt-meta-left': 'split-left' 'alt-meta-right': 'split-right' diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index 2edff40f9..5c92f0e1d 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -57,11 +57,18 @@ class Renderer if fold = @largestFoldForBufferRow(bufferRow) fold.destroy() else - @createFoldAtBufferRow(bufferRow) + 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...) - createFoldAtBufferRow: (bufferRow) -> - [startRow, endRow] = @foldSuggester.rowRangeForFoldAtBufferRow(bufferRow) - @createFold(startRow, endRow) + return + else + rowToFold-- createFold: (startRow, endRow) -> fold = new Fold(this, startRow, endRow)