From 7115b31286cded01f00713ea48342d372e7b47e4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 14:20:35 +0200 Subject: [PATCH] Fixes #47225 --- src/vs/editor/browser/core/editorState.ts | 30 +++++++++++++++++++ .../editor/browser/widget/diffEditorWidget.ts | 14 +++++++-- .../contrib/codelens/codelensController.ts | 18 ++--------- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/vs/editor/browser/core/editorState.ts b/src/vs/editor/browser/core/editorState.ts index 06bfc99b35a..c3da7dace30 100644 --- a/src/vs/editor/browser/core/editorState.ts +++ b/src/vs/editor/browser/core/editorState.ts @@ -71,3 +71,33 @@ export class EditorState { return this._equals(new EditorState(editor, this.flags)); } } + +export class StableEditorScrollState { + + public static capture(editor: ICodeEditor): StableEditorScrollState { + let visiblePosition: Position = null; + let visiblePositionScrollDelta = 0; + if (editor.getScrollTop() !== 0) { + const visibleRanges = editor.getVisibleRanges(); + if (visibleRanges.length > 0) { + visiblePosition = visibleRanges[0].getStartPosition(); + const visiblePositionScrollTop = editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); + visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop; + } + } + return new StableEditorScrollState(visiblePosition, visiblePositionScrollDelta); + } + + constructor( + private readonly _visiblePosition: Position, + private readonly _visiblePositionScrollDelta: number + ) { + } + + public restore(editor: ICodeEditor): void { + if (this._visiblePosition) { + const visiblePositionScrollTop = editor.getTopForPosition(this._visiblePosition.lineNumber, this._visiblePosition.column); + editor.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta); + } + } +} diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index fd92e00b778..4eb32cd0085 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -43,6 +43,7 @@ import URI from 'vs/base/common/uri'; import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { IModelDeltaDecoration, IModelDecorationsChangeAccessor, ITextModel } from 'vs/editor/common/model'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; interface IEditorDiffDecorations { decorations: IModelDeltaDecoration[]; @@ -102,7 +103,10 @@ class VisualEditorState { this._decorations = editor.deltaDecorations(this._decorations, []); } - public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones): void { + public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones, restoreScrollState: boolean): void { + + const scrollState = restoreScrollState ? StableEditorScrollState.capture(editor) : null; + // view zones editor.changeViewZones((viewChangeAccessor: editorBrowser.IViewZoneChangeAccessor) => { for (let i = 0, length = this._zones.length; i < length; i++) { @@ -118,6 +122,10 @@ class VisualEditorState { } }); + if (scrollState) { + scrollState.restore(editor); + } + // decorations this._decorations = editor.deltaDecorations(this._decorations, newDecorations.decorations); @@ -916,8 +924,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE try { this._currentlyChangingViewZones = true; - this._originalEditorState.apply(this.originalEditor, this._originalOverviewRuler, diffDecorations.original); - this._modifiedEditorState.apply(this.modifiedEditor, this._modifiedOverviewRuler, diffDecorations.modified); + this._originalEditorState.apply(this.originalEditor, this._originalOverviewRuler, diffDecorations.original, false); + this._modifiedEditorState.apply(this.modifiedEditor, this._modifiedOverviewRuler, diffDecorations.modified, true); } finally { this._currentlyChangingViewZones = false; } diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/codelensController.ts index 1c714b60884..901348a1e27 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/codelensController.ts @@ -10,7 +10,6 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { Position } from 'vs/editor/common/core/position'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { CodeLensProviderRegistry, ICodeLensSymbol } from 'vs/editor/common/modes'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; @@ -20,6 +19,7 @@ import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOption import { CodeLens, CodeLensHelper } from 'vs/editor/contrib/codelens/codelensWidget'; import { IModelDecorationsChangeAccessor } from 'vs/editor/common/model'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; export class CodeLensContribution implements editorCommon.IEditorContribution { @@ -219,16 +219,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { } } - let visiblePosition: Position = null; - let visiblePositionScrollDelta = 0; - if (this._editor.getScrollTop() !== 0) { - const visibleRanges = this._editor.getVisibleRanges(); - if (visibleRanges.length > 0) { - visiblePosition = visibleRanges[0].getStartPosition(); - const visiblePositionScrollTop = this._editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); - visiblePositionScrollDelta = this._editor.getScrollTop() - visiblePositionScrollTop; - } - } + const scrollState = StableEditorScrollState.capture(this._editor); this._editor.changeDecorations((changeAccessor) => { this._editor.changeViewZones((accessor) => { @@ -270,10 +261,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { }); }); - if (visiblePosition) { - const visiblePositionScrollTop = this._editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); - this._editor.setScrollTop(visiblePositionScrollTop + visiblePositionScrollDelta); - } + scrollState.restore(this._editor); } private _onViewportChanged(): void { -- GitLab