提交 cb123bcc 编写于 作者: J Joao Moreno

list: unpack drag and drop data

related to #66291
上级 4bbfaa2b
......@@ -76,55 +76,51 @@ const DefaultOptions = {
export class ElementsDragAndDropData<T> implements IDragAndDropData {
private elements: T[];
readonly elements: T[];
constructor(elements: T[]) {
this.elements = elements;
}
public update(dataTransfer: DataTransfer): void {
// no-op
}
update(): void { }
public getData(): any {
getData(): any {
return this.elements;
}
}
export class ExternalElementsDragAndDropData<T> implements IDragAndDropData {
private elements: T[];
readonly elements: T[];
constructor(elements: T[]) {
this.elements = elements;
}
public update(dataTransfer: DataTransfer): void {
// no-op
}
update(): void { }
public getData(): any {
getData(): any {
return this.elements;
}
}
export class DesktopDragAndDropData implements IDragAndDropData {
private types: any[];
private files: any[];
readonly types: any[];
readonly files: any[];
constructor() {
this.types = [];
this.files = [];
}
public update(dataTransfer: DataTransfer): void {
update(dataTransfer: DataTransfer): void {
if (dataTransfer.types) {
this.types = [...dataTransfer.types];
this.types.splice(0, this.types.length, ...dataTransfer.types);
}
if (dataTransfer.files) {
this.files = [];
this.files.splice(0, this.files.length);
for (let i = 0; i < dataTransfer.files.length; i++) {
const file = dataTransfer.files.item(i);
......@@ -136,7 +132,7 @@ export class DesktopDragAndDropData implements IDragAndDropData {
}
}
public getData(): any {
getData(): any {
return {
types: this.types,
files: this.files
......
......@@ -15,6 +15,7 @@ import { ITreeModel, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITre
import { ISpliceable } from 'vs/base/common/sequence';
import { IDragAndDropData } from 'vs/base/browser/dnd';
import { range } from 'vs/base/common/arrays';
import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView';
class TreeNodeListDragAndDrop<T, TFilterData, TRef> implements IListDragAndDrop<ITreeNode<T, TFilterData>> {
......@@ -42,7 +43,14 @@ class TreeNodeListDragAndDrop<T, TFilterData, TRef> implements IListDragAndDrop<
}
onDragOver(data: IDragAndDropData, targetNode: ITreeNode<T, TFilterData> | undefined, targetIndex: number | undefined, originalEvent: DragEvent, raw = true): boolean | IListDragOverReaction {
const result = this.dnd.onDragOver(data, targetNode && targetNode.element, targetIndex, originalEvent);
let treeData: IDragAndDropData = data;
if (data instanceof ElementsDragAndDropData) {
const nodes = (data as ElementsDragAndDropData<ITreeNode<T, TFilterData>>).elements;
treeData = new ElementsDragAndDropData(nodes.map(node => node.element));
}
const result = this.dnd.onDragOver(treeData, targetNode && targetNode.element, targetIndex, originalEvent);
const didChangeAutoExpandNode = this.autoExpandNode !== targetNode;
if (didChangeAutoExpandNode) {
......
......@@ -13,6 +13,8 @@ import { timeout, always } from 'vs/base/common/async';
import { IListStyles } from 'vs/base/browser/ui/list/listWidget';
import { toggleClass } from 'vs/base/browser/dom';
import { Iterator } from 'vs/base/common/iterator';
import { IDragAndDropData } from 'vs/base/browser/dnd';
import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView';
enum AsyncDataTreeNodeState {
Uninitialized,
......@@ -147,7 +149,14 @@ function asObjectTreeOptions<TInput, T, TFilterData>(options?: IAsyncDataTreeOpt
}
},
onDragOver(data, targetNode, targetIndex, originalEvent) {
return options.dnd!.onDragOver(data, targetNode && targetNode.element as T, targetIndex, originalEvent);
let treeData: IDragAndDropData = data;
if (data instanceof ElementsDragAndDropData) {
const nodes = (data as ElementsDragAndDropData<IAsyncDataTreeNode<TInput, T>>).elements;
treeData = new ElementsDragAndDropData(nodes.map(node => node.element));
}
return options.dnd!.onDragOver(treeData, targetNode && targetNode.element as T, targetIndex, originalEvent);
},
drop(data, targetNode, targetIndex, originalEvent) {
options.dnd!.drop(data, targetNode && targetNode.element as T, targetIndex, originalEvent);
......
......@@ -29,6 +29,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService';
import { IAsyncDataSource, ITreeMouseEvent, ITreeContextMenuEvent, ITreeDragAndDrop, ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree';
import { IDragAndDropData } from 'vs/base/browser/dnd';
import { onUnexpectedError } from 'vs/base/common/errors';
import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView';
const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024;
......@@ -264,9 +265,12 @@ class WatchExpressionsDragAndDrop implements ITreeDragAndDrop<IExpression> {
constructor(private debugService: IDebugService) { }
onDragOver(data: IDragAndDropData): boolean | ITreeDragOverReaction {
const draggedData = data.getData();
if (!(data instanceof ElementsDragAndDropData)) {
return false;
}
return Array.isArray(draggedData) && draggedData[0] && draggedData[0].element.element instanceof Expression;
const expressions = (data as ElementsDragAndDropData<IExpression>).elements;
return expressions.length > 0 && expressions[0] instanceof Expression;
}
getDragURI(element: IExpression): string | null {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册