From e53403718aaa6436e492f57ae6dff17b05dc4c78 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Sat, 2 Feb 2013 16:17:14 -0700 Subject: [PATCH] Tell marker head observers if a move was caused by a buffer change This is used by cursor to only autoscroll when the marker head is explicitly moved, so that passive movements caused by buffer insertions don't trigger autoscrolling. --- spec/app/buffer-spec.coffee | 8 ++++++-- spec/app/display-buffer-spec.coffee | 10 +++++----- src/app/buffer-marker.coffee | 6 +++--- src/app/cursor.coffee | 4 ++-- src/app/display-buffer.coffee | 6 +++--- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/spec/app/buffer-spec.coffee b/spec/app/buffer-spec.coffee index 8b20595fd..8a890ceb5 100644 --- a/spec/app/buffer-spec.coffee +++ b/spec/app/buffer-spec.coffee @@ -720,13 +720,17 @@ describe 'Buffer', -> beforeEach -> observeHandler = jasmine.createSpy("observeHandler") - it "calls the given callback whenever the marker's head position changes", -> + it "calls the given callback whenever the marker's head position changes with the position and whether or not the move was caused by a buffer change", -> marker = buffer.markRange([[4, 20], [4, 23]]) buffer.observeMarkerHeadPosition(marker, observeHandler) buffer.setMarkerHeadPosition(marker, [6, 2]) expect(observeHandler).toHaveBeenCalled() - expect(observeHandler.argsForCall[0][0]).toEqual [6, 2] + expect(observeHandler.argsForCall[0]).toEqual [[6, 2], false] + observeHandler.reset() + + buffer.insert([6, 0], '...') + expect(observeHandler.argsForCall[0]).toEqual [[6, 5], true] it "allows the observation subscription to be cancelled", -> marker = buffer.markRange([[4, 20], [4, 23]]) diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index d71bdf4a9..ec6799fbd 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -620,27 +620,27 @@ fdescribe "DisplayBuffer", -> observeHandler = jasmine.createSpy("observeHandler") describe ".observeMarkerHeadScreenPosition(marker, callback)", -> - it "calls the callback whenever the markers head's screen position changes", -> + it "calls the callback whenever the markers head's screen position changes with the new position and whether it was precipitated by a buffer change", -> marker = displayBuffer.markScreenRange([[5, 4], [5, 10]]) displayBuffer.observeMarkerHeadScreenPosition(marker, observeHandler) displayBuffer.setMarkerHeadScreenPosition(marker, [8, 20]) expect(observeHandler).toHaveBeenCalled() - expect(observeHandler.argsForCall[0][0]).toEqual [8, 20] + expect(observeHandler.argsForCall[0]).toEqual [[8, 20], false] observeHandler.reset() buffer.insert([11, 0], '...') expect(observeHandler).toHaveBeenCalled() - expect(observeHandler.argsForCall[0][0]).toEqual [8, 23] + expect(observeHandler.argsForCall[0]).toEqual [[8, 23], true] observeHandler.reset() displayBuffer.unfoldBufferRow(4) expect(observeHandler).toHaveBeenCalled() - expect(observeHandler.argsForCall[0][0]).toEqual [11, 23] + expect(observeHandler.argsForCall[0]).toEqual [[11, 23], false] observeHandler.reset() displayBuffer.foldBufferRow(4) expect(observeHandler).toHaveBeenCalled() - expect(observeHandler.argsForCall[0][0]).toEqual [8, 23] + expect(observeHandler.argsForCall[0]).toEqual [[8, 23], false] it "does not call the callback for screen changes that don't change the position of the marker", -> marker = displayBuffer.markScreenPosition([3, 4]) diff --git a/src/app/buffer-marker.coffee b/src/app/buffer-marker.coffee index f79cc5288..803595593 100644 --- a/src/app/buffer-marker.coffee +++ b/src/app/buffer-marker.coffee @@ -38,7 +38,7 @@ class BufferMarker setHeadPosition: (headPosition, options={}) -> @headPosition = Point.fromObject(headPosition) @headPosition = @buffer.clipPosition(@headPosition) if options.clip ? true - observer(@headPosition) for observer in @headPositionObservers + observer(@headPosition, !!options.bufferChanged) for observer in @headPositionObservers @headPosition setTailPosition: (tailPosition, options={}) -> @@ -81,8 +81,8 @@ class BufferMarker [@id] handleBufferChange: (bufferChange) -> - @setHeadPosition(@updatePosition(@headPosition, bufferChange, false), clip: false) - @setTailPosition(@updatePosition(@tailPosition, bufferChange, true), clip: false) if @tailPosition + @setHeadPosition(@updatePosition(@headPosition, bufferChange, false), clip: false, bufferChanged: true) + @setTailPosition(@updatePosition(@tailPosition, bufferChange, true), clip: false, bufferChanged: true) if @tailPosition updatePosition: (position, bufferChange, isFirstPoint) -> { oldRange, newRange } = bufferChange diff --git a/src/app/cursor.coffee b/src/app/cursor.coffee index b79a55574..0218c5fe7 100644 --- a/src/app/cursor.coffee +++ b/src/app/cursor.coffee @@ -12,8 +12,8 @@ class Cursor needsAutoscroll: null constructor: ({@editSession, @marker}) -> - @editSession.observeMarkerHeadScreenPosition @marker, (screenPosition) => - @needsAutoscroll ?= @isLastCursor() + @editSession.observeMarkerHeadScreenPosition @marker, (screenPosition, bufferChanged) => + @needsAutoscroll ?= @isLastCursor() and !bufferChanged @trigger 'moved', screenPosition @editSession.trigger 'cursor-moved', screenPosition @needsAutoscroll = true diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 1e50f2fc4..45f62c6a1 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -372,9 +372,9 @@ class DisplayBuffer @markerScreenPositionObservers[id] ?= { head: [], tail: [] } @cacheMarkerScreenPositions(id) unless @markerScreenPositions[id] @markerScreenPositionObservers[id].head.push(callback) - subscription = @buffer.observeMarkerHeadPosition id, (bufferPosition) => + subscription = @buffer.observeMarkerHeadPosition id, (bufferPosition, bufferChanged) => @cacheMarkerScreenPositions(id) - callback(@getMarkerHeadScreenPosition(id)) + callback(@getMarkerHeadScreenPosition(id), bufferChanged) cancel: => subscription.cancel() @@ -392,7 +392,7 @@ class DisplayBuffer currentHeadPosition = @getMarkerHeadScreenPosition(id) unless currentHeadPosition.isEqual(head) @cacheMarkerScreenPositions(id) - observer(currentHeadPosition) for observer in @markerScreenPositionObservers[id].head + observer(currentHeadPosition, false) for observer in @markerScreenPositionObservers[id].head destroy: -> @tokenizedBuffer.destroy()