Skip to content

Commit 12396ea

Browse files
committed
Fixes microsoft#40271: Compute visible line widths when restoring the scroll position
1 parent d7f82bd commit 12396ea

6 files changed

Lines changed: 25 additions & 5 deletions

File tree

src/vs/editor/browser/view/viewImpl.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,13 @@ export class View extends ViewEventHandler {
450450
this._scrollbar.delegateVerticalScrollbarMouseDown(browserEvent);
451451
}
452452

453+
public restoreState(scrollPosition: { scrollLeft: number; scrollTop: number; }): void {
454+
this._context.viewLayout.setScrollPositionNow({ scrollTop: scrollPosition.scrollTop });
455+
this._renderNow();
456+
this.viewLines.updateLineWidths();
457+
this._context.viewLayout.setScrollPositionNow({ scrollLeft: scrollPosition.scrollLeft });
458+
}
459+
453460
public getOffsetForColumn(modelLineNumber: number, modelColumn: number): number {
454461
let modelPosition = this._context.model.validateModelPosition({
455462
lineNumber: modelLineNumber,

src/vs/editor/browser/viewParts/lines/viewLines.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,10 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
455455

456456
// --- implementation
457457

458+
public updateLineWidths(): void {
459+
this._updateLineWidths(false);
460+
}
461+
458462
/**
459463
* Updates the max line width if it is fast to compute.
460464
* Returns true if all lines were taken into account.

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,16 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito
392392
viewEventBus.onKeyDown = (e) => this._onKeyDown.fire(e);
393393
}
394394

395+
public restoreViewState(s: editorCommon.ICodeEditorViewState): void {
396+
super.restoreViewState(s);
397+
if (!this.cursor || !this.hasView) {
398+
return;
399+
}
400+
if (s && s.cursorState && s.viewState) {
401+
this._view.restoreState(this.viewModel.viewLayout.reduceRestoreState(s.viewState));
402+
}
403+
}
404+
395405
protected _detachModel(): editorCommon.IModel {
396406
let removeDomNode: HTMLElement = null;
397407

src/vs/editor/common/commonCodeEditor.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,6 @@ export abstract class CommonCodeEditor extends Disposable {
651651
// Backwards compatibility
652652
this.cursor.restoreState([<editorCommon.ICursorState>cursorState]);
653653
}
654-
this.viewModel.viewLayout.restoreState(codeEditorState.viewState);
655654

656655
let contributionsState = s.contributionsState || {};
657656
let keys = Object.keys(this._contributions);

src/vs/editor/common/viewLayout/viewLayout.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,15 +175,15 @@ export class ViewLayout extends Disposable implements IViewLayout {
175175
};
176176
}
177177

178-
public restoreState(state: editorCommon.IViewState): void {
178+
public reduceRestoreState(state: editorCommon.IViewState): { scrollLeft: number; scrollTop: number; } {
179179
let restoreScrollTop = state.scrollTop;
180180
if (typeof state.scrollTopWithoutViewZones === 'number' && !this._linesLayout.hasWhitespace()) {
181181
restoreScrollTop = state.scrollTopWithoutViewZones;
182182
}
183-
this.scrollable.setScrollPositionNow({
183+
return {
184184
scrollLeft: state.scrollLeft,
185185
scrollTop: restoreScrollTop
186-
});
186+
};
187187
}
188188

189189
// ---- IVerticalLayoutProvider

src/vs/editor/common/viewModel/viewModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export interface IViewLayout {
6363
getWhitespaces(): IEditorWhitespace[];
6464

6565
saveState(): IViewState;
66-
restoreState(state: IViewState): void;
66+
reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number; };
6767

6868
isAfterLines(verticalOffset: number): boolean;
6969
getLineNumberAtVerticalOffset(verticalOffset: number): number;

0 commit comments

Comments
 (0)