Skip to content

Commit 600995b

Browse files
authored
Merge pull request microsoft#95721 from microsoft/sandy081/viewsModel
Unify view descriptor and view model into IViewContainerModel
2 parents 9e1acba + 116a3de commit 600995b

31 files changed

Lines changed: 1434 additions & 1366 deletions

File tree

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,8 @@ export class MainThreadComments extends Disposable implements MainThreadComments
451451
const VIEW_CONTAINER: ViewContainer = Registry.as<IViewContainersRegistry>(ViewExtensions.ViewContainersRegistry).registerViewContainer({
452452
id: COMMENTS_VIEW_ID,
453453
name: COMMENTS_VIEW_TITLE,
454-
ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [COMMENTS_VIEW_ID, COMMENTS_VIEW_TITLE, { mergeViewWithContainerWhenSingleView: true, donotShowContainerTitleWhenMergedWithContainer: true }]),
454+
ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [COMMENTS_VIEW_ID, { mergeViewWithContainerWhenSingleView: true, donotShowContainerTitleWhenMergedWithContainer: true }]),
455+
storageId: COMMENTS_VIEW_TITLE,
455456
hideIfEmpty: true,
456457
order: 10,
457458
}, ViewContainerLocation.Panel);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
320320
name: title, extensionId,
321321
ctorDescriptor: new SyncDescriptor(
322322
ViewPaneContainer,
323-
[id, `${id}.state`, { mergeViewWithContainerWhenSingleView: true }]
323+
[id, { mergeViewWithContainerWhenSingleView: true }]
324324
),
325325
hideIfEmpty: true,
326326
order,

