Fix ModelView tree components to keep custom state (#11239)

* Fix ModelView tree components to keep custom state

* override postGetChildren

* deepClone
This commit is contained in:
Charles Gagnon
2020-07-08 13:05:54 -07:00
committed by GitHub
parent b3a01fcf77
commit ae908530e2
2 changed files with 41 additions and 3 deletions

View File

@@ -11,6 +11,24 @@ import { IModelViewTreeViewDataProvider, ITreeComponentItem } from 'sql/workbenc
import { INotificationService } from 'vs/platform/notification/common/notification';
// eslint-disable-next-line code-import-patterns
import * as vsTreeView from 'vs/workbench/api/browser/mainThreadTreeViews';
import { ResolvableTreeItem } from 'vs/workbench/common/views';
import { deepClone } from 'vs/base/common/objects';
export class ResolvableTreeComponentItem extends ResolvableTreeItem implements ITreeComponentItem {
checked?: boolean;
enabled?: boolean;
onCheckedChanged?: (checked: boolean) => void;
children?: ITreeComponentItem[];
constructor(treeItem: ITreeComponentItem, resolve?: (() => Promise<ITreeComponentItem | undefined>)) {
super(treeItem, resolve);
this.checked = treeItem.checked;
this.enabled = treeItem.enabled;
this.onCheckedChanged = treeItem.onCheckedChanged;
this.children = deepClone(treeItem.children);
}
}
export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implements IModelViewTreeViewDataProvider {
constructor(handle: number, treeViewId: string,
@@ -32,4 +50,24 @@ export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implem
refresh(itemsToRefreshByHandle: { [treeItemHandle: string]: ITreeComponentItem }) {
}
/**
* Returns the set of mapped ResolvableTreeComponentItems
* @override
* @param elements The elements to map
*/
protected async postGetChildren(elements: ITreeComponentItem[]): Promise<ResolvableTreeComponentItem[]> {
const result: ResolvableTreeComponentItem[] = [];
const hasResolve = await this.hasResolve;
if (elements) {
for (const element of elements) {
const resolvable = new ResolvableTreeComponentItem(element, hasResolve ? () => {
return this._proxy.$resolve(this.treeViewId, element.handle);
} : undefined);
this.itemsMap.set(element.handle, resolvable);
result.push(resolvable);
}
}
return result;
}
}