From e410a785b571c19c5f2f9f7bedb6fce2acfa1d77 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 23 Jan 2018 11:55:28 +0100 Subject: [PATCH] handle single folder case better --- .../workspace/node/workspaceEditingService.ts | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts index deed5f8603c6..8e5f3bbc3e52 100644 --- a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts @@ -72,10 +72,16 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { return this.removeFolders(foldersToDelete); } - // Add & Delete Folders (first remove and then add to allow for updating existing folders) - return this.removeFolders(foldersToDelete).then(() => { - return this.doAddFolders(foldersToAdd, index, donotNotifyError); - }); + // Add & Delete Folders + if (this.includesSingleFolderWorkspace(foldersToDelete)) { + // if we are in single-folder state and the folder is replaced with + // other folders, we handle this specially and just enter workspace + // mode with the folders that are being added. + return this.createAndEnterWorkspace(foldersToAdd); + } + + // Make sure to first remove folders and then add them to account for folders being updated + return this.removeFolders(foldersToDelete).then(() => this.doAddFolders(foldersToAdd, index, donotNotifyError)); } public addFolders(foldersToAdd: IWorkspaceFolderCreationData[], donotNotifyError: boolean = false): TPromise { @@ -108,12 +114,9 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { public removeFolders(foldersToRemove: URI[], donotNotifyError: boolean = false): TPromise { // If we are in single-folder state and the opened folder is to be removed, - // we close the workspace and enter the empty workspace state for the window. - if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { - const workspaceFolder = this.contextService.getWorkspace().folders[0]; - if (foldersToRemove.some(folder => isEqual(folder, workspaceFolder.uri, !isLinux))) { - return this.windowService.closeWorkspace(); - } + // we create an empty workspace and enter it. + if (this.includesSingleFolderWorkspace(foldersToRemove)) { + return this.createAndEnterWorkspace([]); } // Delegate removal of folders to workspace service otherwise @@ -121,6 +124,15 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { .then(() => null, error => donotNotifyError ? TPromise.wrapError(error) : this.handleWorkspaceConfigurationEditingError(error)); } + private includesSingleFolderWorkspace(folders: URI[]): boolean { + if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { + const workspaceFolder = this.contextService.getWorkspace().folders[0]; + return (folders.some(folder => isEqual(folder, workspaceFolder.uri, !isLinux))); + } + + return false; + } + public createAndEnterWorkspace(folders?: IWorkspaceFolderCreationData[], path?: string): TPromise { return this.doEnterWorkspace(() => this.windowService.createAndEnterWorkspace(folders, path)); }