Skip to content

Commit 5d4ceaf

Browse files
committed
activity bar support
1 parent f4a5613 commit 5d4ceaf

6 files changed

Lines changed: 57 additions & 14 deletions

File tree

src/vs/workbench/browser/parts/activitybar/activitybarPart.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,13 @@ export class ActivitybarPart extends Part implements IActivityBarService {
492492
const viewContainer = this.getViewContainer(viewlet.id)!;
493493
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
494494
this.onDidChangeActiveViews(viewlet, viewDescriptors, viewContainer.hideIfEmpty);
495-
this.viewletDisposables.set(viewlet.id, viewDescriptors.onDidChangeActiveViews(() => this.onDidChangeActiveViews(viewlet, viewDescriptors, viewContainer.hideIfEmpty)));
495+
496+
const disposables = new DisposableStore();
497+
disposables.add(viewDescriptors.onDidChangeActiveViews(() => this.onDidChangeActiveViews(viewlet, viewDescriptors, viewContainer.hideIfEmpty)));
498+
disposables.add(viewDescriptors.onDidChangeViews(() => this.onDidUpdateViews(viewlet, viewDescriptors)));
499+
disposables.add(viewDescriptors.onDidMove(() => this.onDidUpdateViews(viewlet, viewDescriptors)));
500+
501+
this.viewletDisposables.set(viewlet.id, disposables);
496502
}
497503
}
498504

@@ -507,16 +513,13 @@ export class ActivitybarPart extends Part implements IActivityBarService {
507513
}
508514

509515
private updateActivity(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection): void {
510-
const viewDescriptor = viewDescriptors.activeViewDescriptors[0];
511-
512-
// Use the viewlet icon if any view inside belongs to it statically
513-
const shouldUseViewletIcon = viewDescriptors.allViewDescriptors.some(v => this.viewDescriptorService.getDefaultContainer(v.id)?.id === viewlet.id);
516+
const icon = viewDescriptors.getIcon();
514517

515518
const activity: IActivity = {
516519
id: viewlet.id,
517-
name: shouldUseViewletIcon ? viewlet.name : viewDescriptor.name,
518-
cssClass: shouldUseViewletIcon ? viewlet.cssClass : (isString(viewDescriptor.containerIcon) ? viewDescriptor.containerIcon : (viewDescriptor.containerIcon === undefined ? 'codicon-window' : undefined)),
519-
iconUrl: shouldUseViewletIcon ? viewlet.iconUrl : (viewDescriptor.containerIcon instanceof URI ? viewDescriptor.containerIcon : undefined),
520+
name: viewDescriptors.getTitle(),
521+
cssClass: isString(icon) ? icon : undefined,
522+
iconUrl: icon instanceof URI ? icon : undefined,
520523
keybindingId: viewlet.keybindingId
521524
};
522525

@@ -528,6 +531,10 @@ export class ActivitybarPart extends Part implements IActivityBarService {
528531
}
529532
}
530533

