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