When folds are selected they are highlighted

This commit is contained in:
Corey Johnson & Nathan Sobo 2012-05-24 16:39:14 -07:00
parent c11ee74405
commit f8c3d89e60
6 changed files with 75 additions and 5 deletions

View File

@ -2460,6 +2460,39 @@ describe "Editor", ->
expect(editor.getCursorBufferPosition()).toEqual [3, 0]
describe "when a selection starts/stops intersecting a fold", ->
it "adds/removes the 'selected' class to the fold's line element", ->
editor.createFold(2, 4)
editor.setSelectionBufferRange([[1, 0], [2, 0]], reverse: true)
expect(editor.lineElementForScreenRow(2)).toMatchSelector('.fold.selected')
editor.setSelectionBufferRange([[1, 0], [1, 1]])
expect(editor.lineElementForScreenRow(2)).not.toMatchSelector('.fold.selected')
editor.setSelectionBufferRange([[1, 0], [5, 0]])
expect(editor.lineElementForScreenRow(2)).toMatchSelector('.fold.selected')
editor.setCursorScreenPosition([3,0])
expect(editor.lineElementForScreenRow(2)).not.toMatchSelector('.fold.selected')
editor.setCursorScreenPosition([2,0])
expect(editor.lineElementForScreenRow(2)).toMatchSelector('.fold.selected')
describe "when a selected fold is scrolled into view (and the fold line was not previously rendered)", ->
it "renders the fold's line element with the 'selected' class", ->
setEditorHeightInLines(editor, 5)
editor.createFold(2, 4)
editor.setSelectionBufferRange([[1, 0], [5, 0]])
expect(editor.visibleLines.find('.fold.selected')).toExist()
editor.scrollToBottom()
expect(editor.visibleLines.find('.fold.selected')).not.toExist()
editor.scrollTop(0)
expect(editor.lineElementForScreenRow(2)).toMatchSelector('.fold.selected')
describe "editor-path-change event", ->
it "emits event when buffer's path is changed", ->
editor = new Editor

View File

@ -74,6 +74,10 @@ class CompositeSeleciton
getText: ->
@getLastSelection().getText()
intersectsBufferRange: (bufferRange) ->
_.any @getSelections(), (selection) ->
selection.intersectsBufferRange(bufferRange)
expandSelectionsForward: (fn) ->
fn(selection) for selection in @getSelections()
@mergeIntersectingSelections()

View File

@ -62,6 +62,7 @@ class Editor extends View
requireStylesheet 'theme/twilight.css'
@id = Editor.idCounter++
@lineCache = []
@bindKeys()
@autoIndent = true
@buildCursorAndSelection()
@ -335,13 +336,25 @@ class Editor extends View
getLastVisibleScreenRow: ->
Math.ceil((@scrollTop() + @scrollView.height()) / @lineHeight) - 1
highlightSelectedFolds: ->
screenLines = @screenLinesForRows(@firstRenderedScreenRow, @lastRenderedScreenRow)
for screenLine, i in screenLines
if fold = screenLine.fold
screenRow = @firstRenderedScreenRow + i
element = @lineElementForScreenRow(screenRow)
if @compositeSelection.intersectsBufferRange(fold.getBufferRange())
element.addClass('selected')
else
element.removeClass('selected')
getScreenLines: ->
@renderer.getLines()
screenLineForRow: (start) ->
@renderer.lineForRow(start)
linesForRows: (start, end) ->
screenLinesForRows: (start, end) ->
@renderer.linesForRows(start, end)
screenLineCount: ->
@ -468,11 +481,14 @@ class Editor extends View
charWidth = @charWidth
charHeight = @charHeight
lines = @renderer.linesForRows(startRow, endRow)
compositeSelection = @compositeSelection
$$ ->
for line in lines
if fold = line.fold
lineAttributes = { class: 'fold line', 'fold-id': fold.id }
if compositeSelection.intersectsBufferRange(fold.getBufferRange())
lineAttributes.class += ' selected'
else
lineAttributes = { class: 'line' }
@div lineAttributes, =>
@ -514,8 +530,9 @@ class Editor extends View
elementsToReplace.forEach (element) =>
lines.removeChild(element)
getLineElement: (row) ->
@lineCache[row]
lineElementForScreenRow: (screenRow) ->
element = @lineCache[screenRow - @firstRenderedScreenRow]
$(element)
toggleSoftWrap: ->
@setSoftWrap(not @softWrap)
@ -747,6 +764,9 @@ class Editor extends View
@scrollVertically(pixelPosition)
@scrollHorizontally(pixelPosition)
scrollToBottom: ->
@scrollBottom(@scrollView.prop('scrollHeight'))
scrollVertically: (pixelPosition) ->
linesInView = @scrollView.height() / @lineHeight
maxScrollMargin = Math.floor((linesInView - 1) / 2)

View File

@ -18,6 +18,9 @@ class Fold
inspect: ->
"Fold(#{@startRow}, #{@endRow})"
getBufferRange: ->
new Range([@startRow, 0], [@endRow, Infinity])
getBufferDelta: ->
new Point(@endRow - @startRow + 1, 0)

View File

@ -45,6 +45,8 @@ class Selection extends View
@clearRegions()
range = @getScreenRange()
@editor.highlightSelectedFolds()
return if range.isEmpty()
rowSpan = range.end.row - range.start.row
@ -57,6 +59,7 @@ class Selection extends View
@appendRegion(rowSpan - 1, { row: range.start.row + 1, column: 0}, null)
@appendRegion(1, { row: range.end.row, column: 0 }, range.end)
appendRegion: (rows, start, end) ->
{ lineHeight, charWidth } = @editor
css = @editor.pixelPositionForScreenPosition(start)
@ -80,8 +83,7 @@ class Selection extends View
else
new Range(@cursor.getScreenPosition(), @cursor.getScreenPosition())
setScreenRange: (range, options={}) ->
{ reverse } = options
setScreenRange: (range, {reverse}={}) ->
{ start, end } = range
[start, end] = [end, start] if reverse
@ -97,6 +99,9 @@ class Selection extends View
getText: ->
@editor.buffer.getTextInRange @getBufferRange()
intersectsBufferRange: (bufferRange) ->
@getBufferRange().intersectsWith(bufferRange)
insertText: (text) ->
{ text, shouldOutdent } = @autoIndentText(text)
oldBufferRange = @getBufferRange()

View File

@ -74,6 +74,11 @@ color:#D2A8A1;
color: #969696;
}
.fold.selected {
background-color: #82715C;
color: #969696;
}
.support.function {
color:#DAD085;
}