mirror of
https://github.com/atom/atom.git
synced 2026-01-24 06:18:03 -05:00
Handle selection dragging when cursor goes off-screen
This commit is contained in:
@@ -712,7 +712,7 @@ describe "Editor", ->
|
||||
editor.renderedLines.trigger mousedownEvent(editor: editor, point: [4, 10])
|
||||
|
||||
# moving changes selection
|
||||
editor.renderedLines.trigger mousemoveEvent(editor: editor, point: [5, 27])
|
||||
$(document).trigger mousemoveEvent(editor: editor, point: [5, 27])
|
||||
|
||||
range = editor.getSelection().getScreenRange()
|
||||
expect(range.start).toEqual({row: 4, column: 10})
|
||||
@@ -730,6 +730,24 @@ describe "Editor", ->
|
||||
expect(range.end).toEqual({row: 5, column: 27})
|
||||
expect(editor.getCursorScreenPosition()).toEqual(row: 5, column: 27)
|
||||
|
||||
it "selects and scrolls if the mouse is dragged outside of the editor itself", ->
|
||||
intervalFns = []
|
||||
editor.attachToDom(heightInLines: 5)
|
||||
editor.scrollToBottom()
|
||||
|
||||
spyOn(window, 'setInterval').andCallFake (fn) -> intervalFns.push(fn)
|
||||
# start
|
||||
editor.renderedLines.trigger mousedownEvent(editor: editor, point: [12, 0])
|
||||
|
||||
# moving changes selection
|
||||
$(document).trigger mousemoveEvent(editor: editor, pageX: 0, pageY: -10)
|
||||
expect(editor.scrollTop()).toBe 4 * editor.lineHeight
|
||||
|
||||
# if cursor stays off screen, we keep moving / scrolling up
|
||||
fn() for fn in intervalFns
|
||||
|
||||
expect(editor.scrollTop()).toBe 0
|
||||
|
||||
describe "double-click and drag", ->
|
||||
it "selects the word under the cursor, then continues to select by word in either direction as the mouse is dragged", ->
|
||||
expect(editor.getCursorScreenPosition()).toEqual(row: 0, column: 0)
|
||||
|
||||
@@ -358,10 +358,18 @@ class Editor extends View
|
||||
@gutter.addClass('drop-shadow')
|
||||
|
||||
selectOnMousemoveUntilMouseup: ->
|
||||
moveHandler = (e) => @selectToScreenPosition(@screenPositionFromMouseEvent(e))
|
||||
@on 'mousemove', moveHandler
|
||||
lastMoveEvent = null
|
||||
moveHandler = (event = lastMoveEvent) =>
|
||||
if event
|
||||
@selectToScreenPosition(@screenPositionFromMouseEvent(event))
|
||||
lastMoveEvent = event
|
||||
|
||||
$(document).on 'mousemove', moveHandler
|
||||
interval = setInterval(moveHandler, 20)
|
||||
|
||||
$(document).one 'mouseup', =>
|
||||
@off 'mousemove', moveHandler
|
||||
clearInterval(interval)
|
||||
$(document).off 'mousemove', moveHandler
|
||||
reverse = @activeEditSession.getLastSelection().isReversed()
|
||||
@activeEditSession.mergeIntersectingSelections({reverse})
|
||||
@activeEditSession.finalizeSelections()
|
||||
|
||||
Reference in New Issue
Block a user