提交 adb07509 编写于 作者: R Rob Lourens

Persist focused notebook cell, dom focus on load

上级 12e7d78c
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
import { IListEvent, IListMouseEvent } from 'vs/base/browser/ui/list/list'; import { IListEvent, IListMouseEvent } from 'vs/base/browser/ui/list/list';
import { IListOptions, IListStyles } from 'vs/base/browser/ui/list/listWidget'; import { IListOptions, IListStyles, List } from 'vs/base/browser/ui/list/listWidget';
import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar';
import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar';
import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { CancellationTokenSource } from 'vs/base/common/cancellation';
...@@ -341,6 +341,11 @@ export interface INotebookCellList { ...@@ -341,6 +341,11 @@ export interface INotebookCellList {
updateOptions(options: IListOptions<ICellViewModel>): void; updateOptions(options: IListOptions<ICellViewModel>): void;
layout(height?: number, width?: number): void; layout(height?: number, width?: number): void;
dispose(): void; dispose(): void;
// TODO resolve differences between List<CellViewModel> and INotebookCellList<ICellViewModel>
getFocus(): number[];
setFocus(indexes: number[]): void;
setSelection(indexes: number[]): void;
} }
export interface BaseCellRenderTemplate { export interface BaseCellRenderTemplate {
......
...@@ -312,6 +312,7 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor { ...@@ -312,6 +312,7 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
focus() { focus() {
super.focus(); super.focus();
this.editorFocus?.set(true); this.editorFocus?.set(true);
this.list?.domFocus();
} }
async setInput(input: NotebookEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise<void> { async setInput(input: NotebookEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise<void> {
...@@ -431,6 +432,10 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor { ...@@ -431,6 +432,10 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
this.list!.layout(); this.list!.layout();
this.restoreTextEditorViewState(viewState);
}
private restoreTextEditorViewState(viewState: INotebookEditorViewState | undefined): void {
if (viewState?.scrollPosition !== undefined) { if (viewState?.scrollPosition !== undefined) {
this.list!.scrollTop = viewState!.scrollPosition.top; this.list!.scrollTop = viewState!.scrollPosition.top;
this.list!.scrollLeft = viewState!.scrollPosition.left; this.list!.scrollLeft = viewState!.scrollPosition.left;
...@@ -438,6 +443,12 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor { ...@@ -438,6 +443,12 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
this.list!.scrollTop = 0; this.list!.scrollTop = 0;
this.list!.scrollLeft = 0; this.list!.scrollLeft = 0;
} }
if (typeof viewState?.focus === 'number') {
this.list!.setFocus([viewState.focus]);
} else {
this.list!.setFocus([0]);
}
} }
private saveTextEditorViewState(input: NotebookEditorInput): void { private saveTextEditorViewState(input: NotebookEditorInput): void {
...@@ -456,6 +467,11 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor { ...@@ -456,6 +467,11 @@ export class NotebookEditor extends BaseEditor implements INotebookEditor {
} }
state.cellTotalHeights = cellHeights; state.cellTotalHeights = cellHeights;
const focus = this.list.getFocus()[0];
if (focus) {
state.focus = focus;
}
} }
this.editorMemento.saveEditorState(this.group, input.resource, state); this.editorMemento.saveEditorState(this.group, input.resource, state);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
import * as DOM from 'vs/base/browser/dom'; import * as DOM from 'vs/base/browser/dom';
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
import { IListRenderer, IListVirtualDelegate, ListError } from 'vs/base/browser/ui/list/list'; import { IListRenderer, IListVirtualDelegate, ListError } from 'vs/base/browser/ui/list/list';
import { IListStyles, IStyleController, MouseController } from 'vs/base/browser/ui/list/listWidget'; import { IListStyles, IStyleController, MouseController, IListOptions } from 'vs/base/browser/ui/list/listWidget';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter, Event } from 'vs/base/common/event';
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
import { isMacintosh } from 'vs/base/common/platform'; import { isMacintosh } from 'vs/base/common/platform';
...@@ -120,7 +120,7 @@ export class NotebookCellList extends WorkbenchList<CellViewModel> implements ID ...@@ -120,7 +120,7 @@ export class NotebookCellList extends WorkbenchList<CellViewModel> implements ID
} }
protected createMouseController(): MouseController<CellViewModel> { protected createMouseController(_options: IListOptions<CellViewModel>): MouseController<CellViewModel> {
return new NotebookMouseController(this); return new NotebookMouseController(this);
} }
......
...@@ -33,6 +33,7 @@ export interface INotebookEditorViewState { ...@@ -33,6 +33,7 @@ export interface INotebookEditorViewState {
editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState | null }; editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState | null };
cellTotalHeights?: { [key: number]: number }; cellTotalHeights?: { [key: number]: number };
scrollPosition?: { left: number; top: number; }; scrollPosition?: { left: number; top: number; };
focus?: number;
} }
export interface ICellModelDecorations { export interface ICellModelDecorations {
...@@ -578,8 +579,8 @@ export class NotebookViewModel extends Disposable implements FoldingRegionDelega ...@@ -578,8 +579,8 @@ export class NotebookViewModel extends Disposable implements FoldingRegionDelega
} }
saveEditorViewState(): INotebookEditorViewState { saveEditorViewState(): INotebookEditorViewState {
const state: { [key: number]: boolean } = {}; const editingCells: { [key: number]: boolean } = {};
this._viewCells.filter(cell => cell.editState === CellEditState.Editing).forEach(cell => state[cell.model.handle] = true); this._viewCells.filter(cell => cell.editState === CellEditState.Editing).forEach(cell => editingCells[cell.model.handle] = true);
const editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState } = {}; const editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState } = {};
this._viewCells.map(cell => ({ handle: cell.model.handle, state: cell.saveEditorViewState() })).forEach(viewState => { this._viewCells.map(cell => ({ handle: cell.model.handle, state: cell.saveEditorViewState() })).forEach(viewState => {
if (viewState.state) { if (viewState.state) {
...@@ -588,8 +589,8 @@ export class NotebookViewModel extends Disposable implements FoldingRegionDelega ...@@ -588,8 +589,8 @@ export class NotebookViewModel extends Disposable implements FoldingRegionDelega
}); });
return { return {
editingCells: state, editingCells,
editorViewStates: editorViewStates editorViewStates
}; };
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册