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

list: disposeElement

上级 044d192d
......@@ -14,7 +14,7 @@ export interface IRenderer<TElement, TTemplateData> {
templateId: string;
renderTemplate(container: HTMLElement): TTemplateData;
renderElement(element: TElement, index: number, templateData: TTemplateData): void;
disposeElement?(element: TElement, index: number, templateData: TTemplateData): void;
disposeElement(element: TElement, index: number, templateData: TTemplateData): void;
disposeTemplate(templateData: TTemplateData): void;
}
......
......@@ -50,6 +50,10 @@ class PagedRenderer<TElement, TTemplateData> implements IRenderer<number, ITempl
promise.done(entry => this.renderer.renderElement(entry, index, data.data));
}
disposeElement(): void {
// noop
}
disposeTemplate(data: ITemplateData<TTemplateData>): void {
data.disposable.dispose();
data.disposable = null;
......
......@@ -68,6 +68,10 @@ class TraitRenderer<T> implements IRenderer<T, ITraitTemplateData>
this.trait.renderIndex(index, templateData);
}
disposeElement(): void {
// noop
}
splice(start: number, deleteCount: number, insertCount: number): void {
const rendered: IRenderedContainer[] = [];
......@@ -807,6 +811,14 @@ class PipelineRenderer<T> implements IRenderer<T, any> {
}
}
disposeElement(element: T, index: number, templateData: any[]): void {
let i = 0;
for (const renderer of this.renderers) {
renderer.disposeElement(element, index, templateData[i++]);
}
}
disposeTemplate(templateData: any[]): void {
let i = 0;
......
......@@ -67,6 +67,10 @@ class SelectListRenderer implements IRenderer<ISelectOptionItem, ISelectListTemp
}
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: ISelectListTemplateData): void {
templateData.disposables = dispose(templateData.disposables);
}
......
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import 'vs/css!./tree';
import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IListOptions, List, IIdentityProvider, IMultipleSelectionController } from 'vs/base/browser/ui/list/listWidget';
import { TreeModel, ITreeNode, ITreeElement, getNodeLocation } from 'vs/base/browser/ui/tree/treeModel';
import { IIterator, empty } from 'vs/base/common/iterator';
......@@ -60,7 +60,6 @@ class TreeDelegate<T> implements IDelegate<ITreeNode<T>> {
interface ITreeListTemplateData<T> {
twistie: HTMLElement;
elementDisposable: IDisposable;
templateData: T;
}
......@@ -92,14 +91,11 @@ class TreeRenderer<T, TTemplateData> implements IRenderer<ITreeNode<T>, ITreeLis
const contents = append(el, $('.tl-contents'));
const templateData = this.renderer.renderTemplate(contents);
return { twistie, elementDisposable: Disposable.None, templateData };
return { twistie, templateData };
}
renderElement(node: ITreeNode<T>, index: number, templateData: ITreeListTemplateData<TTemplateData>): void {
templateData.elementDisposable.dispose();
this.renderedNodes.set(node, templateData);
templateData.elementDisposable = toDisposable(() => this.renderedNodes.delete(node));
templateData.twistie.style.width = `${10 + node.depth * 10}px`;
renderTwistie(node, templateData.twistie);
......@@ -107,6 +103,10 @@ class TreeRenderer<T, TTemplateData> implements IRenderer<ITreeNode<T>, ITreeLis
this.renderer.renderElement(node.element, index, templateData.templateData);
}
disposeElement(node: ITreeNode<T>): void {
this.renderedNodes.delete(node);
}
disposeTemplate(templateData: ITreeListTemplateData<TTemplateData>): void {
this.renderer.disposeTemplate(templateData.templateData);
}
......
......@@ -165,6 +165,8 @@ export class TreeModel<T> {
node.collapsed = collapsed;
if (visible) {
this._onDidChangeCollapseState.fire(node);
let visibleCountDiff: number;
if (collapsed) {
......@@ -185,8 +187,6 @@ export class TreeModel<T> {
mutableNode.visibleCount += visibleCountDiff;
mutableNode = mutableNode.parent;
}
this._onDidChangeCollapseState.fire(node);
}
return true;
......
......@@ -25,6 +25,7 @@ suite('ListView', function () {
templateId: 'template',
renderTemplate() { templatesCount++; },
renderElement() { },
disposeElement() { },
disposeTemplate() { templatesCount--; }
};
......
......@@ -173,7 +173,10 @@ class Renderer implements IRenderer<ICompletionItem, ISuggestionTemplateData> {
data.readMore.onmousedown = null;
data.readMore.onclick = null;
}
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: ISuggestionTemplateData): void {
......
......@@ -278,6 +278,10 @@ export class NotificationRenderer implements IRenderer<INotificationViewItem, IN
data.renderer.setInput(notification);
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: INotificationTemplateData): void {
templateData.toDispose = dispose(templateData.toDispose);
}
......
......@@ -127,6 +127,10 @@ class ListElementRenderer implements IRenderer<ListElement, IListElementTemplate
data.detail.set(element.item.detail, detailHighlights);
}
disposeElement(): void {
// noop
}
disposeTemplate(data: IListElementTemplateData): void {
data.toDisposeElement = dispose(data.toDisposeElement);
data.toDisposeTemplate = dispose(data.toDisposeTemplate);
......
......@@ -338,6 +338,10 @@ class BreakpointsRenderer implements IRenderer<IBreakpoint, IBreakpointTemplateD
}
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: IBreakpointTemplateData): void {
dispose(templateData.toDispose);
}
......@@ -383,6 +387,10 @@ class ExceptionBreakpointsRenderer implements IRenderer<IExceptionBreakpoint, IB
data.checkbox.checked = exceptionBreakpoint.enabled;
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: IBaseBreakpointTemplateData): void {
dispose(templateData.toDispose);
}
......@@ -440,6 +448,10 @@ class FunctionBreakpointsRenderer implements IRenderer<FunctionBreakpoint, IBase
}
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: IBaseBreakpointWithIconTemplateData): void {
dispose(templateData.toDispose);
}
......@@ -511,6 +523,10 @@ class FunctionBreakpointInputRenderer implements IRenderer<IFunctionBreakpoint,
data.inputBox.select();
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: IInputTemplateData): void {
dispose(templateData.toDispose);
}
......
......@@ -194,6 +194,10 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
});
}
disposeElement(): void {
// noop
}
private updateRecommendationStatus(extension: IExtension, data: ITemplateData) {
const extRecommendations = this.extensionTipsService.getAllRecommendationsWithReason();
let ariaLabel = extension.displayName + '. ';
......
......@@ -369,6 +369,8 @@ export class RuntimeExtensionsEditor extends BaseEditor {
}
},
disposeElement: () => null,
disposeTemplate: (data: IRuntimeExtensionTemplateData): void => {
data.disposables = dispose(data.disposables);
}
......
......@@ -594,6 +594,10 @@ class EditorGroupRenderer implements IRenderer<IEditorGroup, IEditorGroupTemplat
templateData.actionBar.context = { groupId: editorGroup.id };
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: IEditorGroupTemplateData): void {
templateData.actionBar.dispose();
dispose(templateData.toDispose);
......@@ -690,6 +694,10 @@ class OpenEditorRenderer implements IRenderer<OpenEditor, IOpenEditorTemplateDat
});
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: IOpenEditorTemplateData): void {
templateData.actionBar.dispose();
templateData.root.dispose();
......
......@@ -667,6 +667,9 @@ class KeybindingHeaderRenderer implements IRenderer<IListEntry, any> {
renderElement(entry: IListEntry, index: number, template: any): void {
}
disposeElement(): void {
}
disposeTemplate(template: any): void {
}
}
......@@ -704,6 +707,8 @@ class KeybindingItemRenderer implements IRenderer<IKeybindingItemEntry, Keybindi
template.when.render(keybindingEntry);
}
disposeElement(): void { }
disposeTemplate(template: KeybindingItemTemplate): void {
template.actions.dispose();
}
......
......@@ -190,6 +190,10 @@ class ProviderRenderer implements IRenderer<ISCMRepository, RepositoryTemplateDa
templateData.disposable = combinedDisposable(disposables);
}
disposeElement(): void {
// noop
}
disposeTemplate(templateData: RepositoryTemplateData): void {
templateData.disposable.dispose();
templateData.templateDisposable.dispose();
......@@ -437,6 +441,10 @@ class ResourceGroupRenderer implements IRenderer<ISCMResourceGroup, ResourceGrou
template.elementDisposable = combinedDisposable(disposables);
}
disposeElement(): void {
// noop
}
disposeTemplate(template: ResourceGroupTemplate): void {
template.dispose();
}
......@@ -557,6 +565,10 @@ class ResourceRenderer implements IRenderer<ISCMResource, ResourceTemplate> {
template.elementDisposable = combinedDisposable(disposables);
}
disposeElement(): void {
// noop
}
disposeTemplate(template: ResourceTemplate): void {
template.elementDisposable.dispose();
template.dispose();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册