From 91db9a6a888ebb0338d4c9bb5858a0fd1ed53378 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 23:01:11 +0200 Subject: [PATCH] Hide the contributed viewlet if no views are registered --- .../api/browser/activitybarExtensionPoint.ts | 2 +- .../parts/activitybar/activitybarPart.ts | 31 +++++++++++++++++-- src/vs/workbench/common/views.ts | 13 ++++---- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts index 15aed855355..09b6dfc9618 100644 --- a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts +++ b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts @@ -91,7 +91,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { const id = `workbench.view.extension.${descriptor.id}`; const title = descriptor.title; const cssClass = `extensionViewlet-${descriptor.id}`; - const location: ViewLocation = ViewLocation.register(id); + const location: ViewLocation = ViewLocation.register(id, true); // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 2382e8f9534..014ff3268ce 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -33,6 +33,8 @@ import { isMacintosh } from 'vs/base/common/platform'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Dimension, scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; import { Color } from 'vs/base/common/color'; +import { ViewLocation, ViewsRegistry } from 'vs/workbench/common/views'; +import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; export class ActivitybarPart extends Part { @@ -83,11 +85,14 @@ export class ActivitybarPart extends Part { }); this.registerListeners(); + this.updateCompositebar(); } private registerListeners(): void { - this.toUnbind.push(this.viewletService.onDidViewletRegister(viewletDescriptor => this.compositeBar.addComposite(viewletDescriptor, false))); + this.toUnbind.push(this.viewletService.onDidViewletRegister(() => this.updateCompositebar())); + this.toUnbind.push(ViewsRegistry.onViewsRegistered(() => this.updateCompositebar())); + this.toUnbind.push(ViewsRegistry.onViewsDeregistered(() => this.updateCompositebar())); // Activate viewlet action on opening of a viewlet this.toUnbind.push(this.viewletService.onDidViewletOpen(viewlet => this.compositeBar.activateComposite(viewlet.getId()))); @@ -183,7 +188,9 @@ export class ActivitybarPart extends Part { private showContextMenu(e: MouseEvent): void { const event = new StandardMouseEvent(e); - const actions: Action[] = this.viewletService.getViewlets().map(viewlet => this.instantiationService.createInstance(ToggleCompositePinnedAction, viewlet, this.compositeBar)); + const actions: Action[] = this.viewletService.getViewlets() + .filter(viewlet => this.canShow(viewlet)) + .map(viewlet => this.instantiationService.createInstance(ToggleCompositePinnedAction, viewlet, this.compositeBar)); actions.push(new Separator()); actions.push(this.instantiationService.createInstance(ToggleActivityBarVisibilityAction, ToggleActivityBarVisibilityAction.ID, nls.localize('hideActivitBar', "Hide Activity Bar"))); @@ -215,6 +222,26 @@ export class ActivitybarPart extends Part { }); } + private updateCompositebar(): void { + const viewlets = this.viewletService.getViewlets(); + for (const viewlet of viewlets) { + const canShow = this.canShow(viewlet); + if (canShow) { + this.compositeBar.addComposite(viewlet, false); + } else { + this.compositeBar.removeComposite(viewlet.id); + } + } + } + + private canShow(viewlet: ViewletDescriptor): boolean { + const viewLocation = ViewLocation.get(viewlet.id); + if (viewLocation && viewLocation.contributed) { + return ViewsRegistry.getViews(viewLocation).length > 0; + } + return true; + } + public getPinned(): string[] { return this.viewletService.getViewlets().map(v => v.id).filter(id => this.compositeBar.isPinned(id)); } diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index aa06fd035a2..4f721596537 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -18,8 +18,8 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; export class ViewLocation { private static locations: Map = new Map(); - static register(id: string): ViewLocation { - const viewLocation = new ViewLocation(id); + static register(id: string, contributed: boolean): ViewLocation { + const viewLocation = new ViewLocation(id, contributed); ViewLocation.locations.set(id, viewLocation); return viewLocation; } @@ -27,12 +27,13 @@ export class ViewLocation { return ViewLocation.locations.get(value); } - static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer'); - static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug'); - static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions'); + static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer', false); + static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug', false); + static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions', false); - private constructor(private _id: string) { } + private constructor(private _id: string, private _contributed: boolean) { } get id(): string { return this._id; } + get contributed(): boolean { return this._contributed; } } -- GitLab