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

list: unpack drag and drop data

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