Skip to content

Commit 3646465

Browse files
authored
update EH side status bar info as new extensions are registered (#183309)
#167874
1 parent 73fcc6b commit 3646465

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/vs/workbench/api/browser/mainThreadStatusBar.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Command } from 'vs/editor/common/languages';
1111
import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility';
1212
import { IMarkdownString } from 'vs/base/common/htmlContent';
1313
import { IExtensionStatusBarItemService } from 'vs/workbench/api/browser/statusBarExtensionPoint';
14-
import { StatusbarAlignment } from 'vs/workbench/services/statusbar/browser/statusbar';
14+
import { IStatusbarEntry, StatusbarAlignment } from 'vs/workbench/services/statusbar/browser/statusbar';
1515

1616
@extHostNamedCustomer(MainContext.MainThreadStatusBar)
1717
export class MainThreadStatusBar implements MainThreadStatusBarShape {
@@ -27,17 +27,27 @@ export class MainThreadStatusBar implements MainThreadStatusBarShape {
2727
// once, at startup read existing items and send them over
2828
const entries: StatusBarItemDto[] = [];
2929
for (const [entryId, item] of statusbarService.getEntries()) {
30-
entries.push({
30+
entries.push(asDto(entryId, item));
31+
}
32+
33+
proxy.$acceptStaticEntries(entries);
34+
35+
statusbarService.onDidChange(e => {
36+
if (e.added) {
37+
proxy.$acceptStaticEntries([asDto(e.added[0], e.added[1])]);
38+
}
39+
});
40+
41+
function asDto(entryId: string, item: { entry: IStatusbarEntry; alignment: StatusbarAlignment; priority: number }): StatusBarItemDto {
42+
return {
3143
entryId,
3244
name: item.entry.name,
3345
text: item.entry.text,
3446
command: typeof item.entry.command === 'string' ? item.entry.command : undefined,
3547
priority: item.priority,
3648
alignLeft: item.alignment === StatusbarAlignment.LEFT
37-
});
49+
};
3850
}
39-
40-
proxy.$acceptStaticEntries(entries);
4151
}
4252

4353
dispose(): void {

src/vs/workbench/api/browser/statusBarExtensionPoint.ts

+23-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { IAccessibilityInformation } from 'vs/platform/accessibility/common/acce
1616
import { IMarkdownString } from 'vs/base/common/htmlContent';
1717
import { getCodiconAriaLabel } from 'vs/base/common/iconLabels';
1818
import { hash } from 'vs/base/common/hash';
19+
import { Event, Emitter } from 'vs/base/common/event';
1920
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
2021
import { Iterable } from 'vs/base/common/iterator';
2122
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
@@ -27,16 +28,24 @@ import { asStatusBarItemIdentifier } from 'vs/workbench/api/common/extHostTypes'
2728
export const IExtensionStatusBarItemService = createDecorator<IExtensionStatusBarItemService>('IExtensionStatusBarItemService');
2829

2930
export interface IExtensionStatusBarItemChangeEvent {
30-
readonly added?: Readonly<{ entryId: string } & IStatusbarEntry>;
31+
readonly added?: ExtensionStatusBarEntry;
3132
readonly removed?: string;
3233
}
3334

35+
export type ExtensionStatusBarEntry = [string, {
36+
entry: IStatusbarEntry;
37+
alignment: MainThreadStatusBarAlignment;
38+
priority: number;
39+
}];
40+
3441
export interface IExtensionStatusBarItemService {
3542
readonly _serviceBrand: undefined;
3643

44+
onDidChange: Event<IExtensionStatusBarItemChangeEvent>;
45+
3746
setOrUpdateEntry(id: string, statusId: string, extensionId: string | undefined, name: string, text: string, tooltip: IMarkdownString | string | undefined, command: Command | undefined, color: string | ThemeColor | undefined, backgroundColor: string | ThemeColor | undefined, alignLeft: boolean, priority: number | undefined, accessibilityInformation: IAccessibilityInformation | undefined): IDisposable;
3847

39-
getEntries(): Iterable<[string, { entry: IStatusbarEntry; alignment: MainThreadStatusBarAlignment; priority: number }]>;
48+
getEntries(): Iterable<ExtensionStatusBarEntry>;
4049
}
4150

4251

@@ -46,8 +55,17 @@ class ExtensionStatusBarItemService implements IExtensionStatusBarItemService {
4655

4756
private readonly _entries: Map<string, { accessor: IStatusbarEntryAccessor; entry: IStatusbarEntry; alignment: MainThreadStatusBarAlignment; priority: number }> = new Map();
4857

58+
private readonly _onDidChange = new Emitter<IExtensionStatusBarItemChangeEvent>();
59+
readonly onDidChange: Event<IExtensionStatusBarItemChangeEvent> = this._onDidChange.event;
60+
4961
constructor(@IStatusbarService private readonly _statusbarService: IStatusbarService) { }
5062

63+
dispose(): void {
64+
this._entries.forEach(entry => entry.accessor.dispose());
65+
this._entries.clear();
66+
this._onDidChange.dispose();
67+
}
68+
5169
setOrUpdateEntry(entryId: string, id: string, extensionId: string | undefined, name: string, text: string, tooltip: IMarkdownString | string | undefined, command: Command | undefined, color: string | ThemeColor | undefined, backgroundColor: string | ThemeColor | undefined, alignLeft: boolean, priority: number | undefined, accessibilityInformation: IAccessibilityInformation | undefined): IDisposable {
5270
// if there are icons in the text use the tooltip for the aria label
5371
let ariaLabel: string;
@@ -98,6 +116,8 @@ class ExtensionStatusBarItemService implements IExtensionStatusBarItemService {
98116
priority
99117
});
100118

119+
this._onDidChange.fire({ added: [entryId, { entry, alignment, priority }] });
120+
101121
} else {
102122
// Otherwise update
103123
existingEntry.accessor.update(entry);
@@ -109,6 +129,7 @@ class ExtensionStatusBarItemService implements IExtensionStatusBarItemService {
109129
if (entry) {
110130
entry.accessor.dispose();
111131
this._entries.delete(entryId);
132+
this._onDidChange.fire({ removed: entryId });
112133
}
113134
});
114135
}

0 commit comments

Comments
 (0)