Skip to content

Commit c1d726b

Browse files
Implement files.dialog.homePath setting (fix microsoft#115730) (microsoft#182908)
* Implement `workbench.fileDialog.homePath` setting (fix microsoft#115730) * Make it work with TestResolver remote * Rename setting to `files.dialog.homePath` * Add `preferredHome` to `IFileDialogService` so SimpleFileDialog can use it * Improve setting description following feedback from @alexr00 * Ignore home override when doing ~ replacement * Stop preferredHome falling back to user-local setting when working remote * Eliminate preferredHome hack
1 parent 70a4e12 commit c1d726b

File tree

5 files changed

+36
-5
lines changed

5 files changed

+36
-5
lines changed

src/vs/platform/dialogs/common/dialogs.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,13 @@ export interface IFileDialogService {
546546
*/
547547
pickFileToSave(defaultUri: URI, availableFileSystems?: string[]): Promise<URI | undefined>;
548548

549+
/**
550+
* The preferred folder path to open the dialog at.
551+
* @param schemeFilter The scheme of the file path. If no filter given, the scheme of the current window is used.
552+
* Falls back to user home in the absence of a setting.
553+
*/
554+
preferredHome(schemeFilter?: string): Promise<URI>;
555+
549556
/**
550557
* Shows a save file dialog and returns the chosen file URI.
551558
*/

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,11 @@ configurationRegistry.registerConfiguration({
323323
'default': 'askUser',
324324
'scope': ConfigurationScope.LANGUAGE_OVERRIDABLE
325325
},
326+
'files.dialog.homePath': {
327+
'type': 'string',
328+
'description': nls.localize('fileDialogHomePath', "Default path for file dialogs, overriding user's home path. Only used in the absence of a context-specific path, such as most recently opened file or folder."),
329+
'scope': ConfigurationScope.MACHINE
330+
},
326331
'files.simpleDialog.enable': {
327332
'type': 'boolean',
328333
'description': nls.localize('files.simpleDialog.enable', "Enables the simple file dialog for opening and saving files and folders. The simple file dialog replaces the system file dialog when enabled."),

src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export abstract class AbstractFileDialogService implements IFileDialogService {
6969
}
7070

7171
if (!candidate) {
72-
candidate = await this.pathService.userHome({ preferLocal: schemeFilter === Schemas.file });
72+
candidate = await this.preferredHome(schemeFilter);
7373
}
7474

7575
return candidate;
@@ -86,12 +86,25 @@ export abstract class AbstractFileDialogService implements IFileDialogService {
8686
}
8787

8888
if (!candidate) {
89-
return this.pathService.userHome({ preferLocal: schemeFilter === Schemas.file });
89+
return this.preferredHome(schemeFilter);
9090
}
9191

9292
return resources.dirname(candidate);
9393
}
9494

95+
async preferredHome(schemeFilter = this.getSchemeFilterForWindow()): Promise<URI> {
96+
// Seek a user-local or user-remote machine-scoped override path string depending on whether caller wants a local or a remote home
97+
const inspectedValue = this.configurationService.inspect<string>('files.dialog.homePath');
98+
const dialogHomePath = schemeFilter === Schemas.file ? inspectedValue.userLocalValue : inspectedValue.userRemoteValue;
99+
const userHomePromise = this.pathService.userHome({ preferLocal: schemeFilter === Schemas.file });
100+
if (!dialogHomePath) {
101+
return userHomePromise;
102+
}
103+
104+
const resource = await this.pathService.fileURI(dialogHomePath);
105+
return resources.toLocalResource(resource, this.environmentService.remoteAuthority, this.pathService.defaultUriScheme);
106+
}
107+
95108
async defaultWorkspacePath(schemeFilter = this.getSchemeFilterForWindow()): Promise<URI> {
96109
let defaultWorkspacePath: URI | undefined;
97110

src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ export class SimpleFileDialog implements ISimpleFileDialog {
121121
private autoCompletePathSegment: string = '';
122122
private activeItem: FileQuickPickItem | undefined;
123123
private userHome!: URI;
124+
private trueHome!: URI;
124125
private isWindows: boolean = false;
125126
private badPath: string | undefined;
126127
private remoteAgentEnvironment: IRemoteAgentEnvironment | null | undefined;
@@ -167,6 +168,7 @@ export class SimpleFileDialog implements ISimpleFileDialog {
167168
public async showOpenDialog(options: IOpenDialogOptions = {}): Promise<URI | undefined> {
168169
this.scheme = this.getScheme(options.availableFileSystems, options.defaultUri);
169170
this.userHome = await this.getUserHome();
171+
this.trueHome = await this.getUserHome(true);
170172
const newOptions = this.getOptions(options);
171173
if (!newOptions) {
172174
return Promise.resolve(undefined);
@@ -178,6 +180,7 @@ export class SimpleFileDialog implements ISimpleFileDialog {
178180
public async showSaveDialog(options: ISaveDialogOptions): Promise<URI | undefined> {
179181
this.scheme = this.getScheme(options.availableFileSystems, options.defaultUri);
180182
this.userHome = await this.getUserHome();
183+
this.trueHome = await this.getUserHome(true);
181184
this.requiresTrailing = true;
182185
const newOptions = this.getOptions(options, true);
183186
if (!newOptions) {
@@ -248,8 +251,10 @@ export class SimpleFileDialog implements ISimpleFileDialog {
248251
return this.remoteAgentEnvironment;
249252
}
250253

251-
protected getUserHome(): Promise<URI> {
252-
return this.pathService.userHome({ preferLocal: this.scheme === Schemas.file });
254+
protected getUserHome(trueHome = false): Promise<URI> {
255+
return trueHome
256+
? this.pathService.userHome({ preferLocal: this.scheme === Schemas.file })
257+
: this.fileDialogService.preferredHome(this.scheme);
253258
}
254259

255260
private async pickResource(isSave: boolean = false): Promise<URI | undefined> {
@@ -552,7 +557,7 @@ export class SimpleFileDialog implements ISimpleFileDialog {
552557
}
553558

554559
private tildaReplace(value: string): URI {
555-
const home = this.userHome;
560+
const home = this.trueHome;
556561
if ((value.length > 0) && (value[0] === '~')) {
557562
return resources.joinPath(home, value.substring(1));
558563
}

src/vs/workbench/test/browser/workbenchTestServices.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ export class TestFileDialogService implements IFileDialogService {
561561
async defaultFilePath(_schemeFilter?: string): Promise<URI> { return this.pathService.userHome(); }
562562
async defaultFolderPath(_schemeFilter?: string): Promise<URI> { return this.pathService.userHome(); }
563563
async defaultWorkspacePath(_schemeFilter?: string): Promise<URI> { return this.pathService.userHome(); }
564+
async preferredHome(_schemeFilter?: string): Promise<URI> { return this.pathService.userHome(); }
564565
pickFileFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> { return Promise.resolve(0); }
565566
pickFileAndOpen(_options: IPickAndOpenOptions): Promise<any> { return Promise.resolve(0); }
566567
pickFolderAndOpen(_options: IPickAndOpenOptions): Promise<any> { return Promise.resolve(0); }

0 commit comments

Comments
 (0)