From 67fd9d10519006d7d2ab34ebfce1a6edd5acebf2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Jan 2023 15:48:16 +0100 Subject: [PATCH] joh/breadcrumb reveal (#170863) * don't reveal negative indexes * don't update breadcrumbs on each and every file system registration fixes https://github.com/microsoft/vscode/issues/169875 --- .../ui/breadcrumbs/breadcrumbsWidget.ts | 20 +++++++++++-------- .../parts/editor/breadcrumbsControl.ts | 10 ++++++++-- .../browser/parts/editor/titleControl.ts | 6 +++++- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts index 8cb667d9e90..1e0ca66532f 100644 --- a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts +++ b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts @@ -235,15 +235,19 @@ export class BreadcrumbsWidget { } private _reveal(nth: number, minimal: boolean): void { + if (nth < 0 || nth >= this._nodes.length) { + return; + } const node = this._nodes[nth]; - if (node) { - const { width } = this._scrollable.getScrollDimensions(); - const { scrollLeft } = this._scrollable.getScrollPosition(); - if (!minimal || node.offsetLeft > scrollLeft + width || node.offsetLeft < scrollLeft) { - this._scrollable.setRevealOnScroll(false); - this._scrollable.setScrollPosition({ scrollLeft: node.offsetLeft }); - this._scrollable.setRevealOnScroll(true); - } + if (!node) { + return; + } + const { width } = this._scrollable.getScrollDimensions(); + const { scrollLeft } = this._scrollable.getScrollPosition(); + if (!minimal || node.offsetLeft > scrollLeft + width || node.offsetLeft < scrollLeft) { + this._scrollable.setRevealOnScroll(false); + this._scrollable.setScrollPosition({ scrollLeft: node.offsetLeft }); + this._scrollable.setRevealOnScroll(true); } } diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 9ebfbf652ae..79d341b32d0 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -9,7 +9,7 @@ import { BreadcrumbsItem, BreadcrumbsWidget, IBreadcrumbsItemEvent, IBreadcrumbs import { tail } from 'vs/base/common/arrays'; import { timeout } from 'vs/base/common/async'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { combinedDisposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { extUri } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/breadcrumbscontrol'; @@ -181,6 +181,7 @@ export class BreadcrumbsControl { private readonly _disposables = new DisposableStore(); private readonly _breadcrumbsDisposables = new DisposableStore(); private readonly _labels: ResourceLabels; + private readonly _model = new MutableDisposable(); private _breadcrumbsPickerShowing = false; private _breadcrumbsPickerIgnoreOnceItem: BreadcrumbsItem | undefined; @@ -236,6 +237,10 @@ export class BreadcrumbsControl { this.domNode.remove(); } + get model(): BreadcrumbsModel | undefined { + return this._model.value; + } + layout(dim: dom.Dimension | undefined): void { this._widget.layout(dim); } @@ -284,6 +289,7 @@ export class BreadcrumbsControl { fileInfoUri ?? uri, this._editorGroup.activeEditorPane ); + this._model.value = model; this.domNode.classList.toggle('backslash-path', this._labelService.getSeparator(uri.scheme, uri.authority) === '\\'); @@ -317,7 +323,7 @@ export class BreadcrumbsControl { updateBreadcrumbs(); this._breadcrumbsDisposables.clear(); this._breadcrumbsDisposables.add(listener); - this._breadcrumbsDisposables.add(model); + this._breadcrumbsDisposables.add(toDisposable(() => this._model.clear())); this._breadcrumbsDisposables.add(configListener); this._breadcrumbsDisposables.add(toDisposable(() => this._widget.setItems([]))); diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 82cbfbb3b87..e65a0e6ed30 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -165,7 +165,11 @@ export abstract class TitleControl extends Themable { this.breadcrumbsControl = this.instantiationService.createInstance(BreadcrumbsControl, container, options, this.group); } - this._register(this.fileService.onDidChangeFileSystemProviderRegistrations(() => { + this._register(this.fileService.onDidChangeFileSystemProviderRegistrations(e => { + if (this.breadcrumbsControl?.model && this.breadcrumbsControl.model.resource.scheme !== e.scheme) { + // ignore if the scheme of the breadcrumbs resource is not affected + return; + } if (this.breadcrumbsControl?.update()) { this.handleBreadcrumbsEnablementChange(); }