Skip to content

Commit a42f794

Browse files
author
Benjamin Pasero
committed
Add confirmation window while drag-dropping project files in the "Explore" panel (fixes microsoft#1414)
1 parent e956039 commit a42f794

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,11 @@ configurationRegistry.registerConfiguration({
328328
'description': nls.localize('enableDragAndDrop', "Controls if the explorer should allow to move files and folders via drag and drop."),
329329
'default': true
330330
},
331+
'explorer.confirmDragAndDrop': {
332+
'type': 'boolean',
333+
'description': nls.localize('confirmDragAndDrop', "Controls if the explorer should ask for confirmation when moving files or folders around via drag and drop."),
334+
'default': true
335+
},
331336
'explorer.confirmDelete': {
332337
'type': 'boolean',
333338
'description': nls.localize('confirmDelete', "Controls if the explorer should ask for confirmation when deleting a file via the trash."),

src/vs/workbench/parts/files/browser/views/explorerViewer.ts

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
4141
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
4242
import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView';
4343
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
44-
import { IMessageService, IConfirmation, Severity } from 'vs/platform/message/common/message';
44+
import { IMessageService, IConfirmation, Severity, IConfirmationResult } from 'vs/platform/message/common/message';
4545
import { IProgressService } from 'vs/platform/progress/common/progress';
4646
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
4747
import { KeyCode } from 'vs/base/common/keyCodes';
@@ -57,6 +57,7 @@ import { distinct } from 'vs/base/common/arrays';
5757
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
5858
import { getPathLabel } from 'vs/base/common/labels';
5959
import { extractResources } from 'vs/base/browser/dnd';
60+
import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing';
6061

6162
export class FileDataSource implements IDataSource {
6263
constructor(
@@ -728,6 +729,9 @@ export class FileFilter implements IFilter {
728729

729730
// Explorer Drag And Drop Controller
730731
export class FileDragAndDrop extends SimpleFileResourceDragAndDrop {
732+
733+
private static CONFIRM_DND_SETTING_KEY = 'explorer.confirmDragAndDrop';
734+
731735
private toDispose: IDisposable[];
732736
private dropEnabled: boolean;
733737

@@ -742,7 +746,8 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop {
742746
@IBackupFileService private backupFileService: IBackupFileService,
743747
@IWindowService private windowService: IWindowService,
744748
@IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService,
745-
@IEnvironmentService private environmentService: IEnvironmentService
749+
@IEnvironmentService private environmentService: IEnvironmentService,
750+
@IConfigurationEditingService private configurationEditingService: IConfigurationEditingService
746751
) {
747752
super(stat => this.statToResource(stat));
748753

@@ -947,6 +952,41 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop {
947952
const source: FileStat = data.getData()[0];
948953
const isCopy = (originalEvent.ctrlKey && !isMacintosh) || (originalEvent.altKey && isMacintosh);
949954

955+
let confirmPromise: TPromise<IConfirmationResult>;
956+
957+
// Handle confirm setting
958+
const confirmDragAndDrop = !isCopy && this.configurationService.lookup<boolean>(FileDragAndDrop.CONFIRM_DND_SETTING_KEY).value;
959+
if (confirmDragAndDrop) {
960+
confirmPromise = this.messageService.confirm({
961+
message: nls.localize('confirmMove', "Are you sure you want to move '{0}'?", source.name),
962+
checkbox: {
963+
label: nls.localize('doNotAskAgain', "Do not ask me again")
964+
},
965+
type: 'question'
966+
});
967+
} else {
968+
confirmPromise = TPromise.as({ confirmed: true } as IConfirmationResult);
969+
}
970+
971+
return confirmPromise.then(confirmation => {
972+
973+
// Check for confirmation checkbox
974+
let updateConfirmSettingsPromise: TPromise<void> = TPromise.as(void 0);
975+
if (confirmation.checkboxChecked === true) {
976+
updateConfirmSettingsPromise = this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: FileDragAndDrop.CONFIRM_DND_SETTING_KEY, value: false });
977+
}
978+
979+
return updateConfirmSettingsPromise.then(() => {
980+
if (confirmation.confirmed) {
981+
return this.doHandleExplorerDrop(tree, data, source, target, isCopy);
982+
}
983+
984+
return TPromise.as(void 0);
985+
});
986+
});
987+
}
988+
989+
private doHandleExplorerDrop(tree: ITree, data: IDragAndDropData, source: FileStat, target: FileStat, isCopy: boolean): TPromise<void> {
950990
return tree.expand(target).then(() => {
951991

952992
// Reuse duplicate action if user copies

0 commit comments

Comments
 (0)