diff --git a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts index dbb0f558d46f7852ce31d92fb8a0f6f5af69deb0..489581f1233537448a319b70eb4abe1219722e24 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts @@ -137,7 +137,7 @@ export class GotoSymbolQuickAccessProvider extends AbstractGotoSymbolQuickAccess picker.busy = true; - provider.provideTableOfContents(pane, cts.token).then(entries => { + provider.provideTableOfContents(pane, { disposables }, cts.token).then(entries => { picker.busy = false; @@ -256,7 +256,8 @@ export interface ITableOfContentsEntry { } export interface ITableOfContentsProvider { - provideTableOfContents(editor: T, token: CancellationToken): Promise; + + provideTableOfContents(editor: T, context: { disposables: DisposableStore }, token: CancellationToken): Promise; } class ProviderRegistry { diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts b/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts index fda732869c5301802d7dd2020c5e0cdedb529b80..5eb8a01929e2f13b6f59ffc7e453f86e3fb21265 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/toc/tocProvider.ts @@ -7,14 +7,28 @@ import { TableOfContentsProviderRegistry, ITableOfContentsProvider, ITableOfCont import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { Codicon } from 'vs/base/common/codicons'; +import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; TableOfContentsProviderRegistry.register(NotebookEditor.ID, new class implements ITableOfContentsProvider { - async provideTableOfContents(editor: NotebookEditor) { + async provideTableOfContents(editor: NotebookEditor, context: { disposables: DisposableStore }) { if (!editor.viewModel) { return undefined; } // return an entry per markdown header const notebookWidget = editor.getControl(); + if (!notebookWidget) { + return undefined; + } + + // restore initial view state when no item was picked + let didPickOne = false; + const viewState = notebookWidget.getEditorViewState(); + context.disposables.add(toDisposable(() => { + if (!didPickOne) { + notebookWidget.restoreListViewState(viewState); + } + })); + const result: ITableOfContentsEntry[] = []; for (const cell of editor.viewModel.viewCells) { const content = cell.getText(); @@ -29,13 +43,14 @@ TableOfContentsProviderRegistry.register(NotebookEditor.ID, new class implements icon: cell.cellKind === CellKind.Markdown ? Codicon.markdown : Codicon.code, label: matches[j].replace(/^[ \t]*(\#+)/, ''), pick() { - notebookWidget?.revealInCenterIfOutsideViewport(cell); - notebookWidget?.selectElement(cell); - notebookWidget?.focusNotebookCell(cell, cell.cellKind === CellKind.Markdown ? 'container' : 'editor'); + didPickOne = true; + notebookWidget.revealInCenterIfOutsideViewport(cell); + notebookWidget.selectElement(cell); + notebookWidget.focusNotebookCell(cell, cell.cellKind === CellKind.Markdown ? 'container' : 'editor'); }, preview() { - notebookWidget?.revealInCenterIfOutsideViewport(cell); - notebookWidget?.selectElement(cell); + notebookWidget.revealInCenterIfOutsideViewport(cell); + notebookWidget.selectElement(cell); } }); } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index e8545c22c11a005d6461acc2325bb170605daa92..911ff195bd8d423b8e092ab19bae133438a50165 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -395,7 +395,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this._detachModel(); await this._attachModel(textModel, viewState); } else { - this._restoreListViewState(viewState); + this.restoreListViewState(viewState); } // clear state @@ -632,10 +632,10 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this._dndController?.clearGlobalDragState(); // restore list state at last, it must be after list layout - this._restoreListViewState(viewState); + this.restoreListViewState(viewState); } - private _restoreListViewState(viewState: INotebookEditorViewState | undefined): void { + restoreListViewState(viewState: INotebookEditorViewState | undefined): void { if (viewState?.scrollPosition !== undefined) { this._list!.scrollTop = viewState!.scrollPosition.top; this._list!.scrollLeft = viewState!.scrollPosition.left;