534+
private onDidUpdateViews(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection): void {
535+
this.updateActivity(viewlet, viewDescriptors);
536+
}
537+
531538
private onDidChangeActiveViews(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection, hideIfEmpty?: boolean): void {
532539
if (viewDescriptors.activeViewDescriptors.length) {
533540
this.updateActivity(viewlet, viewDescriptors);

src/vs/workbench/browser/parts/compositeBarActions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,11 @@ export class ActivityActionViewItem extends BaseActionViewItem {
161161
if (this.activity.iconUrl) {
162162
// Apply background color to activity bar item provided with iconUrls
163163
this.label.style.backgroundColor = foreground ? foreground.toString() : '';
164+
this.label.style.color = '';
164165
} else {
165166
// Apply foreground color to activity bar items provided with codicons
166167
this.label.style.color = foreground ? foreground.toString() : '';
168+
this.label.style.backgroundColor = '';
167169
}
168170

169171
const dragColor = colors.activeBackgroundColor || colors.activeForegroundColor;

src/vs/workbench/browser/parts/views/viewPaneContainer.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -904,9 +904,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
904904
}
905905

906906
getTitle(): string {
907-
// use registered title if any of our panes are statically registered to this container
908-
const allViewDescriptors = this.viewDescriptorService.getViewDescriptors(this.viewContainer).allViewDescriptors;
909-
const containerTitle = this.paneItems.length === 0 || allViewDescriptors.length === 0 || allViewDescriptors.some(v => this.viewDescriptorService.getDefaultContainer(v.id) === this.viewContainer) ? this.viewContainer.name : this.paneItems[0].pane.title;
907+
const containerTitle = this.viewsDescriptors.getTitle();
910908

911909
if (this.isViewMergedWithContainer()) {
912910
const paneItemTitle = this.paneItems[0].pane.title;

src/vs/workbench/common/views.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ export interface IViewDescriptorCollection extends IDisposable {
241241
getSize(id: string): number | undefined;
242242
setSize(id: string, size: number): void
243243

244+
getTitle(): string;
245+
getIcon(): URI | string | undefined;
246+
244247
move(from: string, to: string): void;
245248
}
246249

src/vs/workbench/services/views/browser/viewDescriptorService.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1818
import { generateUuid } from 'vs/base/common/uuid';
1919
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
2020
import { PersistentViewsModel, ViewDescriptorsModel } from 'vs/workbench/services/views/common/viewsModel';
21+
import { URI } from 'vs/base/common/uri';
2122

2223
class ViewDescriptorCollection extends Disposable implements IViewDescriptorCollection {
2324

2425
private readonly viewDescriptorsModel: ViewDescriptorsModel;
2526
private readonly viewsModel: PersistentViewsModel;
2627

2728
constructor(
28-
container: ViewContainer,
29+
private readonly container: ViewContainer,
2930
@IInstantiationService instantiationService: IInstantiationService,
3031
) {
3132
super();
@@ -54,11 +55,30 @@ class ViewDescriptorCollection extends Disposable implements IViewDescriptorColl
5455
isCollapsed(id: string): boolean { return this.viewsModel.isCollapsed(id); }
5556
setCollapsed(id: string, collapsed: boolean): void { return this.viewsModel.setCollapsed(id, collapsed); }
5657

58+
private shouldUseContainerInfo(): boolean {
59+
if (this.allViewDescriptors.length === 0) {
60+
return true;
61+
}
62+
63+
if (this.visibleViewDescriptors.length === 0) {
64+
return true;
65+
}
66+
67+
return this.allViewDescriptors.some(v => Registry.as<IViewsRegistry>(ViewExtensions.ViewsRegistry).getViewContainer(v.id) === this.container);
68+
}
69+
70+
getTitle(): string {
71+
return this.shouldUseContainerInfo() ? this.container.name : this.visibleViewDescriptors[0].name;
72+
}
73+
74+
getIcon(): URI | string | undefined {
75+
return this.shouldUseContainerInfo() ? this.container.icon : this.visibleViewDescriptors[0]?.containerIcon || 'codicon-window';
76+
}
77+
5778
getSize(id: string): number | undefined { return this.viewsModel.getSize(id); }
5879
setSize(id: string, size: number): void { return this.viewsModel.setSize(id, size); }
5980

6081
move(from: string, to: string): void { return this.viewsModel.move(from, to); }
61-
6282
}
6383

6484
interface ICachedViewContainerInfo {

src/vs/workbench/services/views/common/viewsModel.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,20 @@ export class ViewsModel extends Disposable {
182182
}
183183

184184
get visibleViewDescriptors(): IViewDescriptor[] {
185-
return this.viewDescriptors.filter(v => this.isViewDescriptorVisible(v));
185+
return this.viewDescriptors.filter(v => this.isViewDescriptorVisible(v)).sort((a, b) => {
186+
const aIndex = this.viewStates.get(a.id)?.order;
187+
const bIndex = this.viewStates.get(b.id)?.order;
188+
189+
if (aIndex === undefined) {
190+
return 1;
191+
}
192+
193+
if (bIndex === undefined) {
194+
return -1;
195+
}
196+
197+
return aIndex - bIndex;
198+
});
186199
}
187200

188201
private _onDidAdd = this._register(new Emitter<IAddedViewDescriptorRef[]>());

0 commit comments

Comments
 (0)