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
This commit is contained in:
Johannes Rieken
2023-01-09 15:48:16 +01:00
committed by GitHub
parent c1f4c0c2bc
commit 67fd9d1051
3 changed files with 25 additions and 11 deletions
@@ -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);
}
}
@@ -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<BreadcrumbsModel>();
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([])));
@@ -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();
}