Renderer indicates when a screen line starts a foldable region

This commit is contained in:
Corey Johnson & Nathan Sobo
2012-05-30 12:27:01 -06:00
parent e6f3112aea
commit 8a77a740f5
6 changed files with 53 additions and 2 deletions

View File

@@ -0,0 +1,6 @@
module.exports =
class AceFoldAdaptor
constructor: (@buffer) ->
getLine: (bufferRow) ->
@buffer.lineForRow(bufferRow)

View File

@@ -0,0 +1,10 @@
AceFoldAdaptor = require 'ace-fold-adaptor'
module.exports =
class FoldSuggester
constructor: (@buffer) ->
@aceFoldMode = @buffer.getMode().foldingRules
@aceFoldAdaptor = new AceFoldAdaptor(@buffer)
isBufferRowFoldable: (bufferRow) ->
@aceFoldMode.getFoldWidget(@aceFoldAdaptor, null, bufferRow) == "start"

View File

@@ -1,5 +1,6 @@
_ = require 'underscore'
Highlighter = require 'highlighter'
FoldSuggester = require 'fold-suggester'
LineMap = require 'line-map'
Point = require 'point'
EventEmitter = require 'event-emitter'
@@ -22,6 +23,7 @@ class Renderer
constructor: (@buffer, options={}) ->
@id = @constructor.idCounter++
@highlighter = new Highlighter(@buffer, options.tabText ? ' ')
@foldSuggester = new FoldSuggester(@buffer)
@maxLineLength = options.maxLineLength ? Infinity
@activeFolds = {}
@foldsById = {}
@@ -161,6 +163,7 @@ class Renderer
startBufferColumn = 0
while currentBufferRow <= endBufferRow
screenLine = @highlighter.lineForRow(currentBufferRow)
screenLine.foldable = @foldSuggester.isBufferRowFoldable(currentBufferRow)
if fold = @largestFoldForBufferRow(currentBufferRow)
screenLine = screenLine.copy()

View File

@@ -8,6 +8,7 @@ class ScreenLineFragment
tokens: null
screenDelta: null
bufferDelta: null
foldable: null
constructor: (@tokens, @text, screenDelta, bufferDelta, extraFields) ->
@screenDelta = Point.fromObject(screenDelta)
@@ -15,7 +16,7 @@ class ScreenLineFragment
_.extend(this, extraFields)
copy: ->
new ScreenLineFragment(@tokens, @text, @screenDelta, @bufferDelta, { @state })
new ScreenLineFragment(@tokens, @text, @screenDelta, @bufferDelta, { @state, @foldable })
splitAt: (column) ->
return [new ScreenLineFragment([], '', [0, 0], [0, 0]), this] if column == 0
@@ -36,7 +37,7 @@ class ScreenLineFragment
[leftScreenDelta, rightScreenDelta] = @screenDelta.splitAt(column)
[leftBufferDelta, rightBufferDelta] = @bufferDelta.splitAt(column)
leftFragment = new ScreenLineFragment(leftTokens, leftText, leftScreenDelta, leftBufferDelta, {@state})
leftFragment = new ScreenLineFragment(leftTokens, leftText, leftScreenDelta, leftBufferDelta, {@state, @foldable})
rightFragment = new ScreenLineFragment(rightTokens, rightText, rightScreenDelta, rightBufferDelta, {@state})
[leftFragment, rightFragment]