Editor subscribes to EditSession for screen line changes. Remove more movement logic from cursor view.

This commit is contained in:
Nathan Sobo
2012-06-07 16:31:40 -06:00
parent 58c8117e4e
commit f406786a3a
5 changed files with 35 additions and 25 deletions

View File

@@ -16,9 +16,14 @@ class CursorView extends View
initialize: (@cursor, @editor) ->
@anchor = new Anchor(@editor, cursor.getScreenPosition())
@selection = @editor.compositeSelection.addSelectionForCursor(this)
@cursor.on 'change-screen-position', (position, options) =>
options.fromModel = true
@setScreenPosition(position, options)
@updateAppearance()
unless options.bufferChange
@clearSelection()
@removeIdleClassTemporarily()
@trigger 'cursor-move', bufferChange: options.bufferChange
@cursor.on 'destroy', => @remove()
afterAttach: (onDom) ->
@@ -39,21 +44,17 @@ class CursorView extends View
@cursor.setBufferPosition(bufferPosition, options)
getScreenPosition: ->
@anchor.getScreenPosition()
@cursor.getScreenPosition()
setScreenPosition: (position, options={}) ->
if options.fromModel
@anchor.setScreenPosition(position, options)
@refreshScreenPosition()
@trigger 'cursor-move', bufferChange: options.bufferChange
@clearSelection() unless options.bufferChange
else
@cursor.setScreenPosition(position, options)
refreshScreenPosition: ->
@goalColumn = null
@updateAppearance()
removeIdleClassTemporarily: ->
@removeClass 'idle'
window.clearTimeout(@idleTimeout) if @idleTimeout
@idleTimeout = window.setTimeout (=> @addClass 'idle'), 200

View File

@@ -39,6 +39,10 @@ class Cursor
getBufferRow: ->
@getBufferPosition().row
refreshScreenPosition: ->
@anchor.refreshScreenPosition()
@trigger 'change-screen-position', @getScreenPosition(), bufferChange: false
handleBufferChange: (e) ->
@anchor.handleBufferChange(e)
@trigger 'change-screen-position', @getScreenPosition(), bufferChange: true

View File

@@ -31,9 +31,14 @@ class EditSession
@buffer.on "change.edit-session-#{@id}", (e) =>
@moveCursors (cursor) -> cursor.handleBufferChange(e)
@renderer.on "change.edit-session-#{@id}", (e) =>
@trigger 'screen-lines-change', e
@moveCursors (cursor) -> cursor.refreshScreenPosition() unless e.bufferChanged
destroy: ->
@renderer.destroy()
@buffer.off ".edit-session-#{@id}"
@renderer.off ".edit-session-#{@id}"
@renderer.destroy()
serialize: ->
buffer: @buffer.serialize()

View File

@@ -233,6 +233,7 @@ class Editor extends View
@setSoftWrapColumn() if @softWrap
@prepareForScrolling()
@setScrollPositionFromActiveEditSession() # this also renders the visible lines
@activeEditSession.on 'screen-lines-change', (e) => @handleRendererChange(e)
$(window).on "resize.editor#{@id}", => @updateRenderedLines()
@focus() if @isFocused
@trigger 'editor-open', [this]
@@ -321,17 +322,6 @@ class Editor extends View
setBuffer: (buffer) ->
@activateEditSessionForBuffer(buffer)
setRenderer: (renderer) ->
@renderer?.off()
@renderer = renderer
@renderer.on 'change', (e) => @handleRendererChange(e)
@unsubscribeFromBuffer() if @buffer
@buffer = renderer.buffer
@buffer.on "path-change.editor#{@id}", => @trigger 'editor-path-change'
@buffer.on "change.editor#{@id}", (e) => @handleBufferChange(e)
@trigger 'editor-path-change'
activateEditSessionForBuffer: (buffer) ->
index = @editSessionIndexForBuffer(buffer)
unless index?
@@ -373,11 +363,19 @@ class Editor extends View
@activeEditSession = @editSessions[index]
@activeEditSessionIndex = index
@setRenderer(@activeEditSession.getRenderer())
@unsubscribeFromBuffer() if @buffer
@buffer = @activeEditSession.buffer
@buffer.on "path-change.editor#{@id}", => @trigger 'editor-path-change'
@buffer.on "change.editor#{@id}", (e) => @handleBufferChange(e)
@trigger 'editor-path-change'
@renderer = @activeEditSession.renderer
if @attached
@prepareForScrolling()
@setScrollPositionFromActiveEditSession()
@renderLines()
@activeEditSession.on 'screen-lines-change', (e) => @handleRendererChange(e)
for cursor in @activeEditSession.getCursors()
@compositeCursor.addCursorView(cursor)
@@ -495,8 +493,6 @@ class Editor extends View
@lastRenderedScreenRow = maxEndRow
@updatePaddingOfRenderedLines()
@compositeCursor.updateBufferPosition() unless e.bufferChanged
buildLineElements: (startRow, endRow) ->
charWidth = @charWidth
charHeight = @charHeight

View File

@@ -32,8 +32,7 @@ class Anchor
else
@bufferPosition = Point.fromObject(position)
screenPosition = @editSession.screenPositionForBufferPosition(@bufferPosition, options)
@setScreenPosition(screenPosition, clip: false, assignBufferPosition: false)
@refreshScreenPosition(options)
getScreenPosition: ->
@screenPosition
@@ -48,3 +47,8 @@ class Anchor
Object.freeze @screenPosition
Object.freeze @bufferPosition
refreshScreenPosition: (options) ->
screenPosition = @editSession.screenPositionForBufferPosition(@bufferPosition, options)
@setScreenPosition(screenPosition, clip: false, assignBufferPosition: false)