Skip to content

Commit 929753d

Browse files
authored
use uuid and try dynamic titles (microsoft#94686)
* use uuid for generated containers * use dynamic titles based on container views * add icons to built-in views
1 parent 92ff20a commit 929753d

8 files changed

Lines changed: 88 additions & 53 deletions

File tree

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

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import 'vs/css!./media/activitybarpart';
77
import * as nls from 'vs/nls';
88
import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
9-
import { GLOBAL_ACTIVITY_ID } from 'vs/workbench/common/activity';
9+
import { GLOBAL_ACTIVITY_ID, IActivity } from 'vs/workbench/common/activity';
1010
import { Registry } from 'vs/platform/registry/common/platform';
1111
import { Part } from 'vs/workbench/browser/part';
1212
import { GlobalActivityActionViewItem, ViewletActivityAction, ToggleViewletAction, PlaceHolderToggleCompositePinnedAction, PlaceHolderViewletActivityAction, AccountsActionViewItem } from 'vs/workbench/browser/parts/activitybar/activitybarActions';
@@ -29,7 +29,7 @@ import { ViewletDescriptor } from 'vs/workbench/browser/viewlet';
2929
import { IViewDescriptorService, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainer, TEST_VIEW_CONTAINER_ID, IViewDescriptorCollection, ViewContainerLocation } from 'vs/workbench/common/views';
3030
import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
3131
import { IViewlet } from 'vs/workbench/common/viewlet';
32-
import { isUndefinedOrNull, assertIsDefined } from 'vs/base/common/types';
32+
import { isUndefinedOrNull, assertIsDefined, isString } from 'vs/base/common/types';
3333
import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService';
3434
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
3535
import { Schemas } from 'vs/base/common/network';
@@ -458,12 +458,10 @@ export class ActivitybarPart extends Part implements IActivityBarService {
458458

459459
for (const viewlet of viewlets) {
460460
this.enableCompositeActions(viewlet);
461-
const viewContainer = this.getViewContainer(viewlet.id);
462-
if (viewContainer?.hideIfEmpty) {
463-
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
464-
this.onDidChangeActiveViews(viewlet, viewDescriptors);
465-
this.viewletDisposables.set(viewlet.id, viewDescriptors.onDidChangeActiveViews(() => this.onDidChangeActiveViews(viewlet, viewDescriptors)));
466-
}
461+
const viewContainer = this.getViewContainer(viewlet.id)!;
462+
const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer);
463+
this.onDidChangeActiveViews(viewlet, viewDescriptors, viewContainer.hideIfEmpty);
464+
this.viewletDisposables.set(viewlet.id, viewDescriptors.onDidChangeActiveViews(() => this.onDidChangeActiveViews(viewlet, viewDescriptors, viewContainer.hideIfEmpty)));
467465
}
468466
}
469467

@@ -477,10 +475,33 @@ export class ActivitybarPart extends Part implements IActivityBarService {
477475
this.hideComposite(viewletId);
478476
}
479477

480-
private onDidChangeActiveViews(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection): void {
478+
private updateActivity(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection): void {
479+
const viewDescriptor = viewDescriptors.activeViewDescriptors[0];
480+
481+
// Use the viewlet icon if any view inside belongs to it statically
482+
const shouldUseViewletIcon = viewDescriptors.allViewDescriptors.some(v => this.viewDescriptorService.getDefaultContainer(v.id)?.id === viewlet.id);
483+
484+
const activity: IActivity = {
485+
id: viewlet.id,
486+
name: shouldUseViewletIcon ? viewlet.name : viewDescriptor.name,
487+
cssClass: shouldUseViewletIcon ? viewlet.cssClass : (isString(viewDescriptor.containerIcon) ? viewDescriptor.containerIcon : (viewDescriptor.containerIcon === undefined ? 'codicon-window' : undefined)),
488+
iconUrl: shouldUseViewletIcon ? viewlet.iconUrl : (viewDescriptor.containerIcon instanceof URI ? viewDescriptor.containerIcon : undefined),
489+
keybindingId: viewlet.keybindingId
490+
};
491+
492+
const { activityAction, pinnedAction } = this.getCompositeActions(viewlet.id);
493+
activityAction.setActivity(activity);
494+
495+
if (pinnedAction instanceof PlaceHolderToggleCompositePinnedAction) {
496+
pinnedAction.setActivity(activity);
497+
}
498+
}
499+
500+
private onDidChangeActiveViews(viewlet: ViewletDescriptor, viewDescriptors: IViewDescriptorCollection, hideIfEmpty?: boolean): void {
481501
if (viewDescriptors.activeViewDescriptors.length) {
502+
this.updateActivity(viewlet, viewDescriptors);
482503
this.compositeBar.addComposite(viewlet);
483-
} else {
504+
} else if (hideIfEmpty) {
484505
this.hideComposite(viewlet.id);
485506
}
486507
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import { ViewMenuActions } from 'vs/workbench/browser/parts/views/viewMenuAction
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;
@@ -238,9 +239,27 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
238239
}
239240
}
240241

