This commit is contained in:
Joao Moreno 2019-02-27 15:06:50 +01:00
parent 3ab8447bae
commit 9554d21148
6 changed files with 34 additions and 23 deletions

View file

@ -16,8 +16,8 @@ export interface IListVirtualDelegate<T> {
export interface IListRenderer<T, TTemplateData> {
templateId: string;
renderTemplate(container: HTMLElement): TTemplateData;
renderElement(element: T, index: number, templateData: TTemplateData): void;
disposeElement?(element: T, index: number, templateData: TTemplateData): void;
renderElement(element: T, index: number, templateData: TTemplateData, dynamicHeightProbing?: boolean): void;
disposeElement?(element: T, index: number, templateData: TTemplateData, dynamicHeightProbing?: boolean): void;
disposeTemplate(templateData: TTemplateData): void;
}

View file

@ -35,7 +35,7 @@ class PagedRenderer<TElement, TTemplateData> implements IListRenderer<number, IT
return { data, disposable: { dispose: () => { } } };
}
renderElement(index: number, _: number, data: ITemplateData<TTemplateData>): void {
renderElement(index: number, _: number, data: ITemplateData<TTemplateData>, dynamicHeightProbing?: boolean): void {
if (data.disposable) {
data.disposable.dispose();
}
@ -47,7 +47,7 @@ class PagedRenderer<TElement, TTemplateData> implements IListRenderer<number, IT
const model = this.modelProvider();
if (model.isResolved(index)) {
return this.renderer.renderElement(model.get(index), index, data.data);
return this.renderer.renderElement(model.get(index), index, data.data, dynamicHeightProbing);
}
const cts = new CancellationTokenSource();
@ -55,7 +55,7 @@ class PagedRenderer<TElement, TTemplateData> implements IListRenderer<number, IT
data.disposable = { dispose: () => cts.cancel() };
this.renderer.renderPlaceholder(index, data.data);
promise.then(entry => this.renderer.renderElement(entry, index, data.data!));
promise.then(entry => this.renderer.renderElement(entry, index, data.data!, dynamicHeightProbing));
}
disposeTemplate(data: ITemplateData<TTemplateData>): void {

View file

@ -1079,14 +1079,20 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
}
const size = item.size;
const renderer = this.renderers.get(item.templateId);
const row = this.cache.alloc(item.templateId);
row.domNode!.style.height = '';
this.rowsContainer.appendChild(row.domNode!);
const renderer = this.renderers.get(item.templateId);
if (renderer) {
renderer.renderElement(item.element, index, row.templateData);
renderer.renderElement(item.element, index, row.templateData, true);
if (renderer.disposeElement) {
renderer.disposeElement(item.element, index, row.templateData, true);
}
}
item.size = row.domNode!.offsetHeight;
item.lastDynamicHeightWidth = this.renderWidth;
this.rowsContainer.removeChild(row.domNode!);

View file

@ -976,20 +976,20 @@ class PipelineRenderer<T> implements IListRenderer<T, any> {
return this.renderers.map(r => r.renderTemplate(container));
}
renderElement(element: T, index: number, templateData: any[]): void {
renderElement(element: T, index: number, templateData: any[], dynamicHeightProbing?: boolean): void {
let i = 0;
for (const renderer of this.renderers) {
renderer.renderElement(element, index, templateData[i++]);
renderer.renderElement(element, index, templateData[i++], dynamicHeightProbing);
}
}
disposeElement(element: T, index: number, templateData: any[]): void {
disposeElement(element: T, index: number, templateData: any[], dynamicHeightProbing?: boolean): void {
let i = 0;
for (const renderer of this.renderers) {
if (renderer.disposeElement) {
renderer.disposeElement(element, index, templateData[i]);
renderer.disposeElement(element, index, templateData[i], dynamicHeightProbing);
}
i += 1;

View file

@ -233,23 +233,28 @@ class TreeRenderer<T, TFilterData, TTemplateData> implements IListRenderer<ITree
return { container, twistie, templateData };
}
renderElement(node: ITreeNode<T, TFilterData>, index: number, templateData: ITreeListTemplateData<TTemplateData>): void {
this.renderedNodes.set(node, templateData);
this.renderedElements.set(node.element, node);
renderElement(node: ITreeNode<T, TFilterData>, index: number, templateData: ITreeListTemplateData<TTemplateData>, dynamicHeightProbing?: boolean): void {
if (!dynamicHeightProbing) {
this.renderedNodes.set(node, templateData);
this.renderedElements.set(node.element, node);
}
const indent = TreeRenderer.DefaultIndent + (node.depth - 1) * this.indent;
templateData.twistie.style.marginLeft = `${indent}px`;
this.update(node, templateData);
this.renderer.renderElement(node, index, templateData.templateData);
this.renderer.renderElement(node, index, templateData.templateData, dynamicHeightProbing);
}
disposeElement(node: ITreeNode<T, TFilterData>, index: number, templateData: ITreeListTemplateData<TTemplateData>): void {
disposeElement(node: ITreeNode<T, TFilterData>, index: number, templateData: ITreeListTemplateData<TTemplateData>, dynamicHeightProbing?: boolean): void {
if (this.renderer.disposeElement) {
this.renderer.disposeElement(node, index, templateData.templateData);
this.renderer.disposeElement(node, index, templateData.templateData, dynamicHeightProbing);
}
if (!dynamicHeightProbing) {
this.renderedNodes.delete(node);
this.renderedElements.delete(node.element);
}
this.renderedNodes.delete(node);
this.renderedElements.delete(node.element);
}
disposeTemplate(templateData: ITreeListTemplateData<TTemplateData>): void {

View file

@ -87,8 +87,8 @@ class DataTreeRenderer<TInput, T, TFilterData, TTemplateData> implements ITreeRe
return { templateData };
}
renderElement(node: ITreeNode<IAsyncDataTreeNode<TInput, T>, TFilterData>, index: number, templateData: IDataTreeListTemplateData<TTemplateData>): void {
this.renderer.renderElement(new AsyncDataTreeNodeWrapper(node), index, templateData.templateData);
renderElement(node: ITreeNode<IAsyncDataTreeNode<TInput, T>, TFilterData>, index: number, templateData: IDataTreeListTemplateData<TTemplateData>, dynamicHeightProbing?: boolean): void {
this.renderer.renderElement(new AsyncDataTreeNodeWrapper(node), index, templateData.templateData, dynamicHeightProbing);
}
renderTwistie(element: IAsyncDataTreeNode<TInput, T>, twistieElement: HTMLElement): boolean {
@ -96,9 +96,9 @@ class DataTreeRenderer<TInput, T, TFilterData, TTemplateData> implements ITreeRe
return false;
}
disposeElement(node: ITreeNode<IAsyncDataTreeNode<TInput, T>, TFilterData>, index: number, templateData: IDataTreeListTemplateData<TTemplateData>): void {
disposeElement(node: ITreeNode<IAsyncDataTreeNode<TInput, T>, TFilterData>, index: number, templateData: IDataTreeListTemplateData<TTemplateData>, dynamicHeightProbing?: boolean): void {
if (this.renderer.disposeElement) {
this.renderer.disposeElement(new AsyncDataTreeNodeWrapper(node), index, templateData.templateData);
this.renderer.disposeElement(new AsyncDataTreeNodeWrapper(node), index, templateData.templateData, dynamicHeightProbing);
}
}