Skip to content

Commit 7115b31

Browse files
committed
1 parent e572ffc commit 7115b31

3 files changed

Lines changed: 44 additions & 18 deletions

File tree

src/vs/editor/browser/core/editorState.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,33 @@ export class EditorState {
7171
return this._equals(new EditorState(editor, this.flags));
7272
}
7373
}
74+
75+
export class StableEditorScrollState {
76+
77+
public static capture(editor: ICodeEditor): StableEditorScrollState {
78+
let visiblePosition: Position = null;
79+
let visiblePositionScrollDelta = 0;
80+
if (editor.getScrollTop() !== 0) {
81+
const visibleRanges = editor.getVisibleRanges();
82+
if (visibleRanges.length > 0) {
83+
visiblePosition = visibleRanges[0].getStartPosition();
84+
const visiblePositionScrollTop = editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column);
85+
visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop;
86+
}
87+
}
88+
return new StableEditorScrollState(visiblePosition, visiblePositionScrollDelta);
89+
}
90+
91+
constructor(
92+
private readonly _visiblePosition: Position,
93+
private readonly _visiblePositionScrollDelta: number
94+
) {
95+
}
96+
97+
public restore(editor: ICodeEditor): void {
98+
if (this._visiblePosition) {
99+
const visiblePositionScrollTop = editor.getTopForPosition(this._visiblePosition.lineNumber, this._visiblePosition.column);
100+
editor.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta);
101+
}
102+
}
103+
}

src/vs/editor/browser/widget/diffEditorWidget.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import URI from 'vs/base/common/uri';
4343
import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder';
4444
import { IModelDeltaDecoration, IModelDecorationsChangeAccessor, ITextModel } from 'vs/editor/common/model';
4545
import { INotificationService } from 'vs/platform/notification/common/notification';
46+
import { StableEditorScrollState } from 'vs/editor/browser/core/editorState';
4647

4748
interface IEditorDiffDecorations {
4849
decorations: IModelDeltaDecoration[];
@@ -102,7 +103,10 @@ class VisualEditorState {
102103
this._decorations = editor.deltaDecorations(this._decorations, []);
103104
}
104105

105-
public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones): void {
106+
public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones, restoreScrollState: boolean): void {
107+
108+
const scrollState = restoreScrollState ? StableEditorScrollState.capture(editor) : null;
109+
106110
// view zones
107111
editor.changeViewZones((viewChangeAccessor: editorBrowser.IViewZoneChangeAccessor) => {
108112
for (let i = 0, length = this._zones.length; i < length; i++) {
@@ -118,6 +122,10 @@ class VisualEditorState {
118122
}
119123
});
120124

125+
if (scrollState) {
126+
scrollState.restore(editor);
127+
}
128+
121129
// decorations
122130
this._decorations = editor.deltaDecorations(this._decorations, newDecorations.decorations);
123131

@@ -916,8 +924,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE
916924

917925
try {
918926
this._currentlyChangingViewZones = true;
919-
this._originalEditorState.apply(this.originalEditor, this._originalOverviewRuler, diffDecorations.original);
920-
this._modifiedEditorState.apply(this.modifiedEditor, this._modifiedOverviewRuler, diffDecorations.modified);
927+
this._originalEditorState.apply(this.originalEditor, this._originalOverviewRuler, diffDecorations.original, false);
928+
this._modifiedEditorState.apply(this.modifiedEditor, this._modifiedOverviewRuler, diffDecorations.modified, true);
921929
} finally {
922930
this._currentlyChangingViewZones = false;
923931
}

src/vs/editor/contrib/codelens/codelensController.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { onUnexpectedError } from 'vs/base/common/errors';
1010
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
1111
import { TPromise } from 'vs/base/common/winjs.base';
1212
import { ICommandService } from 'vs/platform/commands/common/commands';
13-
import { Position } from 'vs/editor/common/core/position';
1413
import * as editorCommon from 'vs/editor/common/editorCommon';
1514
import { CodeLensProviderRegistry, ICodeLensSymbol } from 'vs/editor/common/modes';
1615
import * as editorBrowser from 'vs/editor/browser/editorBrowser';
@@ -20,6 +19,7 @@ import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOption
2019
import { CodeLens, CodeLensHelper } from 'vs/editor/contrib/codelens/codelensWidget';
2120
import { IModelDecorationsChangeAccessor } from 'vs/editor/common/model';
2221
import { INotificationService } from 'vs/platform/notification/common/notification';
22+
import { StableEditorScrollState } from 'vs/editor/browser/core/editorState';
2323

2424
export class CodeLensContribution implements editorCommon.IEditorContribution {
2525

@@ -219,16 +219,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution {
219219
}
220220
}
221221

222-
let visiblePosition: Position = null;
223-
let visiblePositionScrollDelta = 0;
224-
if (this._editor.getScrollTop() !== 0) {
225-
const visibleRanges = this._editor.getVisibleRanges();
226-
if (visibleRanges.length > 0) {
227-
visiblePosition = visibleRanges[0].getStartPosition();
228-
const visiblePositionScrollTop = this._editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column);
229-
visiblePositionScrollDelta = this._editor.getScrollTop() - visiblePositionScrollTop;
230-
}
231-
}
222+
const scrollState = StableEditorScrollState.capture(this._editor);
232223

233224
this._editor.changeDecorations((changeAccessor) => {
234225
this._editor.changeViewZones((accessor) => {
@@ -270,10 +261,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution {
270261
});
271262
});
272263

273-
if (visiblePosition) {
274-
const visiblePositionScrollTop = this._editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column);
275-
this._editor.setScrollTop(visiblePositionScrollTop + visiblePositionScrollDelta);
276-
}
264+
scrollState.restore(this._editor);
277265
}
278266

279267
private _onViewportChanged(): void {

0 commit comments

Comments
 (0)