mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-22 00:19:24 +03:00
WIP: Can place multiple cursors and insert text without newlines. Very broken.
This commit is contained in:
parent
9e91790ad3
commit
f431b24627
@ -756,6 +756,27 @@ describe "Editor", ->
|
||||
expect(range.end).toEqual({row: 5, column: 27})
|
||||
expect(editor.getCursorScreenPosition()).toEqual(row: 5, column: 27)
|
||||
|
||||
describe "multiple cursor placement", ->
|
||||
fit "places multiple cursor with meta-click", ->
|
||||
editor.attachToDom()
|
||||
editor.lines.trigger mousedownEvent(editor: editor, point: [3, 0])
|
||||
editor.lines.trigger mousedownEvent(editor: editor, point: [6, 0], metaKey: true)
|
||||
|
||||
[cursor1, cursor2] = editor.find('.cursor').map -> $(this).view()
|
||||
expect(cursor1.position()).toEqual(top: 3 * editor.lineHeight, left: 0)
|
||||
expect(cursor1.getBufferPosition()).toEqual [3, 0]
|
||||
expect(cursor2.position()).toEqual(top: 6 * editor.lineHeight, left: 0)
|
||||
expect(cursor2.getBufferPosition()).toEqual [6, 0]
|
||||
|
||||
fit "inserts text for all cursors", ->
|
||||
editor.setCursorScreenPosition([3, 0])
|
||||
editor.addCursorAtScreenPosition([6, 0])
|
||||
|
||||
editor.insertText("abc")
|
||||
|
||||
expect(editor.lineForBufferRow(3)).toBe "abc var pivot = items.shift(), current, left = [], right = [];"
|
||||
expect(editor.lineForBufferRow(6)).toBe "abc current < pivot ? left.push(current) : right.push(current);"
|
||||
|
||||
describe "buffer manipulation", ->
|
||||
describe "when text input events are triggered on the hidden input element", ->
|
||||
describe "when there is no selection", ->
|
||||
|
30
src/atom/composite-cursor.coffee
Normal file
30
src/atom/composite-cursor.coffee
Normal file
@ -0,0 +1,30 @@
|
||||
Cursor = require 'cursor'
|
||||
|
||||
module.exports =
|
||||
class CompositeCursor
|
||||
constructor: (@editor) ->
|
||||
@cursors = []
|
||||
@addCursor()
|
||||
|
||||
getCursors: ->
|
||||
@cursors
|
||||
|
||||
addCursor: ->
|
||||
cursor = new Cursor(@editor)
|
||||
@cursors.push(cursor)
|
||||
@editor.lines.append(cursor)
|
||||
@editor.addSelectionForCursor(cursor)
|
||||
cursor
|
||||
|
||||
addCursorAtScreenPosition: (screenPosition) ->
|
||||
cursor = @addCursor()
|
||||
cursor.setScreenPosition(screenPosition)
|
||||
|
||||
setScreenPosition: (screenPosition) ->
|
||||
cursor.setScreenPosition(screenPosition) for cursor in @cursors
|
||||
|
||||
getScreenPosition: ->
|
||||
@cursors[0].getScreenPosition()
|
||||
|
||||
handleBufferChange: (e) ->
|
||||
cursor.handleBufferChange(e) for cursor in @cursors
|
14
src/atom/composite-selection.coffee
Normal file
14
src/atom/composite-selection.coffee
Normal file
@ -0,0 +1,14 @@
|
||||
Selection = require 'selection'
|
||||
|
||||
module.exports =
|
||||
class CompositeSeleciton
|
||||
constructor: (@editor) ->
|
||||
@selections = []
|
||||
|
||||
addSelectionForCursor: (cursor) ->
|
||||
selection = new Selection({@editor, cursor})
|
||||
@selections.push(selection)
|
||||
@editor.lines.append(selection)
|
||||
|
||||
insertText: (text) ->
|
||||
selection.insertText(text) for selection in @selections
|
@ -12,10 +12,14 @@ class Cursor extends View
|
||||
bufferPosition: null
|
||||
|
||||
initialize: (@editor) ->
|
||||
@screenPosition = new Point(0, 0)
|
||||
@one 'attach', => @updateAppearance()
|
||||
|
||||
bufferChanged: (e) ->
|
||||
@setBufferPosition(e.newRange.end)
|
||||
handleBufferChange: (e) ->
|
||||
{ newRange, oldRange } = e
|
||||
if oldRange.end.row == newRange.end.row == @getBufferPosition().row
|
||||
delta = newRange.end.subtract(oldRange.end)
|
||||
@setBufferPosition(@getBufferPosition().add(delta))
|
||||
|
||||
setScreenPosition: (position, options={}) ->
|
||||
position = Point.fromObject(position)
|
||||
|
@ -1,12 +1,12 @@
|
||||
{View, $$} = require 'space-pen'
|
||||
AceOutdentAdaptor = require 'ace-outdent-adaptor'
|
||||
Buffer = require 'buffer'
|
||||
Cursor = require 'cursor'
|
||||
CompositeCursor = require 'composite-cursor'
|
||||
CompositeSelection = require 'composite-selection'
|
||||
Gutter = require 'gutter'
|
||||
Renderer = require 'renderer'
|
||||
Point = require 'point'
|
||||
Range = require 'range'
|
||||
Selection = require 'selection'
|
||||
EditSession = require 'edit-session'
|
||||
|
||||
$ = require 'jquery'
|
||||
@ -102,11 +102,14 @@ class Editor extends View
|
||||
@on 'close', => @remove(); false
|
||||
|
||||
buildCursorAndSelection: ->
|
||||
@cursor = new Cursor(this)
|
||||
@lines.append(@cursor)
|
||||
@compositeSelection = new CompositeSelection(this)
|
||||
@compositeCursor = new CompositeCursor(this)
|
||||
|
||||
@selection = new Selection(this)
|
||||
@lines.append(@selection)
|
||||
addCursorAtScreenPosition: (screenPosition) ->
|
||||
@compositeCursor.addCursorAtScreenPosition(screenPosition)
|
||||
|
||||
addSelectionForCursor: (cursor) ->
|
||||
@compositeSelection.addSelectionForCursor(cursor)
|
||||
|
||||
handleEvents: ->
|
||||
@on 'focus', =>
|
||||
@ -130,7 +133,11 @@ class Editor extends View
|
||||
clickCount = e.originalEvent.detail
|
||||
|
||||
if clickCount == 1
|
||||
@setCursorScreenPosition @screenPositionFromMouseEvent(e)
|
||||
screenPosition = @screenPositionFromMouseEvent(e)
|
||||
if e.metaKey
|
||||
@addCursorAtScreenPosition(screenPosition)
|
||||
else
|
||||
@setCursorScreenPosition(screenPosition)
|
||||
else if clickCount == 2
|
||||
@selection.selectWord()
|
||||
else if clickCount >= 3
|
||||
@ -142,7 +149,7 @@ class Editor extends View
|
||||
@insertText(e.originalEvent.data)
|
||||
|
||||
@on 'cursor:position-changed', =>
|
||||
position = @pixelPositionForScreenPosition(@cursor.getScreenPosition())
|
||||
position = @pixelPositionForScreenPosition(@getCursorScreenPosition())
|
||||
if @softWrap
|
||||
position.left = Math.min(position.left, @horizontalScroller.width() - @charWidth)
|
||||
@hiddenInput.css(position)
|
||||
@ -213,7 +220,7 @@ class Editor extends View
|
||||
@editSession.scrollLeft = @horizontalScroller.scrollLeft()
|
||||
|
||||
handleBufferChange: (e) ->
|
||||
@cursor.bufferChanged(e) if @isFocused
|
||||
@compositeCursor.handleBufferChange(e) if @isFocused
|
||||
|
||||
handleRendererChange: (e) ->
|
||||
{ oldRange, newRange } = e
|
||||
@ -349,8 +356,8 @@ class Editor extends View
|
||||
|
||||
getCurrentScreenLine: -> @buffer.lineForRow(@getCursorScreenRow())
|
||||
getCurrentBufferLine: -> @buffer.lineForRow(@getCursorBufferRow())
|
||||
setCursorScreenPosition: (position) -> @cursor.setScreenPosition(position)
|
||||
getCursorScreenPosition: -> @cursor.getScreenPosition()
|
||||
setCursorScreenPosition: (position) -> @compositeCursor.setScreenPosition(position)
|
||||
getCursorScreenPosition: -> @compositeCursor.getScreenPosition()
|
||||
setCursorBufferPosition: (position) -> @cursor.setBufferPosition(position)
|
||||
getCursorBufferPosition: -> @cursor.getBufferPosition()
|
||||
setCursorScreenRow: (row) -> @cursor.setScreenRow(row)
|
||||
@ -376,11 +383,12 @@ class Editor extends View
|
||||
getBufferLineLength: (row) -> @buffer.getLineLength(row)
|
||||
getTextInRange: (range) -> @buffer.getTextInRange(range)
|
||||
getEofPosition: -> @buffer.getEofPosition()
|
||||
lineForBufferRow: (row) -> @buffer.lineForRow(row)
|
||||
|
||||
insertText: (text) ->
|
||||
{ text, shouldOutdent } = @autoIndentText(text)
|
||||
@selection.insertText(text)
|
||||
@autoOutdentText() if shouldOutdent
|
||||
# { text, shouldOutdent } = @autoIndentText(text)
|
||||
@compositeSelection.insertText(text)
|
||||
# @autoOutdentText() if shouldOutdent
|
||||
|
||||
autoIndentText: (text) ->
|
||||
if @autoIndent
|
||||
|
@ -12,9 +12,8 @@ class Selection extends View
|
||||
modifyingSelection: null
|
||||
regions: null
|
||||
|
||||
initialize: (@editor) ->
|
||||
initialize: ({@editor, @cursor}) ->
|
||||
@regions = []
|
||||
@cursor = @editor.cursor
|
||||
@cursor.on 'cursor:position-changed', =>
|
||||
if @modifyingSelection
|
||||
@updateAppearance()
|
||||
|
Loading…
Reference in New Issue
Block a user