Don't make hidden input a child of Editor's scrollView

If the input element is a child of the scroll view, then focusing it can end up changing the scroll position of the view behind our backs. We *only* want to scroll the view via our interface on editor, because a bunch of of special code needs to run when we scroll. We can't just have the browser scrolling that view around willy-nilly.
This commit is contained in:
Nathan Sobo 2012-11-07 19:46:34 -07:00
parent 1850da70e3
commit 312f64d200
4 changed files with 13 additions and 6 deletions

View File

@ -882,6 +882,12 @@ describe "Editor", ->
editor.selectAll() editor.selectAll()
expect(editor.scrollTop()).toBe 0 expect(editor.scrollTop()).toBe 0
# regression: does not scroll the scroll view when the editor is refocused
editor.hiddenInput.blur()
editor.hiddenInput.focus()
expect(editor.scrollTop()).toBe 0
expect(editor.scrollView.scrollTop()).toBe 0
# does auto-scroll when the selection is cleared # does auto-scroll when the selection is cleared
editor.moveCursorDown() editor.moveCursorDown()
expect(editor.scrollTop()).toBeGreaterThan(0) expect(editor.scrollTop()).toBeGreaterThan(0)

View File

@ -32,20 +32,18 @@ class CursorView extends View
super super
updateAppearance: (options={}) -> updateAppearance: (options={}) ->
autoscroll = options.autoscroll ? true
screenPosition = @getScreenPosition() screenPosition = @getScreenPosition()
pixelPosition = @getPixelPosition() pixelPosition = @getPixelPosition()
@css(pixelPosition) @css(pixelPosition)
@autoscroll() if @cursor.isLastCursor() and autoscroll
if @cursor == @editor.getLastCursor()
@autoscroll() if options.autoscroll ? true
@editor.hiddenInput.css(pixelPosition)
@setVisible(@cursor.isVisible() and not @editor.isFoldedAtScreenRow(screenPosition.row)) @setVisible(@cursor.isVisible() and not @editor.isFoldedAtScreenRow(screenPosition.row))
getPixelPosition: -> getPixelPosition: ->
@editor.pixelPositionForScreenPosition(@getScreenPosition()) @editor.pixelPositionForScreenPosition(@getScreenPosition())
autoscroll: -> autoscroll: ->
pixelPosition =
@editor.scrollTo(@getPixelPosition()) @editor.scrollTo(@getPixelPosition())
setVisible: (visible) -> setVisible: (visible) ->

View File

@ -49,6 +49,9 @@ class Cursor
isVisible: -> @visible isVisible: -> @visible
isLastCursor: ->
this == @editor.getLastCursor()
clearSelection: -> clearSelection: ->
if @selection if @selection
@selection.clear() unless @selection.retainSelection @selection.clear() unless @selection.retainSelection

View File

@ -18,9 +18,9 @@ class Editor extends View
@content: (params) -> @content: (params) ->
@div class: @classes(params), tabindex: -1, => @div class: @classes(params), tabindex: -1, =>
@subview 'gutter', new Gutter @subview 'gutter', new Gutter
@input class: 'hidden-input', outlet: 'hiddenInput'
@div class: 'scroll-view', outlet: 'scrollView', => @div class: 'scroll-view', outlet: 'scrollView', =>
@div class: 'lines', outlet: 'renderedLines', => @div class: 'lines', outlet: 'renderedLines', =>
@input class: 'hidden-input', outlet: 'hiddenInput'
@div class: 'vertical-scrollbar', outlet: 'verticalScrollbar', => @div class: 'vertical-scrollbar', outlet: 'verticalScrollbar', =>
@div outlet: 'verticalScrollbarContent' @div outlet: 'verticalScrollbarContent'