diff --git a/src/vs/workbench/api/common/apiCommands.ts b/src/vs/workbench/api/common/apiCommands.ts index c50709a9d12..eaf1c90ec2d 100644 --- a/src/vs/workbench/api/common/apiCommands.ts +++ b/src/vs/workbench/api/common/apiCommands.ts @@ -16,7 +16,7 @@ import { IWorkspacesService, hasWorkspaceFileExtension, IRecent } from 'vs/platf import { Schemas } from 'vs/base/common/network'; import { ILogService } from 'vs/platform/log/common/log'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IViewDescriptorService, IViewsService } from 'vs/workbench/common/views'; +import { IViewDescriptorService, IViewsService, ViewVisibilityState } from 'vs/workbench/common/views'; // ----------------------------------------------------------------- // The following commands are registered on both sides separately. @@ -279,7 +279,7 @@ CommandsRegistry.registerCommand('_workbench.action.moveViews', async function ( for (const viewId of options.viewIds) { const viewDescriptor = viewDescriptorService.getViewDescriptorById(viewId); if (viewDescriptor?.canMoveView) { - viewDescriptorService.moveViewsToContainer([viewDescriptor], destination); + viewDescriptorService.moveViewsToContainer([viewDescriptor], destination, ViewVisibilityState.Default); } } diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index f4b3e26f92f..c49057e2f07 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -509,6 +509,11 @@ export function getVisbileViewContextKey(viewId: string): string { return `${vie export const IViewDescriptorService = createDecorator('viewDescriptorService'); +export enum ViewVisibilityState { + Default = 0, + Expand = 1 +} + export interface IViewDescriptorService { readonly _serviceBrand: undefined; @@ -535,7 +540,7 @@ export interface IViewDescriptorService { getViewLocationById(id: string): ViewContainerLocation | null; readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>; - moveViewsToContainer(views: IViewDescriptor[], viewContainer: ViewContainer): void; + moveViewsToContainer(views: IViewDescriptor[], viewContainer: ViewContainer, visibilityState?: ViewVisibilityState): void; readonly onDidChangeLocation: Event<{ views: IViewDescriptor[], from: ViewContainerLocation, to: ViewContainerLocation }>; moveViewToLocation(view: IViewDescriptor, location: ViewContainerLocation): void; diff --git a/src/vs/workbench/services/views/browser/viewDescriptorService.ts b/src/vs/workbench/services/views/browser/viewDescriptorService.ts index 7e0ef661f13..103094553fa 100644 --- a/src/vs/workbench/services/views/browser/viewDescriptorService.ts +++ b/src/vs/workbench/services/views/browser/viewDescriptorService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ViewContainerLocation, IViewDescriptorService, ViewContainer, IViewsRegistry, IViewContainersRegistry, IViewDescriptor, Extensions as ViewExtensions } from 'vs/workbench/common/views'; +import { ViewContainerLocation, IViewDescriptorService, ViewContainer, IViewsRegistry, IViewContainersRegistry, IViewDescriptor, Extensions as ViewExtensions, ViewVisibilityState } from 'vs/workbench/common/views'; import { IContextKey, RawContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IStorageService, StorageScope, IWorkspaceStorageChangeEvent } from 'vs/platform/storage/common/storage'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -166,7 +166,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor // This is needed when statically-registered views are moved to // other statically registered containers as they will both try to add on startup const viewsToAdd = containerData.views.filter(view => this.getViewContainerModel(viewContainer).allViewDescriptors.filter(vd => vd.id === view.id).length === 0); - this.addViews(viewContainer, viewsToAdd); + this.addViews(viewContainer, viewsToAdd, ViewVisibilityState.Default); } } @@ -197,7 +197,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor const viewContainer = this.viewsRegistry.getViewContainer(viewId); const viewDescriptor = this.getViewDescriptorById(viewId); if (viewContainer && viewDescriptor) { - this.addViews(viewContainer, [viewDescriptor]); + this.addViews(viewContainer, [viewDescriptor], ViewVisibilityState.Default); } } } @@ -330,7 +330,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor this.moveViewsToContainer([view], container); } - moveViewsToContainer(views: IViewDescriptor[], viewContainer: ViewContainer): void { + moveViewsToContainer(views: IViewDescriptor[], viewContainer: ViewContainer, visibilityState?: ViewVisibilityState): void { if (!views.length) { return; } @@ -339,7 +339,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor const to = viewContainer; if (from && to && from !== to) { - this.moveViews(views, from, to); + this.moveViews(views, from, to, visibilityState); this.cleanUpViewContainer(from.id); } } @@ -376,9 +376,9 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor return this.isGeneratedContainerId(viewContainerId) && !this.cachedViewContainerInfo.has(viewContainerId); } - private moveViews(views: IViewDescriptor[], from: ViewContainer, to: ViewContainer, skipCacheUpdate?: boolean): void { + private moveViews(views: IViewDescriptor[], from: ViewContainer, to: ViewContainer, visibilityState: ViewVisibilityState = ViewVisibilityState.Expand): void { this.removeViews(from, views); - this.addViews(to, views, true); + this.addViews(to, views, visibilityState); const oldLocation = this.getViewContainerLocation(from); const newLocation = this.getViewContainerLocation(to); @@ -389,46 +389,44 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor this._onDidChangeContainer.fire({ views, from, to }); - if (!skipCacheUpdate) { - this.saveViewPositionsToCache(); + this.saveViewPositionsToCache(); - const containerToString = (container: ViewContainer): string => { - if (container.id.startsWith(ViewDescriptorService.COMMON_CONTAINER_ID_PREFIX)) { - return 'custom'; - } - - if (!container.extensionId) { - return container.id; - } - - return 'extension'; - }; - - // Log on cache update to avoid duplicate events in other windows - const viewCount = views.length; - const fromContainer = containerToString(from); - const toContainer = containerToString(to); - const fromLocation = oldLocation === ViewContainerLocation.Panel ? 'panel' : 'sidebar'; - const toLocation = newLocation === ViewContainerLocation.Panel ? 'panel' : 'sidebar'; - - interface ViewDescriptorServiceMoveViewsEvent { - viewCount: number; - fromContainer: string; - toContainer: string; - fromLocation: string; - toLocation: string; + const containerToString = (container: ViewContainer): string => { + if (container.id.startsWith(ViewDescriptorService.COMMON_CONTAINER_ID_PREFIX)) { + return 'custom'; } - type ViewDescriptorServiceMoveViewsClassification = { - viewCount: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - fromContainer: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - toContainer: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - fromLocation: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - toLocation: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - }; + if (!container.extensionId) { + return container.id; + } - this.telemetryService.publicLog2('viewDescriptorService.moveViews', { viewCount, fromContainer, toContainer, fromLocation, toLocation }); + return 'extension'; + }; + + // Log on cache update to avoid duplicate events in other windows + const viewCount = views.length; + const fromContainer = containerToString(from); + const toContainer = containerToString(to); + const fromLocation = oldLocation === ViewContainerLocation.Panel ? 'panel' : 'sidebar'; + const toLocation = newLocation === ViewContainerLocation.Panel ? 'panel' : 'sidebar'; + + interface ViewDescriptorServiceMoveViewsEvent { + viewCount: number; + fromContainer: string; + toContainer: string; + fromLocation: string; + toLocation: string; } + + type ViewDescriptorServiceMoveViewsClassification = { + viewCount: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + fromContainer: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + toContainer: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + fromLocation: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + toLocation: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + }; + + this.telemetryService.publicLog2('viewDescriptorService.moveViews', { viewCount, fromContainer, toContainer, fromLocation, toLocation }); } private cleanUpViewContainer(viewContainerId: string): void { @@ -699,7 +697,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor // Add views that were registered prior to this view container const viewsToRegister = this.getViewsByContainer(viewContainer).filter(view => this.getDefaultContainerById(view.id) !== viewContainer); if (viewsToRegister.length) { - this.addViews(viewContainer, viewsToRegister); + this.addViews(viewContainer, viewsToRegister, ViewVisibilityState.Default); this.contextKeyService.bufferChangeEvents(() => { viewsToRegister.forEach(viewDescriptor => this.getOrCreateMovableViewContextKey(viewDescriptor).set(!!viewDescriptor.canMoveView)); }); @@ -751,7 +749,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor }); } - private addViews(container: ViewContainer, views: IViewDescriptor[], expandViews?: boolean): void { + private addViews(container: ViewContainer, views: IViewDescriptor[], visibilityState: ViewVisibilityState = ViewVisibilityState.Default): void { // Update in memory cache this.contextKeyService.bufferChangeEvents(() => { views.forEach(view => { @@ -760,7 +758,13 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor }); }); - this.getViewContainerModel(container).add(views.map(view => { return { viewDescriptor: view, collapsed: expandViews ? false : undefined, visible: expandViews }; })); + this.getViewContainerModel(container).add(views.map(view => { + return { + viewDescriptor: view, + collapsed: visibilityState === ViewVisibilityState.Default ? undefined : false, + visible: visibilityState === ViewVisibilityState.Default ? undefined : true + }; + })); } private removeViews(container: ViewContainer, views: IViewDescriptor[]): void {