Fix dragging a folder from the the explorer tree to terminal no longer copies folder path (#128419)

* Fixes #128283

* 🧹 some cleanup
This commit is contained in:
Jean Pierre 2021-07-26 12:17:19 -05:00 committed by GitHub
parent 4d4c5f80bf
commit c093b78c9f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 29 deletions

View file

@ -56,9 +56,8 @@ import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/plat
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
import { isMacintosh, isWindows, OperatingSystem, OS } from 'vs/base/common/platform';
import { URI } from 'vs/base/common/uri';
import { Schemas } from 'vs/base/common/network';
import { DataTransfers } from 'vs/base/browser/dnd';
import { containsDragType, DragAndDropObserver, IDragAndDropObserverCallbacks } from 'vs/workbench/browser/dnd';
import { CodeDataTransfers, containsDragType, DragAndDropObserver, IDragAndDropObserverCallbacks } from 'vs/workbench/browser/dnd';
import { getColorClass } from 'vs/workbench/contrib/terminal/browser/terminalIcon';
import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService';
import { Orientation } from 'vs/base/browser/ui/sash/sash';
@ -2024,7 +2023,7 @@ class TerminalInstanceDragAndDropController extends Disposable implements IDragA
}
onDragEnter(e: DragEvent) {
if (!containsDragType(e, DataTransfers.FILES, DataTransfers.RESOURCES, DataTransfers.TERMINALS)) {
if (!containsDragType(e, DataTransfers.FILES, DataTransfers.RESOURCES, DataTransfers.TERMINALS, CodeDataTransfers.FILES)) {
return;
}
@ -2085,17 +2084,17 @@ class TerminalInstanceDragAndDropController extends Disposable implements IDragA
// Check if files were dragged from the tree explorer
let path: string | undefined;
const resources = e.dataTransfer.getData(DataTransfers.RESOURCES);
if (resources) {
const uri = URI.parse(JSON.parse(resources)[0]);
if (uri.scheme === Schemas.vscodeTerminal) {
const side = this._getDropSide(e);
this._onDropTerminal.fire({ uri, side });
return;
} else {
path = uri.fsPath;
}
} else if (e.dataTransfer.files.length > 0 && e.dataTransfer.files[0].path /* Electron only */) {
const rawResources = e.dataTransfer.getData(DataTransfers.RESOURCES);
if (rawResources) {
path = URI.parse(JSON.parse(rawResources)[0]).fsPath;
}
const rawCodeFiles = e.dataTransfer.getData(CodeDataTransfers.FILES);
if (!path && rawCodeFiles) {
path = URI.file(JSON.parse(rawCodeFiles)[0]).fsPath;
}
if (!path && e.dataTransfer.files.length > 0 && e.dataTransfer.files[0].path /* Electron only */) {
// Check if the file was dragged from the filesystem
path = URI.file(e.dataTransfer.files[0].path).fsPath;
}

View file

@ -33,7 +33,6 @@ import { disposableTimeout } from 'vs/base/common/async';
import { ElementsDragAndDropData, NativeDragAndDropData } from 'vs/base/browser/ui/list/listView';
import { URI } from 'vs/base/common/uri';
import { getColorClass, getIconId, getUriClasses } from 'vs/workbench/contrib/terminal/browser/terminalIcon';
import { Schemas } from 'vs/base/common/network';
import { IEditableData } from 'vs/workbench/common/views';
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
import { InputBox, MessageType } from 'vs/base/browser/ui/inputbox/inputBox';
@ -41,10 +40,9 @@ import { once } from 'vs/base/common/functional';
import { attachInputBoxStyler } from 'vs/platform/theme/common/styler';
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { KeyCode } from 'vs/base/common/keyCodes';
import { containsDragType } from 'vs/workbench/browser/dnd';
import { CodeDataTransfers, containsDragType } from 'vs/workbench/browser/dnd';
import { terminalStrings } from 'vs/workbench/contrib/terminal/common/terminalStrings';
import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { IProcessDetails } from 'vs/platform/terminal/common/terminalProcess';
import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey';
import { getTerminalResourcesFromDragEvent, parseTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri';
@ -545,16 +543,12 @@ class TerminalTabsDragAndDrop implements IListDragAndDrop<ITerminalInstance> {
@ITerminalService private readonly _terminalService: ITerminalService,
@ITerminalGroupService private readonly _terminalGroupService: ITerminalGroupService,
@ITerminalInstanceService private readonly _terminalInstanceService: ITerminalInstanceService,
@IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService
) {
this._offProcessTerminalService = _terminalService.getOffProcessTerminalService();
}
getDragURI(instance: ITerminalInstance): string | null {
return URI.from({
scheme: Schemas.vscodeTerminal,
path: `/${this._workspaceContextService.getWorkspace().id}/${instance.instanceId.toString()}`
}).toString();
return instance.resource.toString();
}
getDragLabel?(elements: ITerminalInstance[], originalEvent: DragEvent): string | undefined {
@ -579,13 +573,12 @@ class TerminalTabsDragAndDrop implements IListDragAndDrop<ITerminalInstance> {
const terminals: ITerminalInstance[] = dndData.filter(e => 'instanceId' in (e as any));
if (terminals.length > 0) {
originalEvent.dataTransfer.setData(DataTransfers.TERMINALS, JSON.stringify(terminals.map(e => e.resource.toString())));
originalEvent.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(terminals.map(e => e.resource.toString())));
}
}
onDragOver(data: IDragAndDropData, targetInstance: ITerminalInstance | undefined, targetIndex: number | undefined, originalEvent: DragEvent): boolean | IListDragOverReaction {
if (data instanceof NativeDragAndDropData) {
if (!containsDragType(originalEvent, DataTransfers.FILES, DataTransfers.RESOURCES, DataTransfers.TERMINALS)) {
if (!containsDragType(originalEvent, DataTransfers.FILES, DataTransfers.RESOURCES, DataTransfers.TERMINALS, CodeDataTransfers.FILES)) {
return false;
}
}
@ -634,6 +627,9 @@ class TerminalTabsDragAndDrop implements IListDragAndDrop<ITerminalInstance> {
}
}
}
}
if (promises.length) {
let processes = await Promise.all(promises);
processes = processes.filter(p => p !== undefined);
let lastInstance: ITerminalInstance | undefined;
@ -687,10 +683,17 @@ class TerminalTabsDragAndDrop implements IListDragAndDrop<ITerminalInstance> {
// Check if files were dragged from the tree explorer
let path: string | undefined;
const resources = e.dataTransfer.getData(DataTransfers.RESOURCES);
if (resources) {
path = URI.parse(JSON.parse(resources)[0]).fsPath;
} else if (e.dataTransfer.files.length > 0 && e.dataTransfer.files[0].path /* Electron only */) {
const rawResources = e.dataTransfer.getData(DataTransfers.RESOURCES);
if (rawResources) {
path = URI.parse(JSON.parse(rawResources)[0]).fsPath;
}
const rawCodeFiles = e.dataTransfer.getData(CodeDataTransfers.FILES);
if (!path && rawCodeFiles) {
path = URI.file(JSON.parse(rawCodeFiles)[0]).fsPath;
}
if (!path && e.dataTransfer.files.length > 0 && e.dataTransfer.files[0].path /* Electron only */) {
// Check if the file was dragged from the filesystem
path = URI.file(e.dataTransfer.files[0].path).fsPath;
}

View file

@ -494,7 +494,6 @@ class SingleTerminalTabActionViewItem extends MenuEntryActionViewItem {
this._elementDisposables.push(dom.addDisposableListener(this.element, dom.EventType.DRAG_START, e => {
const instance = this._terminalGroupService.activeInstance;
if (e.dataTransfer && instance) {
e.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify([instance.resource.toString()]));
e.dataTransfer.setData(DataTransfers.TERMINALS, JSON.stringify([instance.resource.toString()]));
}
}));