Add drag and drop controller (#123542)

This commit is contained in:
Barbara Valdez
2021-05-14 02:09:04 -07:00
committed by GitHub
parent 2f500f0ce5
commit 1a78b7359e
6 changed files with 47 additions and 60 deletions

View File

@@ -84,7 +84,8 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape {
if (!options || !options.treeDataProvider) {
throw new Error('Options with treeDataProvider is mandatory');
}
const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, canDragAndDrop: !!options.canDragAndDrop });
const canDragAndDrop = options.dragAndDropController !== undefined;
const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, canDragAndDrop: canDragAndDrop });
const treeView = this.createExtHostTreeView(viewId, options, extension);
return {
get onDidCollapseElement() { return treeView.onDidCollapseElement; },
@@ -127,12 +128,12 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape {
return treeView.getChildren(treeItemHandle);
}
$setParent(treeViewId: string, treeItemHandles: string[], newParentItemHandle: string): Promise<void> {
$onDrop(treeViewId: string, treeItemHandles: string[], newParentItemHandle: string): Promise<void> {
const treeView = this.treeViews.get(treeViewId);
if (!treeView) {
return Promise.reject(new Error(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)));
}
return treeView.setParent(treeItemHandles, newParentItemHandle);
return treeView.onDrop(treeItemHandles, newParentItemHandle);
}
async $hasResolve(treeViewId: string): Promise<boolean> {
@@ -204,6 +205,7 @@ class ExtHostTreeView<T> extends Disposable {
private static readonly ID_HANDLE_PREFIX = '1';
private readonly dataProvider: vscode.TreeDataProvider<T>;
private readonly dndController: vscode.DragAndDropController<T> | undefined;
private roots: TreeNode[] | null = null;
private elements: Map<TreeItemHandle, T> = new Map<TreeItemHandle, T>();
@@ -250,6 +252,7 @@ class ExtHostTreeView<T> extends Disposable {
}
}
this.dataProvider = options.treeDataProvider;
this.dndController = options.dragAndDropController;
if (this.dataProvider.onDidChangeTreeData) {
this._register(this.dataProvider.onDidChangeTreeData(element => this._onDidChangeData.fire({ message: false, element })));
}
@@ -377,11 +380,11 @@ class ExtHostTreeView<T> extends Disposable {
}
}
setParent(treeItemHandleOrNodes: TreeItemHandle[], newParentHandleOrNode: TreeItemHandle): Promise<void> {
onDrop(treeItemHandleOrNodes: TreeItemHandle[], targetHandleOrNode: TreeItemHandle): Promise<void> {
const elements = <T[]>treeItemHandleOrNodes.map(item => this.getExtensionElement(item)).filter(element => !isUndefinedOrNull(element));
const newParentElement = this.getExtensionElement(newParentHandleOrNode);
if (this.dataProvider.setParent && elements && newParentElement) {
return asPromise(() => this.dataProvider.setParent!(elements, newParentElement));
const target = this.getExtensionElement(targetHandleOrNode);
if (elements && target) {
return asPromise(() => this.dndController?.onDrop(elements, target));
}
return Promise.resolve(undefined);
}