From 12396ea083a23b2ef42e39afa1ad392bfe396cbd Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 19 Dec 2017 09:43:08 +0100 Subject: [PATCH] Fixes #40271: Compute visible line widths when restoring the scroll position --- src/vs/editor/browser/view/viewImpl.ts | 7 +++++++ src/vs/editor/browser/viewParts/lines/viewLines.ts | 4 ++++ src/vs/editor/browser/widget/codeEditorWidget.ts | 10 ++++++++++ src/vs/editor/common/commonCodeEditor.ts | 1 - src/vs/editor/common/viewLayout/viewLayout.ts | 6 +++--- src/vs/editor/common/viewModel/viewModel.ts | 2 +- 6 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index f67e5b4e7cc..54f9b156840 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -450,6 +450,13 @@ export class View extends ViewEventHandler { this._scrollbar.delegateVerticalScrollbarMouseDown(browserEvent); } + public restoreState(scrollPosition: { scrollLeft: number; scrollTop: number; }): void { + this._context.viewLayout.setScrollPositionNow({ scrollTop: scrollPosition.scrollTop }); + this._renderNow(); + this.viewLines.updateLineWidths(); + this._context.viewLayout.setScrollPositionNow({ scrollLeft: scrollPosition.scrollLeft }); + } + public getOffsetForColumn(modelLineNumber: number, modelColumn: number): number { let modelPosition = this._context.model.validateModelPosition({ lineNumber: modelLineNumber, diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index 762433ff412..c42f3e90d14 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -455,6 +455,10 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, // --- implementation + public updateLineWidths(): void { + this._updateLineWidths(false); + } + /** * Updates the max line width if it is fast to compute. * Returns true if all lines were taken into account. diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 52c8dd723d2..2cf42479c4d 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -392,6 +392,16 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito viewEventBus.onKeyDown = (e) => this._onKeyDown.fire(e); } + public restoreViewState(s: editorCommon.ICodeEditorViewState): void { + super.restoreViewState(s); + if (!this.cursor || !this.hasView) { + return; + } + if (s && s.cursorState && s.viewState) { + this._view.restoreState(this.viewModel.viewLayout.reduceRestoreState(s.viewState)); + } + } + protected _detachModel(): editorCommon.IModel { let removeDomNode: HTMLElement = null; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 7fe5a0d5435..d5ad94f8041 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -651,7 +651,6 @@ export abstract class CommonCodeEditor extends Disposable { // Backwards compatibility this.cursor.restoreState([cursorState]); } - this.viewModel.viewLayout.restoreState(codeEditorState.viewState); let contributionsState = s.contributionsState || {}; let keys = Object.keys(this._contributions); diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index a0802b952e2..86b9a615782 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -175,15 +175,15 @@ export class ViewLayout extends Disposable implements IViewLayout { }; } - public restoreState(state: editorCommon.IViewState): void { + public reduceRestoreState(state: editorCommon.IViewState): { scrollLeft: number; scrollTop: number; } { let restoreScrollTop = state.scrollTop; if (typeof state.scrollTopWithoutViewZones === 'number' && !this._linesLayout.hasWhitespace()) { restoreScrollTop = state.scrollTopWithoutViewZones; } - this.scrollable.setScrollPositionNow({ + return { scrollLeft: state.scrollLeft, scrollTop: restoreScrollTop - }); + }; } // ---- IVerticalLayoutProvider diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 6512796ee93..2e4d3b111ee 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -63,7 +63,7 @@ export interface IViewLayout { getWhitespaces(): IEditorWhitespace[]; saveState(): IViewState; - restoreState(state: IViewState): void; + reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number; }; isAfterLines(verticalOffset: number): boolean; getLineNumberAtVerticalOffset(verticalOffset: number): number; -- GitLab