From 8416dc35989342f6a4071ac7d09d589c0486a0a9 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Thu, 14 Jun 2012 13:56:08 -0700 Subject: [PATCH 1/3] DisplayBuffer.destroyFoldsContainingBufferRow destroys all folds containing buffer row (instead of just folds starting at buffer row) --- spec/app/display-buffer-spec.coffee | 16 ++++++++++++---- src/app/display-buffer.coffee | 5 +++-- src/app/range.coffee | 3 +++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index f1a0e54b0..b991e60cc 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -530,14 +530,22 @@ describe "DisplayBuffer", -> expect(displayBuffer.bufferPositionForScreenPosition([9, 2])).toEqual [12, 2] describe ".destroyFoldsContainingBufferRow(row)", -> - describe "when two folds start on the given buffer row", -> - it "destroys both folds", -> + it "destroys all folds containing the given row", -> displayBuffer.createFold(2, 4) displayBuffer.createFold(2, 6) + displayBuffer.createFold(7, 8) + displayBuffer.createFold(1, 9) + displayBuffer.createFold(11, 12) + + expect(displayBuffer.lineForRow(1).text).toBe '1' + expect(displayBuffer.lineForRow(2).text).toBe '10' - expect(displayBuffer.lineForRow(3).text).toBe '7' displayBuffer.destroyFoldsContainingBufferRow(2) - expect(displayBuffer.lineForRow(3).text).toBe '3' + expect(displayBuffer.lineForRow(1).text).toBe '1' + expect(displayBuffer.lineForRow(2).text).toBe '2' + expect(displayBuffer.lineForRow(7).fold).toBeDefined() + expect(displayBuffer.lineForRow(8).text).toMatch /^9-+/ + expect(displayBuffer.lineForRow(10).fold).toBeDefined() describe ".clipScreenPosition(screenPosition, wrapBeyondNewlines: false, wrapAtSoftNewlines: false, skipAtomicTokens: false)", -> beforeEach -> diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index fec398f56..22f96e8d7 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -108,8 +108,9 @@ class DisplayBuffer @trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true destroyFoldsContainingBufferRow: (bufferRow) -> - folds = @activeFolds[bufferRow] ? [] - fold.destroy() for fold in new Array(folds...) + for row, folds of @activeFolds + for fold in new Array(folds...) + fold.destroy() if fold.getBufferRange().containsRow(bufferRow) registerFold: (fold) -> @activeFolds[fold.startRow] ?= [] diff --git a/src/app/range.coffee b/src/app/range.coffee index 43ee43aa6..41f1136c7 100644 --- a/src/app/range.coffee +++ b/src/app/range.coffee @@ -50,6 +50,9 @@ class Range point = Point.fromObject(point) point.isGreaterThanOrEqual(@start) and point.isLessThanOrEqual(@end) + containsRow: (row) -> + @start.row <= row <= @end.row + union: (otherRange) -> start = if @start.isLessThan(otherRange.start) then @start else otherRange.start end = if @end.isGreaterThan(otherRange.end) then @end else otherRange.end From 8a2aa881f74363051db138ee1da4b214f5044217 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Thu, 14 Jun 2012 13:56:17 -0700 Subject: [PATCH 2/3] :lipstick: --- src/app/edit-session.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index bced1fb6a..7284fadc4 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -193,7 +193,7 @@ class EditSession destroyFoldsContainingBufferRow: (bufferRow) -> @displayBuffer.destroyFoldsContainingBufferRow(bufferRow) - unfoldCurrentRow: (row) -> + unfoldCurrentRow: -> @displayBuffer.largestFoldForBufferRow(@getLastCursor().getCurrentBufferRow())?.destroy() destroyFold: (foldId) -> From 9ada2daebd8ec3b150cbb008b00043f068daceb0 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Thu, 14 Jun 2012 14:00:35 -0700 Subject: [PATCH 3/3] If command panel selects text within a fold, the fold is destroyed --- spec/extensions/command-interpreter-spec.coffee | 14 +++++++++++++- src/app/editor.coffee | 1 + .../command-interpreter/composite-command.coffee | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spec/extensions/command-interpreter-spec.coffee b/spec/extensions/command-interpreter-spec.coffee index 056ff4da6..e68795ebe 100644 --- a/spec/extensions/command-interpreter-spec.coffee +++ b/spec/extensions/command-interpreter-spec.coffee @@ -232,4 +232,16 @@ describe "CommandInterpreter", -> interpreter.eval(editor, 's/current/foo/g') expect(buffer.lineForRow(5)).toBe ' foo = items.shift();' - expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(foo) : right.push(current);' \ No newline at end of file + expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(foo) : right.push(current);' + + describe "when command selects folded text", -> + it "unfolds lines that command selects", -> + editor.createFold(1, 9) + editor.createFold(5, 8) + editor.setSelectedBufferRange([[0,0], [0,0]]) + + interpreter.eval(editor, '/push/') + expect(editor.getSelection().getBufferRange()).toEqual [[6,29], [6,33]] + expect(editor.lineForScreenRow(1).fold).toBeUndefined() + expect(editor.lineForScreenRow(5).fold).toBeUndefined() + expect(editor.lineForScreenRow(6).text).toBe buffer.lineForRow(6) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 3c2fc9923..2f37d7c8a 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -217,6 +217,7 @@ class Editor extends View softWrapColumn ?= @calcSoftWrapColumn() @activeEditSession.setSoftWrapColumn(softWrapColumn) if softWrapColumn + lineForScreenRow: (screenRow) -> @activeEditSession.lineForScreenRow(screenRow) linesForScreenRows: (start, end) -> @activeEditSession.linesForScreenRows(start, end) screenLineCount: -> @activeEditSession.screenLineCount() maxScreenLineLength: -> @activeEditSession.maxScreenLineLength() diff --git a/src/extensions/command-interpreter/composite-command.coffee b/src/extensions/command-interpreter/composite-command.coffee index 4df55e351..0dc9ceed2 100644 --- a/src/extensions/command-interpreter/composite-command.coffee +++ b/src/extensions/command-interpreter/composite-command.coffee @@ -10,6 +10,11 @@ class CompositeCommand currentRanges = editor.getSelectionsOrderedByBufferPosition().map (selection) -> selection.getBufferRange() for currentRange in currentRanges newRanges.push(command.execute(editor, currentRange)...) + + for range in newRanges + for row in [range.start.row..range.end.row] + editor.destroyFoldsContainingBufferRow(row) + editor.setSelectedBufferRanges(newRanges) reverse: ->