242+
private updateActivity(panel: PanelDescriptor, viewDescriptors: IViewDescriptorCollection): void {
243+
const viewDescriptor = viewDescriptors.activeViewDescriptors[0];
244+
245+
const activity: IActivity = {
246+
id: panel.id,
247+
name: viewDescriptor.name,
248+
keybindingId: panel.keybindingId
249+
};
250+
251+
const { activityAction, pinnedAction } = this.getCompositeActions(panel.id);
252+
activityAction.setActivity(activity);
253+
254+
if (pinnedAction instanceof PlaceHolderToggleCompositePinnedAction) {
255+
pinnedAction.setActivity(activity);
256+
}
257+
}
258+
241259
private onDidChangeActiveViews(panel: PanelDescriptor, viewDescriptors: IViewDescriptorCollection): void {
242260
if (viewDescriptors.activeViewDescriptors.length) {
243261
this.compositeBar.addComposite(panel);
262+
this.updateActivity(panel, viewDescriptors);
244263
} else {
245264
this.hideComposite(panel.id);
246265
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -906,15 +906,19 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
906906
}
907907

908908
getTitle(): string {
909+
// use registered title if any of our panes are statically registered to this container
910+
const allViewDescriptors = this.viewDescriptorService.getViewDescriptors(this.viewContainer).allViewDescriptors;
911+
const containerTitle = allViewDescriptors.some(v => this.viewDescriptorService.getDefaultContainer(v.id) === this.viewContainer) ? this.viewContainer.name : allViewDescriptors[0].name;
912+
909913
if (this.isViewMergedWithContainer()) {
910914
const paneItemTitle = this.paneItems[0].pane.title;
911-
if (this.options.donotShowContainerTitleWhenMergedWithContainer || this.viewContainer.name === paneItemTitle) {
915+
if (this.options.donotShowContainerTitleWhenMergedWithContainer || containerTitle === paneItemTitle) {
912916
return this.paneItems[0].pane.title;
913917
}
914-
return paneItemTitle ? `${this.viewContainer.name}: ${paneItemTitle}` : this.viewContainer.name;
918+
return paneItemTitle ? `${containerTitle}: ${paneItemTitle}` : containerTitle;
915919
}
916920

917-
return this.viewContainer.name;
921+
return containerTitle;
918922
}
919923

920924
private showContextMenu(event: StandardMouseEvent): void {

src/vs/workbench/contrib/debug/browser/debug.contribution.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ Registry.as<IViewsRegistry>(ViewExtensions.ViewsRegistry).registerViews([{
110110

111111
// Register default debug views
112112
const viewsRegistry = Registry.as<IViewsRegistry>(ViewExtensions.ViewsRegistry);
113-
viewsRegistry.registerViews([{ id: VARIABLES_VIEW_ID, name: nls.localize('variables', "Variables"), ctorDescriptor: new SyncDescriptor(VariablesView), order: 10, weight: 40, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusVariablesView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
114-
viewsRegistry.registerViews([{ id: WATCH_VIEW_ID, name: nls.localize('watch', "Watch"), ctorDescriptor: new SyncDescriptor(WatchExpressionsView), order: 20, weight: 10, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusWatchView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
115-
viewsRegistry.registerViews([{ id: CALLSTACK_VIEW_ID, name: nls.localize('callStack', "Call Stack"), ctorDescriptor: new SyncDescriptor(CallStackView), order: 30, weight: 30, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusCallStackView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
116-
viewsRegistry.registerViews([{ id: BREAKPOINTS_VIEW_ID, name: nls.localize('breakpoints', "Breakpoints"), ctorDescriptor: new SyncDescriptor(BreakpointsView), order: 40, weight: 20, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusBreakpointsView' }, when: ContextKeyExpr.or(CONTEXT_BREAKPOINTS_EXIST, CONTEXT_DEBUG_UX.isEqualTo('default')) }], viewContainer);
117-
viewsRegistry.registerViews([{ id: WelcomeView.ID, name: WelcomeView.LABEL, ctorDescriptor: new SyncDescriptor(WelcomeView), order: 10, weight: 40, canToggleVisibility: true, when: CONTEXT_DEBUG_UX.isEqualTo('simple') }], viewContainer);
118-
viewsRegistry.registerViews([{ id: LOADED_SCRIPTS_VIEW_ID, name: nls.localize('loadedScripts', "Loaded Scripts"), ctorDescriptor: new SyncDescriptor(LoadedScriptsView), order: 35, weight: 5, canToggleVisibility: true, canMoveView: true, collapsed: true, when: ContextKeyExpr.and(CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_DEBUG_UX.isEqualTo('default')) }], viewContainer);
113+
viewsRegistry.registerViews([{ id: VARIABLES_VIEW_ID, name: nls.localize('variables', "Variables"), containerIcon: 'codicon-debug-alt-2', ctorDescriptor: new SyncDescriptor(VariablesView), order: 10, weight: 40, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusVariablesView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
114+
viewsRegistry.registerViews([{ id: WATCH_VIEW_ID, name: nls.localize('watch', "Watch"), containerIcon: 'codicon-debug-alt-2', ctorDescriptor: new SyncDescriptor(WatchExpressionsView), order: 20, weight: 10, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusWatchView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
115+
viewsRegistry.registerViews([{ id: CALLSTACK_VIEW_ID, name: nls.localize('callStack', "Call Stack"), containerIcon: 'codicon-debug-alt-2', ctorDescriptor: new SyncDescriptor(CallStackView), order: 30, weight: 30, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusCallStackView' }, when: CONTEXT_DEBUG_UX.isEqualTo('default') }], viewContainer);
116+
viewsRegistry.registerViews([{ id: BREAKPOINTS_VIEW_ID, name: nls.localize('breakpoints', "Breakpoints"), containerIcon: 'codicon-debug-alt-2', ctorDescriptor: new SyncDescriptor(BreakpointsView), order: 40, weight: 20, canToggleVisibility: true, canMoveView: true, focusCommand: { id: 'workbench.debug.action.focusBreakpointsView' }, when: ContextKeyExpr.or(CONTEXT_BREAKPOINTS_EXIST, CONTEXT_DEBUG_UX.isEqualTo('default')) }], viewContainer);
117+
viewsRegistry.registerViews([{ id: WelcomeView.ID, name: WelcomeView.LABEL, containerIcon: 'codicon-debug-alt-2', ctorDescriptor: new SyncDescriptor(WelcomeView), order: 10, weight: 40, canToggleVisibility: true, when: CONTEXT_DEBUG_UX.isEqualTo('simple') }], viewContainer);
118+
viewsRegistry.registerViews([{ id: LOADED_SCRIPTS_VIEW_ID, name: nls.localize('loadedScripts', "Loaded Scripts"), containerIcon: 'codicon-debug-alt-2', ctorDescriptor: new SyncDescriptor(LoadedScriptsView), order: 35, weight: 5, canToggleVisibility: true, canMoveView: true, collapsed: true, when: ContextKeyExpr.and(CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_DEBUG_UX.isEqualTo('default')) }], viewContainer);
119119

120120
registerCommands();
121121

src/vs/workbench/contrib/files/browser/explorerViewlet.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor
123123
return {
124124
id: EmptyView.ID,
125125
name: EmptyView.NAME,
126+
containerIcon: 'codicon-files',
126127
ctorDescriptor: new SyncDescriptor(EmptyView),
127128
order: 1,
128129
canToggleVisibility: true,
@@ -136,6 +137,7 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor
136137
return {
137138
id: ExplorerView.ID,
138139
name: localize('folders', "Folders"),
140+
containerIcon: 'codicons-files',
139141
ctorDescriptor: new SyncDescriptor(ExplorerView),
140142
order: 1,
141143
canToggleVisibility: false,

src/vs/workbench/contrib/scm/browser/mainPane.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ export class MainPaneDescriptor implements IViewDescriptor {
333333

334334
readonly id = MainPane.ID;
335335
readonly name = MainPane.TITLE;
336+
readonly containerIcon = 'codicon-source-control';
336337
readonly ctorDescriptor: SyncDescriptor<MainPane>;
337338
readonly canToggleVisibility = true;
338339
readonly hideByDefault = false;

src/vs/workbench/contrib/scm/browser/scmViewlet.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export class EmptyPane extends ViewPane {
6969
export class EmptyPaneDescriptor implements IViewDescriptor {
7070
readonly id = EmptyPane.ID;
7171
readonly name = EmptyPane.TITLE;
72+
readonly containerIcon = 'codicon-source-control';
7273
readonly ctorDescriptor = new SyncDescriptor(EmptyPane);
7374
readonly canToggleVisibility = true;
7475
readonly hideByDefault = false;

0 commit comments

Comments
 (0)