提交 4140affe 编写于 作者: J Johannes Rieken

breadcrumbs picker must restore view state when being dismissed

上级 7cc87833
......@@ -13,9 +13,7 @@ import { combinedDisposable, DisposableStore, toDisposable } from 'vs/base/commo
import { extUri } from 'vs/base/common/resources';
import { URI } from 'vs/base/common/uri';
import 'vs/css!./media/breadcrumbscontrol';
import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser';
import { Range } from 'vs/editor/common/core/range';
import { ICodeEditorViewState } from 'vs/editor/common/editorCommon';
import { OutlineElement, OutlineModel } from 'vs/editor/contrib/documentSymbols/outlineModel';
import { localize } from 'vs/nls';
import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions';
......@@ -313,7 +311,7 @@ export class BreadcrumbsControl {
this._breadcrumbsDisposables.add({
dispose: () => {
if (this._breadcrumbsPickerShowing) {
this._contextViewService.hideContextView(this);
this._contextViewService.hideContextView({ source: this });
}
}
});
......@@ -321,20 +319,6 @@ export class BreadcrumbsControl {
return true;
}
private _getActiveCodeEditor(): ICodeEditor | undefined {
if (!this._editorGroup.activeEditorPane) {
return undefined;
}
let control = this._editorGroup.activeEditorPane.getControl();
let editor: ICodeEditor | undefined;
if (isCodeEditor(control)) {
editor = control as ICodeEditor;
} else if (isDiffEditor(control)) {
editor = control.getModifiedEditor();
}
return editor;
}
private _onFocusEvent(event: IBreadcrumbsItemEvent): void {
if (event.item && this._breadcrumbsPickerShowing) {
this._breadcrumbsPickerIgnoreOnceItem = undefined;
......@@ -381,9 +365,8 @@ export class BreadcrumbsControl {
// show picker
let picker: BreadcrumbsPicker;
let pickerAnchor: { x: number; y: number };
let editor = this._getActiveCodeEditor();
let editorDecorations: string[] = [];
let editorViewState: ICodeEditorViewState | undefined;
interface IHideData { didPick?: boolean, source?: BreadcrumbsControl }
this._contextViewService.showContextView({
render: (parent: HTMLElement) => {
......@@ -393,13 +376,13 @@ export class BreadcrumbsControl {
picker = this._instantiationService.createInstance(BreadcrumbsOutlinePicker, parent, event.item.model.resource);
}
let selectListener = picker.onDidPickElement(() => this._contextViewService.hideContextView(this));
let zoomListener = onDidChangeZoomLevel(() => this._contextViewService.hideContextView(this));
let selectListener = picker.onDidPickElement(() => this._contextViewService.hideContextView({ source: this, didPick: true }));
let zoomListener = onDidChangeZoomLevel(() => this._contextViewService.hideContextView({ source: this }));
let focusTracker = dom.trackFocus(parent);
let blurListener = focusTracker.onDidBlur(() => {
this._breadcrumbsPickerIgnoreOnceItem = this._widget.isDOMFocused() ? event.item : undefined;
this._contextViewService.hideContextView(this);
this._contextViewService.hideContextView({ source: this });
});
this._breadcrumbsPickerShowing = true;
......@@ -446,16 +429,13 @@ export class BreadcrumbsControl {
}
return pickerAnchor;
},
onHide: (data) => {
if (editor) {
editor.deltaDecorations(editorDecorations, []);
if (editorViewState) {
editor.restoreViewState(editorViewState);
}
onHide: (data?: IHideData) => {
if (!data?.didPick) {
picker.restoreViewState();
}
this._breadcrumbsPickerShowing = false;
this._updateCkBreadcrumbsActive();
if (data === this) {
if (data?.source === this) {
this._widget.setFocused(undefined);
this._widget.setSelection(undefined);
}
......
......@@ -149,6 +149,8 @@ export abstract class BreadcrumbsPicker {
this._tree.layout(treeHeight, this._layoutInfo.width);
}
restoreViewState(): void { }
protected abstract _setInput(element: FileElement | OutlineElement2): Promise<void>;
protected abstract _createTree(container: HTMLElement, input: any): Tree<any, any>;
protected abstract _previewElement(element: any): IDisposable;
......@@ -493,6 +495,9 @@ export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker {
protected _setInput(input: OutlineElement2): Promise<void> {
const viewState = input.outline.captureViewState();
this.restoreViewState = () => { viewState.dispose(); };
const tree = this._tree as WorkbenchDataTree<IOutline<any>, any, FuzzyScore>;
tree.setInput(input.outline);
......
......@@ -265,10 +265,7 @@ class DocumentSymbolsOutline implements IOutline<DocumentSymbolItem> {
if (!(entry instanceof OutlineElement)) {
return Disposable.None;
}
// todo@jrieken
// if (!editorViewState) {
// editorViewState = withNullAsUndefined(editor.saveViewState());
// }
const { symbol } = entry;
this._editor.revealRangeInCenterIfOutsideViewport(symbol.range, ScrollType.Smooth);
const ids = this._editor.deltaDecorations([], [{
......@@ -281,6 +278,15 @@ class DocumentSymbolsOutline implements IOutline<DocumentSymbolItem> {
return toDisposable(() => this._editor.deltaDecorations(ids, []));
}
captureViewState(): IDisposable {
const viewState = this._editor.saveViewState();
return toDisposable(() => {
if (viewState) {
this._editor.restoreViewState(viewState);
}
});
}
private async _createOutline(contentChangeEvent?: IModelContentChangedEvent): Promise<void> {
this._outlineDisposables.clear();
......
......@@ -482,9 +482,17 @@ class NotebookCellOutline implements IOutline<OutlineEntry> {
}
getParent(_entry: OutlineEntry): OutlineEntry | undefined {
return undefined;
captureViewState(): IDisposable {
const widget = this._editor.getControl();
let viewState = widget?.getEditorViewState();
return toDisposable(() => {
if (viewState) {
widget?.restoreListViewState(viewState);
}
});
}
}
class NotebookOutlineCreator implements IOutlineCreator<NotebookEditor, OutlineEntry> {
......
......@@ -82,5 +82,6 @@ export interface IOutline<E> {
reveal(entry: E, options: IEditorOptions, sideBySide: boolean): Promise<void> | void;
preview(entry: E): IDisposable;
captureViewState(): IDisposable;
dispose(): void;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册