From 4fd60ed5b58f00b3220c6c1c2522260c3da7a716 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 15 Nov 2018 15:46:28 +0100 Subject: [PATCH] Fix #62861 --- .../parts/activitybar/activitybarPart.ts | 47 +++++++++++++++---- src/vs/workbench/browser/parts/views/views.ts | 4 ++ src/vs/workbench/common/views.ts | 1 + 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 3b9768daa13..2d788183056 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -30,12 +30,18 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { URI } from 'vs/base/common/uri'; import { ToggleCompositePinnedAction, ICompositeBarColors } from 'vs/workbench/browser/parts/compositeBarActions'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; +import { IViewsService, IViewContainersRegistry, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; +import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; interface IPlaceholderComposite { id: string; iconUrl: URI; } +interface ISerializedPlaceholderComposite extends IPlaceholderComposite { + whens?: string[]; +} + export class ActivitybarPart extends Part { private static readonly ACTION_HEIGHT = 50; @@ -59,7 +65,9 @@ export class ActivitybarPart extends Part { @IThemeService themeService: IThemeService, @ILifecycleService private lifecycleService: ILifecycleService, @IStorageService private storageService: IStorageService, - @IExtensionService private extensionService: IExtensionService + @IExtensionService private extensionService: IExtensionService, + @IViewsService private viewsService: IViewsService, + @IContextKeyService contextKeyService: IContextKeyService ) { super(id, { hasTitle: false }, themeService, storageService); @@ -80,14 +88,20 @@ export class ActivitybarPart extends Part { })); const previousState = this.storageService.get(ActivitybarPart.PLACEHOLDER_VIEWLETS, StorageScope.GLOBAL, '[]'); - this.placeholderComposites = JSON.parse(previousState); - this.placeholderComposites.forEach((s) => { - if (typeof s.iconUrl === 'object') { - s.iconUrl = URI.revive(s.iconUrl); - } else { - s.iconUrl = void 0; + const serializedPlaceholderComposites = JSON.parse(previousState); + this.placeholderComposites = []; + for (const { id, iconUrl, whens } of serializedPlaceholderComposites) { + if (whens && whens.length > 0) { + if (whens.every(when => !contextKeyService.contextMatchesRules(ContextKeyExpr.deserialize(when)))) { + // Hidden by default + continue; + } } - }); + this.placeholderComposites.push({ + id, + iconUrl: typeof iconUrl === 'object' ? URI.revive(iconUrl) : void 0 + }); + } this.registerListeners(); this.updateCompositebar(); @@ -332,7 +346,22 @@ export class ActivitybarPart extends Part { } protected saveState(): void { - const state = this.viewletService.getAllViewlets().map(({ id, iconUrl }) => ({ id, iconUrl })); + const viewContainerRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); + const state: ISerializedPlaceholderComposite[] = []; + for (const { id, iconUrl } of this.viewletService.getAllViewlets()) { + if (iconUrl) { + const viewContainer = viewContainerRegistry.get(id); + const whens: string[] = []; + if (viewContainer) { + for (const { when } of this.viewsService.getViewDescriptors(viewContainer).allViewDescriptors) { + if (when) { + whens.push(when.serialize()); + } + } + } + state.push({ id, iconUrl, whens }); + } + } this.storageService.store(ActivitybarPart.PLACEHOLDER_VIEWLETS, JSON.stringify(state), StorageScope.GLOBAL); super.saveState(); diff --git a/src/vs/workbench/browser/parts/views/views.ts b/src/vs/workbench/browser/parts/views/views.ts index 3cda62b5364..a79de8d231d 100644 --- a/src/vs/workbench/browser/parts/views/views.ts +++ b/src/vs/workbench/browser/parts/views/views.ts @@ -80,6 +80,10 @@ class ViewDescriptorCollection extends Disposable implements IViewDescriptorColl .map(i => i.viewDescriptor); } + get allViewDescriptors(): IViewDescriptor[] { + return this.items.map(i => i.viewDescriptor); + } + constructor( container: ViewContainer, @IContextKeyService private contextKeyService: IContextKeyService diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 33cc7b25197..b23a5d39915 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -119,6 +119,7 @@ export interface IViewDescriptor { export interface IViewDescriptorCollection { readonly onDidChangeActiveViews: Event<{ added: IViewDescriptor[], removed: IViewDescriptor[] }>; readonly activeViewDescriptors: IViewDescriptor[]; + readonly allViewDescriptors: IViewDescriptor[]; } export interface IViewsRegistry { -- GitLab