WIP: can destroy folds. emits change events.

This commit is contained in:
Nathan Sobo
2012-02-22 14:02:51 -07:00
parent 3ba17d28e8
commit cf00753c9c
4 changed files with 116 additions and 12 deletions

View File

@@ -1,7 +1,9 @@
_ = require 'underscore'
Point = require 'point'
Range = require 'range'
LineMap = require 'line-map'
ScreenLineFragment = require 'screen-line-fragment'
_ = require 'underscore'
EventEmitter = require 'event-emitter'
module.exports =
class LineFolder
@@ -14,10 +16,44 @@ class LineFolder
@lineMap.insertAtBufferRow(0, @highlighter.screenLines)
fold: (bufferRange) ->
fold = new Fold(this, bufferRange)
@activeFolds[bufferRange.start.row] ?= []
@activeFolds[bufferRange.start.row].push(new Fold(this, bufferRange))
screenRange = @screenRangeForBufferRange(bufferRange)
@lineMap.replaceScreenRows(screenRange.start.row, screenRange.end.row, @renderScreenLine(screenRange.start.row))
@activeFolds[bufferRange.start.row].push(fold)
oldScreenRange = @expandScreenRangeToLineEnds(@screenRangeForBufferRange(bufferRange))
lineWithFold = @renderScreenLine(oldScreenRange.start.row)
@lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lineWithFold)
newScreenRange = oldScreenRange.copy()
newScreenRange.end = _.clone(newScreenRange.start)
for fragment in lineWithFold
newScreenRange.end.column += fragment.text.length
@trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange
fold
destroyFold: (fold) ->
bufferRange = fold.range
folds = @activeFolds[bufferRange.start.row]
foldIndex = folds.indexOf(fold)
folds[foldIndex..foldIndex] = []
startScreenRow = @screenRowForBufferRow(bufferRange.start.row)
oldScreenRange = new Range()
oldScreenRange.start.row = startScreenRow
oldScreenRange.end.row = startScreenRow
oldScreenRange.end.column = @lineMap.lineForScreenRow(startScreenRow).text.length
@lineMap.replaceScreenRow(startScreenRow, @renderScreenLinesForBufferRows(bufferRange.start.row, bufferRange.end.row))
newScreenRange = @expandScreenRangeToLineEnds(@screenRangeForBufferRange(bufferRange))
@trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange
renderScreenLinesForBufferRows: (start, end) ->
for row in [start..end]
@renderScreenLineForBufferRow(row)
renderScreenLine: (screenRow) ->
@renderScreenLineForBufferRow(@bufferRowForScreenRow(screenRow))
@@ -56,5 +92,15 @@ class LineFolder
screenRangeForBufferRange: (bufferRange) ->
@lineMap.screenRangeForBufferRange(bufferRange)
expandScreenRangeToLineEnds: (screenRange) ->
{ start, end } = screenRange
new Range([start.row, 0], [end.row, @lineMap.lineForScreenRow(end.row).text.length])
_.extend LineFolder.prototype, EventEmitter
class Fold
constructor: (@lineFolder, @range) ->
destroy: ->
@lineFolder.destroyFold(this)

View File

@@ -45,6 +45,10 @@ class LineMap
replaceBufferRows: (start, end, screenLines) ->
@spliceAtBufferRow(start, end - start + 1, screenLines)
replaceScreenRow: (row, screenLines) ->
@replaceScreenRows(row, row, screenLines)
replaceScreenRows: (start, end, screenLines) ->
@spliceAtScreenRow(start, end - start + 1, screenLines)

View File

@@ -25,14 +25,14 @@ class LineWrapper
oldBufferRange = e.oldRange
newBufferRange = e.newRange
oldScreenRange = @lineMap.screenRangeForBufferRange(@expandRangeToLineEnds(oldBufferRange))
oldScreenRange = @lineMap.screenRangeForBufferRange(@expandBufferRangeToLineEnds(oldBufferRange))
newScreenLines = @buildScreenLinesForBufferRows(newBufferRange.start.row, newBufferRange.end.row)
@lineMap.replaceBufferRows oldBufferRange.start.row, oldBufferRange.end.row, newScreenLines
newScreenRange = @lineMap.screenRangeForBufferRange(@expandRangeToLineEnds(newBufferRange))
newScreenRange = @lineMap.screenRangeForBufferRange(@expandBufferRangeToLineEnds(newBufferRange))
@trigger 'change', { oldRange: oldScreenRange, newRange: newScreenRange }
expandRangeToLineEnds: (bufferRange) ->
expandBufferRangeToLineEnds: (bufferRange) ->
{ start, end } = bufferRange
new Range([start.row, 0], [end.row, @lineMap.lineForBufferRow(end.row).text.length])