Skip to content

Commit 298b3bb

Browse files
committed
show "no elements" for empty breadcrumb case, microsoft#56327
1 parent e385305 commit 298b3bb

File tree

5 files changed

+31
-5
lines changed

5 files changed

+31
-5
lines changed

src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
height: 100%;
2525
outline: none;
2626
}
27+
.monaco-breadcrumbs.disabled .monaco-breadcrumb-item {
28+
cursor: default;
29+
}
2730

2831
.monaco-breadcrumbs .monaco-breadcrumb-item .codicon-breadcrumb-separator {
2932
color: inherit;

src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export class BreadcrumbsWidget {
5656
private readonly _nodes = new Array<HTMLDivElement>();
5757
private readonly _freeNodes = new Array<HTMLDivElement>();
5858

59+
private _enabled: boolean = true;
5960
private _focusedItemIdx: number = -1;
6061
private _selectedItemIdx: number = -1;
6162

@@ -155,13 +156,18 @@ export class BreadcrumbsWidget {
155156
content += `.monaco-breadcrumbs .monaco-breadcrumb-item.focused.selected { color: ${style.breadcrumbsFocusAndSelectionForeground}}\n`;
156157
}
157158
if (style.breadcrumbsHoverForeground) {
158-
content += `.monaco-breadcrumbs .monaco-breadcrumb-item:hover:not(.focused):not(.selected) { color: ${style.breadcrumbsHoverForeground}}\n`;
159+
content += `.monaco-breadcrumbs:not(.disabled ) .monaco-breadcrumb-item:hover:not(.focused):not(.selected) { color: ${style.breadcrumbsHoverForeground}}\n`;
159160
}
160161
if (this._styleElement.innerText !== content) {
161162
this._styleElement.innerText = content;
162163
}
163164
}
164165

166+
setEnabled(value: boolean) {
167+
this._enabled = value;
168+
this._domNode.classList.toggle('disabled', !this._enabled);
169+
}
170+
165171
domFocus(): void {
166172
let idx = this._focusedItemIdx >= 0 ? this._focusedItemIdx : this._items.length - 1;
167173
if (idx >= 0 && idx < this._items.length) {
@@ -326,6 +332,9 @@ export class BreadcrumbsWidget {
326332
}
327333

328334
private _onClick(event: IMouseEvent): void {
335+
if (!this._enabled) {
336+
return;
337+
}
329338
for (let el: HTMLElement | null = event.target; el; el = el.parentElement) {
330339
let idx = this._nodes.indexOf(el as HTMLDivElement);
331340
if (idx >= 0) {

src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ export interface IBreadcrumbsControlOptions {
147147
showSymbolIcons: boolean;
148148
showDecorationColors: boolean;
149149
breadcrumbsBackground: ColorIdentifier | ColorFunction;
150+
showPlaceholder: boolean;
150151
}
151152

152153
export class BreadcrumbsControl {
@@ -288,8 +289,21 @@ export class BreadcrumbsControl {
288289
showSymbolIcons: this._options.showSymbolIcons && showIcons
289290
};
290291
const items = model.getElements().map(element => element instanceof FileElement ? new FileItem(model, element, options, this._instantiationService) : new OutlineItem(model, element, options));
291-
this._widget.setItems(items);
292-
this._widget.reveal(items[items.length - 1]);
292+
if (items.length === 0) {
293+
this._widget.setEnabled(false);
294+
this._widget.setItems([new class extends BreadcrumbsItem {
295+
render(container: HTMLElement): void {
296+
container.innerText = localize('empty', "no elements");
297+
}
298+
equals(other: BreadcrumbsItem): boolean {
299+
return other === this;
300+
}
301+
}]);
302+
} else {
303+
this._widget.setEnabled(true);
304+
this._widget.setItems(items);
305+
this._widget.reveal(items[items.length - 1]);
306+
}
293307
};
294308
const listener = model.onDidUpdate(updateBreadcrumbs);
295309
const configListener = this._cfShowIcons.onDidChange(updateBreadcrumbs);

src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export class NoTabsTitleControl extends TitleControl {
5050
this._register(addDisposableListener(this.editorLabel.element, EventType.CLICK, e => this.onTitleLabelClick(e)));
5151

5252
// Breadcrumbs
53-
this.createBreadcrumbsControl(labelContainer, { showFileIcons: false, showSymbolIcons: true, showDecorationColors: false, breadcrumbsBackground: () => Color.transparent });
53+
this.createBreadcrumbsControl(labelContainer, { showFileIcons: false, showSymbolIcons: true, showDecorationColors: false, breadcrumbsBackground: () => Color.transparent, showPlaceholder: false });
5454
titleContainer.classList.toggle('breadcrumbs', Boolean(this.breadcrumbsControl));
5555
this._register(toDisposable(() => titleContainer.classList.remove('breadcrumbs'))); // important to remove because the container is a shared dom node
5656

src/vs/workbench/browser/parts/editor/tabsTitleControl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ export class TabsTitleControl extends TitleControl {
166166
const breadcrumbsContainer = document.createElement('div');
167167
breadcrumbsContainer.classList.add('tabs-breadcrumbs');
168168
this.titleContainer.appendChild(breadcrumbsContainer);
169-
this.createBreadcrumbsControl(breadcrumbsContainer, { showFileIcons: true, showSymbolIcons: true, showDecorationColors: false, breadcrumbsBackground: breadcrumbsBackground });
169+
this.createBreadcrumbsControl(breadcrumbsContainer, { showFileIcons: true, showSymbolIcons: true, showDecorationColors: false, showPlaceholder: true, breadcrumbsBackground: breadcrumbsBackground });
170170
}
171171

172172
private createTabsScrollbar(scrollable: HTMLElement): ScrollableElement {

0 commit comments

Comments
 (0)