mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-20 15:37:46 +03:00
When folds are selected they are highlighted
This commit is contained in:
parent
c11ee74405
commit
f8c3d89e60
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -18,6 +18,9 @@ class Fold
|
||||
inspect: ->
|
||||
"Fold(#{@startRow}, #{@endRow})"
|
||||
|
||||
getBufferRange: ->
|
||||
new Range([@startRow, 0], [@endRow, Infinity])
|
||||
|
||||
getBufferDelta: ->
|
||||
new Point(@endRow - @startRow + 1, 0)
|
||||
|
||||
|
@ -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()
|
||||
|
@ -74,6 +74,11 @@ color:#D2A8A1;
|
||||
color: #969696;
|
||||
}
|
||||
|
||||
.fold.selected {
|
||||
background-color: #82715C;
|
||||
color: #969696;
|
||||
}
|
||||
|
||||
.support.function {
|
||||
color:#DAD085;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user