From 8ddffb5cd222d1302d092c32df76de53c1e39ca7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 9 Feb 2018 18:01:09 +0100 Subject: [PATCH] fix some dnd issues after getting feedback --- src/vs/workbench/browser/dnd.ts | 17 +++++++++++------ .../electron-browser/views/explorerViewer.ts | 8 +++++--- .../electron-browser/views/openEditorsView.ts | 4 ++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index 94564d8d0ba..0a6cfa48fc6 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -373,7 +373,10 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: } // Resource URLs: allows to drop multiple resources to a target in VS Code (not directories) - event.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(sources.filter(s => !s.isDirectory).map(s => s.resource.toString()))); + const files = sources.filter(s => !s.isDirectory); + if (files.length) { + event.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(files.map(f => f.resource.toString()))); + } // Editors: enables cross window DND of tabs into the editor area const textFileService = accessor.get(ITextFileService); @@ -381,7 +384,7 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: const editorService = accessor.get(IWorkbenchEditorService); const draggedEditors: ISerializedDraggedEditor[] = []; - sources.forEach(source => { + files.forEach(file => { // Try to find editor view state from the visible editors that match given resource let viewState: IEditorViewState; @@ -391,7 +394,7 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: const codeEditor = getCodeEditor(editor); if (codeEditor) { const model = codeEditor.getModel(); - if (model && model.uri && model.uri.toString() === source.resource.toString()) { + if (model && model.uri && model.uri.toString() === file.resource.toString()) { viewState = codeEditor.saveViewState(); break; } @@ -400,13 +403,15 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: // Add as dragged editor draggedEditors.push({ - resource: source.resource.toString(), - backupResource: textFileService.isDirty(source.resource) ? backupFileService.toBackupResource(source.resource).toString() : void 0, + resource: file.resource.toString(), + backupResource: textFileService.isDirty(file.resource) ? backupFileService.toBackupResource(file.resource).toString() : void 0, viewState }); }); - event.dataTransfer.setData(CodeDataTransfers.EDITORS, JSON.stringify(draggedEditors)); + if (draggedEditors.length) { + event.dataTransfer.setData(CodeDataTransfers.EDITORS, JSON.stringify(draggedEditors)); + } } /** diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 070b7efd335..55174406507 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -50,7 +50,7 @@ import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; -import { extractResources, SimpleFileResourceDragAndDrop, CodeDataTransfers } from 'vs/workbench/browser/dnd'; +import { extractResources, SimpleFileResourceDragAndDrop, CodeDataTransfers, fillResourceDataTransfers } from 'vs/workbench/browser/dnd'; import { relative } from 'path'; import { distinctParents } from 'vs/base/common/resources'; import { WorkbenchTree, WorkbenchTreeController } from 'vs/platform/list/browser/listService'; @@ -729,12 +729,14 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { }); // Apply some datatransfer types to allow for dragging the element outside of the application - super.onDragStart(tree, data, originalEvent); + this.instantiationService.invokeFunction(fillResourceDataTransfers, sources, originalEvent); // The only custom data transfer we set from the explorer is a file transfer // to be able to DND between multiple code file explorers across windows const fileResources = sources.filter(s => !s.isDirectory && s.resource.scheme === Schemas.file).map(r => r.resource.fsPath); - originalEvent.dataTransfer.setData(CodeDataTransfers.FILES, JSON.stringify(fileResources)); + if (fileResources.length) { + originalEvent.dataTransfer.setData(CodeDataTransfers.FILES, JSON.stringify(fileResources)); + } } } diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts index 74ed85e14bf..545a0d341a2 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts @@ -544,16 +544,16 @@ class OpenEditorRenderer implements IRenderer { + const dragged = this.getSelectedElements().filter(e => e instanceof OpenEditor && !!e.getResource()); const dragImage = document.createElement('div'); e.dataTransfer.effectAllowed = 'copyMove'; dragImage.className = 'monaco-tree-drag-image'; - dragImage.textContent = editorTemplate.openEditor.editor.getName(); + dragImage.textContent = dragged.length === 1 ? editorTemplate.openEditor.editor.getName() : String(dragged.length); document.body.appendChild(dragImage); e.dataTransfer.setDragImage(dragImage, -10, -10); setTimeout(() => document.body.removeChild(dragImage), 0); - const dragged = this.getSelectedElements().filter(e => e instanceof OpenEditor && !!e.getResource()); this.transfer.setData(dragged, OpenEditor.prototype); if (editorTemplate.openEditor && editorTemplate.openEditor.editor) {