From d47a82f585eb677face93f8585709375f38b95b8 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 26 Nov 2012 16:59:43 -0700 Subject: [PATCH] Handle selection dragging when cursor goes off-screen --- spec/app/editor-spec.coffee | 20 +++++++++++++++++++- src/app/editor.coffee | 14 +++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 8f7f6f7d9..df5a40e99 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -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) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 73285250d..f0e1fb1fe 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -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()