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.
This commit is contained in:
Corey Johnson
2012-05-30 16:29:45 -07:00
parent 76f5d35eb9
commit 42e743f44a
4 changed files with 26 additions and 13 deletions

View File

@@ -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()

View File

@@ -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 ->

View File

@@ -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'

View File

@@ -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)