mirror of
https://github.com/atom/atom.git
synced 2026-01-25 14:59:03 -05:00
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:
@@ -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()
|
||||
|
||||
|
||||
@@ -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 ->
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user