Incorporate tree dnd API feedback

Part of #32592
This commit is contained in:
Alex Ross
2021-11-17 13:09:18 +01:00
parent af67d7303c
commit daabfff185
10 changed files with 92 additions and 46 deletions

View File

@@ -1301,6 +1301,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
TestTag: extHostTypes.TestTag,
TestRunProfileKind: extHostTypes.TestRunProfileKind,
TextSearchCompleteMessageType: TextSearchCompleteMessageType,
TreeDataTransfer: extHostTypes.TreeDataTransfer,
TreeDataTransferItem: extHostTypes.TreeDataTransferItem,
CoveredCount: extHostTypes.CoveredCount,
FileCoverage: extHostTypes.FileCoverage,
StatementCoverage: extHostTypes.StatementCoverage,

View File

@@ -295,7 +295,7 @@ export interface MainThreadTextEditorsShape extends IDisposable {
}
export interface MainThreadTreeViewsShape extends IDisposable {
$registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean, canSelectMany: boolean, canDragAndDrop: boolean; }): Promise<void>;
$registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean, canSelectMany: boolean, dragAndDropMimeTypes: string[] }): Promise<void>;
$refresh(treeViewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem; }): Promise<void>;
$reveal(treeViewId: string, itemInfo: { item: ITreeItem, parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise<void>;
$setMessage(treeViewId: string, message: string): void;

View File

@@ -85,8 +85,8 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape {
if (!options || !options.treeDataProvider) {
throw new Error('Options with treeDataProvider is mandatory');
}
const canDragAndDrop = options.dragAndDropController !== undefined;
const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, canDragAndDrop: canDragAndDrop });
const dragAndDropMimeTypes = (options.dragAndDropController === undefined) ? [] : options.dragAndDropController.supportedMimeTypes;
const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, dragAndDropMimeTypes });
const treeView = this.createExtHostTreeView(viewId, options, extension);
return {
get onDidCollapseElement() { return treeView.onDidCollapseElement; },
@@ -139,9 +139,9 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape {
if ((sourceViewId === destinationViewId) && sourceTreeItemHandles) {
const additionalTransferItems = await treeView.onWillDrop(sourceTreeItemHandles);
if (additionalTransferItems) {
additionalTransferItems.items.forEach((value, key) => {
additionalTransferItems.forEach((value, key) => {
if (value) {
treeDataTransfer.items.set(key, value);
treeDataTransfer.set(key, value);
}
});
}

View File

@@ -2296,6 +2296,30 @@ export enum TreeItemCollapsibleState {
Expanded = 2
}
@es5ClassCompat
export class TreeDataTransferItem {
async asString(): Promise<string> {
return JSON.stringify(this._value);
}
constructor(private readonly _value: any) { }
}
@es5ClassCompat
export class TreeDataTransfer<T extends TreeDataTransferItem = TreeDataTransferItem> {
private readonly _items: Map<string, T> = new Map();
get(mimeType: string): T | undefined {
return this._items.get(mimeType);
}
set(mimeType: string, value: T): void {
this._items.set(mimeType, value);
}
forEach(callbackfn: (value: T, key: string) => void): void {
this._items.forEach(callbackfn);
}
}
@es5ClassCompat
export class ThemeIcon {

View File

@@ -16,11 +16,9 @@ export interface TreeDataTransferDTO {
export namespace TreeDataTransferConverter {
export function toITreeDataTransfer(value: TreeDataTransferDTO): ITreeDataTransfer {
const newDataTransfer: ITreeDataTransfer = {
items: new Map<string, ITreeDataTransferItem>()
};
const newDataTransfer: ITreeDataTransfer = new Map<string, ITreeDataTransferItem>();
value.types.forEach((type, index) => {
newDataTransfer.items.set(type, {
newDataTransfer.set(type, {
asString: async () => value.items[index].asString
});
});
@@ -32,7 +30,7 @@ export namespace TreeDataTransferConverter {
types: [],
items: []
};
const entries = Array.from(value.items.entries());
const entries = Array.from(value.entries());
for (const entry of entries) {
newDTO.types.push(entry[0]);
newDTO.items.push({