diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index ecb3c0d89f4..86f4775bc2f 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2255,5 +2255,17 @@ declare module 'vscode' { } + //#endregion + + //#region https://github.com/microsoft/vscode/issues/105667 + + export interface TreeView { + /** + * An optional human-readable description that will be rendered in the title of the view. + * Setting the title description to null, undefined, or empty string will remove the title description from the view. + */ + titleDescription?: string | undefined; + } + //#endregion } diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index 3d62a4a9e89..a0430755b1d 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -86,12 +86,13 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie } } - $setTitle(treeViewId: string, title: string): void { - this.logService.trace('MainThreadTreeViews#$setTitle', treeViewId, title); + $setTitle(treeViewId: string, title: string, titleDescription: string | undefined): void { + this.logService.trace('MainThreadTreeViews#$setTitle', treeViewId, title, titleDescription); const viewer = this.getTreeView(treeViewId); if (viewer) { viewer.title = title; + viewer.titleDescription = titleDescription; } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index b6d085fc7ad..8d9856c7040 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -288,7 +288,7 @@ export interface MainThreadTreeViewsShape extends IDisposable { $refresh(treeViewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem; }): Promise; $reveal(treeViewId: string, treeItem: ITreeItem, parentChain: ITreeItem[], options: IRevealOptions): Promise; $setMessage(treeViewId: string, message: string): void; - $setTitle(treeViewId: string, title: string): void; + $setTitle(treeViewId: string, title: string, titleDescription: string | undefined): void; } export interface MainThreadDownloadServiceShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 8621743e706..813bcbc8263 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -101,6 +101,14 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { set title(title: string) { treeView.title = title; }, + get titleDescription() { + checkProposedApiEnabled(extension); + return treeView.titleDescription; + }, + set titleDescription(titleDescription: string | undefined) { + checkProposedApiEnabled(extension); + treeView.titleDescription = titleDescription; + }, reveal: (element: T, options?: IRevealOptions): Promise => { return treeView.reveal(element, options); }, @@ -318,7 +326,17 @@ class ExtHostTreeView extends Disposable { set title(title: string) { this._title = title; - this.proxy.$setTitle(this.viewId, title); + this.proxy.$setTitle(this.viewId, title, this._titleDescription); + } + + private _titleDescription: string | undefined; + get titleDescription(): string | undefined { + return this._titleDescription; + } + + set titleDescription(titleDescription: string | undefined) { + this._titleDescription = titleDescription; + this.proxy.$setTitle(this.viewId, this._title, titleDescription); } setExpanded(treeItemHandle: TreeItemHandle, expanded: boolean): void { diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 6077addea83..dc4116973b5 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -39,6 +39,7 @@ export class TreeViewPane extends ViewPane { this.treeView = treeView; this._register(this.treeView.onDidChangeActions(() => this.updateActions(), this)); this._register(this.treeView.onDidChangeTitle((newTitle) => this.updateTitle(newTitle))); + this._register(this.treeView.onDidChangeTitleDescription((newTitleDescription) => this.updateTitleDescription(newTitleDescription))); this._register(toDisposable(() => this.treeView.setVisibility(false))); this._register(this.onDidChangeBodyVisibility(() => this.updateTreeVisibility())); this._register(this.treeView.onDidChangeWelcomeState(() => this._onDidChangeViewWelcomeState.fire())); diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index e50bd99f313..8951daa7984 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -554,6 +554,8 @@ export interface ITreeView extends IDisposable { title: string; + titleDescription: string | undefined; + readonly visible: boolean; readonly onDidExpandItem: Event; @@ -568,6 +570,8 @@ export interface ITreeView extends IDisposable { readonly onDidChangeTitle: Event; + readonly onDidChangeTitleDescription: Event; + readonly onDidChangeWelcomeState: Event; refresh(treeItems?: ITreeItem[]): Promise; diff --git a/src/vs/workbench/contrib/views/browser/treeView.ts b/src/vs/workbench/contrib/views/browser/treeView.ts index 89b629fc0c6..bb149747841 100644 --- a/src/vs/workbench/contrib/views/browser/treeView.ts +++ b/src/vs/workbench/contrib/views/browser/treeView.ts @@ -100,6 +100,9 @@ export class TreeView extends Disposable implements ITreeView { private readonly _onDidChangeTitle: Emitter = this._register(new Emitter()); readonly onDidChangeTitle: Event = this._onDidChangeTitle.event; + private readonly _onDidChangeTitleDescription: Emitter = this._register(new Emitter()); + readonly onDidChangeTitleDescription: Event = this._onDidChangeTitleDescription.event; + private readonly _onDidCompleteRefresh: Emitter = this._register(new Emitter()); constructor( @@ -220,6 +223,16 @@ export class TreeView extends Disposable implements ITreeView { this._onDidChangeTitle.fire(this._title); } + private _titleDescription: string | undefined; + get titleDescription(): string | undefined { + return this._titleDescription; + } + + set titleDescription(description: string | undefined) { + this._titleDescription = description; + this._onDidChangeTitleDescription.fire(this._titleDescription); + } + get canSelectMany(): boolean { return this._canSelectMany; }