src/vs/workbench/browser/actions/layoutActions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -488,9 +488,9 @@ export class ResetViewLocationsAction extends Action {
488488
async run(): Promise<void> {
489489
const viewContainerRegistry = Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegistry);
490490
viewContainerRegistry.all.forEach(viewContainer => {
491-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
491+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
492492

493-
viewDescriptors.allViewDescriptors.forEach(viewDescriptor => {
493+
viewContainerModel.allViewDescriptors.forEach(viewDescriptor => {
494494
const defaultContainer = this.viewDescriptorService.getDefaultContainer(viewDescriptor.id);
495495
const currentContainer = this.viewDescriptorService.getViewContainer(viewDescriptor.id);
496496

@@ -583,7 +583,7 @@ export class MoveFocusedViewAction extends Action {
583583

584584
const currentContainer = this.viewDescriptorService.getViewContainer(focusedViewId)!;
585585
const currentLocation = this.viewDescriptorService.getViewLocation(focusedViewId)!;
586-
const isViewSolo = this.viewDescriptorService.getViewDescriptors(currentContainer).allViewDescriptors.length === 1;
586+
const isViewSolo = this.viewDescriptorService.getViewContainerModel(currentContainer).allViewDescriptors.length === 1;
587587

588588
if (!(isViewSolo && currentLocation === ViewContainerLocation.Sidebar)) {
589589
items.push({

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

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
2626
import { URI, UriComponents } from 'vs/base/common/uri';
2727
import { ToggleCompositePinnedAction, ICompositeBarColors, ActivityAction, ICompositeActivity } from 'vs/workbench/browser/parts/compositeBarActions';
2828
import { ViewletDescriptor } from 'vs/workbench/browser/viewlet';
29-
import { IViewDescriptorService, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainer, TEST_VIEW_CONTAINER_ID, IViewDescriptorCollection, ViewContainerLocation } from 'vs/workbench/common/views';
29+
import { IViewDescriptorService, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainer, TEST_VIEW_CONTAINER_ID, IViewContainerModel, ViewContainerLocation } from 'vs/workbench/common/views';
3030
import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
3131
import { IViewlet } from 'vs/workbench/common/viewlet';
3232
import { isUndefinedOrNull, assertIsDefined, isString } from 'vs/base/common/types';
@@ -216,8 +216,8 @@ export class ActivitybarPart extends Part implements IActivityBarService {
216216
if (viewletDescriptor) {
217217
const viewContainer = this.getViewContainer(viewletDescriptor.id);
218218
if (viewContainer?.hideIfEmpty) {
219-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
220-
if (viewDescriptors.activeViewDescriptors.length === 0) {
219+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
220+
if (viewContainerModel.activeViewDescriptors.length === 0) {
221221
this.hideComposite(viewletDescriptor.id); // Update the composite bar by hiding
222222
}
223223
}
@@ -478,9 +478,14 @@ export class ActivitybarPart extends Part implements IActivityBarService {
478478
for (const viewlet of viewlets) {
479479
this.enableCompositeActions(viewlet);
480480
const viewContainer = this.getViewContainer(viewlet.id)!;
481-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
482-
this.onDidChangeActiveViews(viewlet, viewDescriptors, viewContainer.hideIfEmpty);
483-
this.viewletDisposables.set(viewlet.id, viewDescriptors.onDidChangeActiveViews(() => this.onDidChangeActiveViews(viewlet, viewDescriptors, viewContainer.hideIfEmpty)));
481+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
482+
this.onDidChangeActiveViews(viewlet, viewContainerModel, viewContainer.hideIfEmpty);
483+
484+
const disposables = new DisposableStore();
485+
disposables.add(viewContainerModel.onDidChangeActiveViewDescriptors(() => this.onDidChangeActiveViews(viewlet, viewContainerModel, viewContainer.hideIfEmpty)));
486+
disposables.add(viewContainerModel.onDidChangeContainerInfo(() => this.updateActivity(viewlet, viewContainerModel)));
487+
488+
this.viewletDisposables.set(viewlet.id, disposables);
484489
}
485490
}
486491

@@ -494,17 +499,14 @@ export class ActivitybarPart extends Part implements IActivityBarService {
494499
this.hideComposite(viewletId);
495500
}
496501

497-
private updateActivity(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection): void {
498-
const viewDescriptor = viewDescriptors.activeViewDescriptors[0];
499-
500-
// Use the viewlet icon if any view inside belongs to it statically
501-
const shouldUseViewletIcon = viewDescriptors.allViewDescriptors.some(v => this.viewDescriptorService.getDefaultContainer(v.id)?.id === viewlet.id);
502+
private updateActivity(viewlet: ViewletDescriptor, viewContainerModel: IViewContainerModel): void {
503+
const icon = viewContainerModel.icon;
502504

503505
const activity: IActivity = {
504506
id: viewlet.id,
505-
name: shouldUseViewletIcon ? viewlet.name : viewDescriptor.name,
506-
cssClass: shouldUseViewletIcon ? viewlet.cssClass : (isString(viewDescriptor.containerIcon) ? viewDescriptor.containerIcon : (viewDescriptor.containerIcon === undefined ? 'codicon-window' : undefined)),
507-
iconUrl: shouldUseViewletIcon ? viewlet.iconUrl : (viewDescriptor.containerIcon instanceof URI ? viewDescriptor.containerIcon : undefined),
507+
name: viewContainerModel.title,
508+
cssClass: isString(icon) ? icon : undefined,
509+
iconUrl: icon instanceof URI ? icon : undefined,
508510
keybindingId: viewlet.keybindingId
509511
};
510512

@@ -516,7 +518,7 @@ export class ActivitybarPart extends Part implements IActivityBarService {
516518
}
517519
}
518520

519-
private onDidChangeActiveViews(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection, hideIfEmpty?: boolean): void {
521+
private onDidChangeActiveViews(viewlet: ViewletDescriptor, viewDescriptors: IViewContainerModel, hideIfEmpty?: boolean): void {
520522
if (viewDescriptors.activeViewDescriptors.length) {
521523
this.updateActivity(viewlet, viewDescriptors);
522524
this.compositeBar.addComposite(viewlet);
@@ -644,8 +646,8 @@ export class ActivitybarPart extends Part implements IActivityBarService {
644646
if (viewlet) {
645647
const views: { when: string | undefined }[] = [];
646648
if (viewContainer) {
647-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
648-
for (const { when } of viewDescriptors.allViewDescriptors) {
649+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
650+
for (const { when } of viewContainerModel.allViewDescriptors) {
649651
views.push({ when: when ? when.serialize() : undefined });
650652
}
651653
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class CompositeDragAndDrop implements ICompositeDragAndDrop {
5656
}
5757
// ... on a different composite bar
5858
else {
59-
const viewsToMove = this.viewDescriptorService.getViewDescriptors(currentContainer)!.allViewDescriptors;
59+
const viewsToMove = this.viewDescriptorService.getViewContainerModel(currentContainer)!.allViewDescriptors;
6060
if (viewsToMove.some(v => !v.canMoveView)) {
6161
return;
6262
}
@@ -119,7 +119,7 @@ export class CompositeDragAndDrop implements ICompositeDragAndDrop {
119119
}
120120

121121
// ... to another composite location
122-
const draggedViews = this.viewDescriptorService.getViewDescriptors(currentContainer)!.allViewDescriptors;
122+
const draggedViews = this.viewDescriptorService.getViewContainerModel(currentContainer)!.allViewDescriptors;
123123

124124
// ... all views must be movable
125125
return !draggedViews.some(v => !v.canMoveView);

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

Lines changed: 2 additions & 5 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;
@@ -691,9 +693,4 @@ export class ToggleCompositePinnedAction extends Action {
691693
this.compositeBar.pin(id);
692694
}
693695
}
694-
695-
setActivity(activity: IActivity): void {
696-
this.activity = activity;
697-
this.label = activity.name;
698-
}
699696
}

src/vs/workbench/browser/parts/panel/panelActions.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ export class PlaceHolderToggleCompositePinnedAction extends ToggleCompositePinne
200200
constructor(id: string, compositeBar: ICompositeBar) {
201201
super({ id, name: id, cssClass: undefined }, compositeBar);
202202
}
203+
204+
setActivity(activity: IActivity): void {
205+
this.label = activity.name;
206+
}
203207
}
204208

205209

src/vs/workbench/browser/parts/panel/panelPart.ts

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ import { IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/con
3333
import { isUndefinedOrNull, assertIsDefined } from 'vs/base/common/types';
3434
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
3535
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
36-
import { ViewContainer, IViewContainersRegistry, Extensions as ViewContainerExtensions, IViewDescriptorService, IViewDescriptorCollection, ViewContainerLocation } from 'vs/workbench/common/views';
36+
import { ViewContainer, IViewContainersRegistry, Extensions as ViewContainerExtensions, IViewDescriptorService, IViewContainerModel, ViewContainerLocation } from 'vs/workbench/common/views';
3737
import { MenuId } from 'vs/platform/actions/common/actions';
3838
import { ViewMenuActions } from 'vs/workbench/browser/parts/views/viewMenuActions';
3939
import { IPaneComposite } from 'vs/workbench/common/panecomposite';
4040
import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys';
4141
import { Before2D } from 'vs/workbench/browser/dnd';
42+
import { IActivity } from 'vs/workbench/common/activity';
4243

4344
interface ICachedPanel {
4445
id: string;
@@ -177,9 +178,9 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
177178
const result: IAction[] = [];
178179
const container = this.getViewContainer(compositeId);
179180
if (container) {
180-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(container);
181-
if (viewDescriptors.allViewDescriptors.length === 1) {
182-
const viewMenuActions = this.instantiationService.createInstance(ViewMenuActions, viewDescriptors.allViewDescriptors[0].id, MenuId.ViewTitle, MenuId.ViewTitleContext);
181+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(container);
182+
if (viewContainerModel.allViewDescriptors.length === 1) {
183+
const viewMenuActions = this.instantiationService.createInstance(ViewMenuActions, viewContainerModel.allViewDescriptors[0].id, MenuId.ViewTitle, MenuId.ViewTitleContext);
183184
result.push(...viewMenuActions.getContextMenuActions());
184185
viewMenuActions.dispose();
185186
}
@@ -209,12 +210,16 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
209210

210211
for (const panel of panels) {
211212
this.enableCompositeActions(panel);
212-
const viewContainer = this.getViewContainer(panel.id);
213-
if (viewContainer?.hideIfEmpty) {
214-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
215-
this.onDidChangeActiveViews(panel, viewDescriptors);
216-
this.panelDisposables.set(panel.id, viewDescriptors.onDidChangeActiveViews(() => this.onDidChangeActiveViews(panel, viewDescriptors)));
217-
}
213+
const viewContainer = this.getViewContainer(panel.id)!;
214+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
215+
this.onDidChangeActiveViews(panel, viewContainerModel, viewContainer.hideIfEmpty);
216+
217+
const disposables = new DisposableStore();
218+
disposables.add(viewContainerModel.onDidChangeActiveViewDescriptors(() => this.onDidChangeActiveViews(panel, viewContainerModel, viewContainer.hideIfEmpty)));
219+
disposables.add(viewContainerModel.onDidChangeAllViewDescriptors(() => this.onDidUpdateViews(panel, viewContainerModel)));
220+
disposables.add(viewContainerModel.onDidMoveVisibleViewDescriptors(() => this.onDidUpdateViews(panel, viewContainerModel)));
221+
222+
this.panelDisposables.set(panel.id, disposables);
218223
}
219224
}
220225

@@ -230,19 +235,37 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
230235

231236
private enableCompositeActions(panel: PanelDescriptor): void {
232237
const { activityAction, pinnedAction } = this.getCompositeActions(panel.id);
233-
if (activityAction instanceof PlaceHolderPanelActivityAction) {
234-
activityAction.setActivity(panel);
235-
}
238+
activityAction.setActivity(panel);
236239

237240
if (pinnedAction instanceof PlaceHolderToggleCompositePinnedAction) {
238241
pinnedAction.setActivity(panel);
239242
}
240243
}
241244

242-
private onDidChangeActiveViews(panel: PanelDescriptor, viewDescriptors: IViewDescriptorCollection): void {
245+
private updateActivity(panel: PanelDescriptor, viewContainerModel: IViewContainerModel): void {
246+
const activity: IActivity = {
247+
id: panel.id,
248+
name: viewContainerModel.title,
249+
keybindingId: panel.keybindingId
250+
};
251+
252+
const { activityAction, pinnedAction } = this.getCompositeActions(panel.id);
253+
activityAction.setActivity(activity);
254+
255+
if (pinnedAction instanceof PlaceHolderToggleCompositePinnedAction) {
256+
pinnedAction.setActivity(activity);
257+
}
258+
}
259+
260+
private onDidUpdateViews(panel: PanelDescriptor, viewDescriptors: IViewContainerModel): void {
261+
this.updateActivity(panel, viewDescriptors);
262+
}
263+
264+
private onDidChangeActiveViews(panel: PanelDescriptor, viewDescriptors: IViewContainerModel, hideIfEmpty?: boolean): void {
243265
if (viewDescriptors.activeViewDescriptors.length) {
266+
this.updateActivity(panel, viewDescriptors);
244267
this.compositeBar.addComposite(panel);
245-
} else {
268+
} else if (hideIfEmpty) {
246269
this.hideComposite(panel.id);
247270
}
248271
}
@@ -320,8 +343,8 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
320343
if (panelDescriptor) {
321344
const viewContainer = this.getViewContainer(panelDescriptor.id);
322345
if (viewContainer?.hideIfEmpty) {
323-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
324-
if (viewDescriptors.activeViewDescriptors.length === 0 && this.compositeBar.getPinnedComposites().length > 1) {
346+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
347+
if (viewContainerModel.activeViewDescriptors.length === 0 && this.compositeBar.getPinnedComposites().length > 1) {
325348
this.hideComposite(panelDescriptor.id); // Update the composite bar by hiding
326349
}
327350
}
@@ -540,28 +563,6 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
540563
return false;
541564
}
542565

543-
protected onTitleAreaUpdate(compositeId: string): void {
544-
super.onTitleAreaUpdate(compositeId);
545-
546-
const activePanel = this.getActivePanel();
547-
const panel = this.createComposite(compositeId, activePanel?.getId() === compositeId);
548-
549-
if (panel) {
550-
const compositeActions = this.compositeActions.get(compositeId);
551-
if (compositeActions) {
552-
compositeActions.activityAction.setActivity({
553-
id: compositeActions.activityAction.id,
554-
name: panel.getTitle() || compositeActions.activityAction.label
555-
});
556-
557-
compositeActions.pinnedAction.setActivity({
558-
id: compositeActions.activityAction.id,
559-
name: panel.getTitle() || compositeActions.activityAction.label
560-
});
561-
}
562-
}
563-
}
564-
565566
private getToolbarWidth(): number {
566567
const activePanel = this.getActivePanel();
567568
if (!activePanel || !this.toolBar) {
@@ -609,8 +610,11 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
609610

610611
const compositeItems = this.compositeBar.getCompositeBarItems();
611612
for (const compositeItem of compositeItems) {
612-
const activityAction = this.getCompositeActions(compositeItem.id).activityAction;
613-
state.push({ id: compositeItem.id, name: activityAction.label, pinned: compositeItem.pinned, order: compositeItem.order, visible: compositeItem.visible });
613+
const viewContainer = this.getViewContainer(compositeItem.id);
614+
if (viewContainer) {
615+
const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer);
616+
state.push({ id: compositeItem.id, name: viewContainerModel.title, pinned: compositeItem.pinned, order: compositeItem.order, visible: compositeItem.visible });
617+
}
614618
}
615619

616620
this.cachedPanelsValue = JSON.stringify(state);

0 commit comments

Comments
 (0)