Skip to content

Commit 2527596

Browse files
authored
Save untitled files to the last active folder (#13184)
1 parent cdbfffc commit 2527596

File tree

4 files changed

+38
-5
lines changed

4 files changed

+38
-5
lines changed

packages/core/src/browser/frontend-application-module.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,7 @@ export const frontendApplicationModule = new ContainerModule((bind, _unbind, _is
445445

446446
bind(SaveResourceService).toSelf().inSingletonScope();
447447
bind(UserWorkingDirectoryProvider).toSelf().inSingletonScope();
448+
bind(FrontendApplicationContribution).toService(UserWorkingDirectoryProvider);
448449

449450
bind(HoverService).toSelf().inSingletonScope();
450451

packages/core/src/browser/user-working-directory-provider.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,34 @@
1616

1717
import { inject, injectable } from 'inversify';
1818
import URI from '../common/uri';
19-
import { MaybePromise, SelectionService, UriSelection } from '../common';
19+
import { MaybePromise, SelectionService, UNTITLED_SCHEME, UriSelection } from '../common';
2020
import { EnvVariablesServer } from '../common/env-variables';
21+
import { FrontendApplication } from './frontend-application';
22+
import { FrontendApplicationContribution } from './frontend-application-contribution';
23+
import { Widget } from './widgets';
24+
import { Navigatable } from './navigatable-types';
2125

2226
@injectable()
23-
export class UserWorkingDirectoryProvider {
27+
export class UserWorkingDirectoryProvider implements FrontendApplicationContribution {
2428
@inject(SelectionService) protected readonly selectionService: SelectionService;
2529
@inject(EnvVariablesServer) protected readonly envVariables: EnvVariablesServer;
2630

31+
protected lastOpenResource: URI | undefined;
32+
33+
configure(app: FrontendApplication): void {
34+
app.shell.onDidChangeCurrentWidget(e => this.setLastOpenResource(e.newValue ?? undefined));
35+
this.setLastOpenResource(app.shell.currentWidget);
36+
}
37+
38+
protected setLastOpenResource(widget?: Widget): void {
39+
if (Navigatable.is(widget)) {
40+
const uri = widget.getResourceUri();
41+
if (uri && uri.scheme !== UNTITLED_SCHEME) {
42+
this.lastOpenResource = uri;
43+
}
44+
}
45+
}
46+
2747
/**
2848
* @returns A {@link URI} that represents a good guess about the directory in which the user is currently operating.
2949
*
@@ -35,7 +55,16 @@ export class UserWorkingDirectoryProvider {
3555
}
3656

3757
protected getFromSelection(): MaybePromise<URI | undefined> {
38-
return this.ensureIsDirectory(UriSelection.getUri(this.selectionService.selection));
58+
const uri = UriSelection.getUri(this.selectionService.selection);
59+
if (uri?.scheme === UNTITLED_SCHEME) {
60+
// An untitled file is not a valid working directory context.
61+
return undefined;
62+
}
63+
return this.ensureIsDirectory(uri);
64+
}
65+
66+
protected getFromLastOpenResource(): MaybePromise<URI | undefined> {
67+
return this.ensureIsDirectory(this.lastOpenResource);
3968
}
4069

4170
protected getFromUserHome(): MaybePromise<URI> {

packages/filesystem/src/browser/file-dialog/file-dialog-service.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import { injectable, inject } from '@theia/core/shared/inversify';
1818
import URI from '@theia/core/lib/common/uri';
19-
import { MaybeArray, nls } from '@theia/core/lib/common';
19+
import { MaybeArray, UNTITLED_SCHEME, nls } from '@theia/core/lib/common';
2020
import { LabelProvider } from '@theia/core/lib/browser';
2121
import { FileStat } from '../../common/files';
2222
import { DirNode } from '../file-tree';
@@ -81,7 +81,9 @@ export class DefaultFileDialogService implements FileDialogService {
8181
}
8282

8383
protected async getRootNode(folderToOpen?: FileStat): Promise<DirNode | undefined> {
84-
const folderExists = folderToOpen && await this.fileService.exists(folderToOpen.resource);
84+
const folderExists = folderToOpen
85+
&& folderToOpen.resource.scheme !== UNTITLED_SCHEME
86+
&& await this.fileService.exists(folderToOpen.resource);
8587
const folder = folderToOpen && folderExists ? folderToOpen : {
8688
resource: await this.rootProvider.getUserWorkingDir(),
8789
isDirectory: true

packages/workspace/src/browser/workspace-user-working-directory-provider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export class WorkspaceUserWorkingDirectoryProvider extends UserWorkingDirectoryP
2828

2929
override async getUserWorkingDir(): Promise<URI> {
3030
return await this.getFromSelection()
31+
?? await this.getFromLastOpenResource()
3132
?? await this.getFromWorkspace()
3233
?? this.getFromUserHome();
3334
}

0 commit comments

Comments
 (0)