Skip to content

Commit 8833810

Browse files
Improve QuickPickList perf by having a single emitter (microsoft#184678)
ListElements get created every time a quickpick is shown and then they're each disposed because they have a checked event emitter... This change instead uses a single emitter that gets passed in to each ListElement... making ListElement not need to be a disposable. Follow up from microsoft#184661 (comment) ref microsoft#184615
1 parent db6bcdf commit 8833810

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

src/vs/platform/quickinput/browser/quickInputList.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ interface IListElement extends IListElementLazyParts {
6262
separator?: IQuickPickSeparator;
6363
}
6464

65-
class ListElement implements IListElement, IDisposable {
65+
class ListElement implements IListElement {
6666
private readonly _init: Lazy<IListElementLazyParts>;
6767

6868
readonly hasCheckbox: boolean;
@@ -74,6 +74,7 @@ class ListElement implements IListElement, IDisposable {
7474
readonly fireButtonTriggered: (event: IQuickPickItemButtonEvent<IQuickPickItem>) => void;
7575
readonly fireSeparatorButtonTriggered: (event: IQuickPickSeparatorButtonEvent) => void;
7676

77+
// state will get updated later
7778
private _checked: boolean = false;
7879
private _hidden: boolean = false;
7980
private _element?: HTMLElement;
@@ -82,21 +83,24 @@ class ListElement implements IListElement, IDisposable {
8283
private _detailHighlights?: IMatch[];
8384
private _separator?: IQuickPickSeparator;
8485

85-
private readonly _onChecked = new Emitter<boolean>();
86-
onChecked = this._onChecked.event;
86+
private readonly _onChecked: Emitter<{ listElement: IListElement; checked: boolean }>;
87+
onChecked: Event<boolean>;
8788

8889
constructor(
8990
mainItem: QuickPickItem,
9091
previous: QuickPickItem | undefined,
9192
index: number,
9293
hasCheckbox: boolean,
9394
fireButtonTriggered: (event: IQuickPickItemButtonEvent<IQuickPickItem>) => void,
94-
fireSeparatorButtonTriggered: (event: IQuickPickSeparatorButtonEvent) => void
95+
fireSeparatorButtonTriggered: (event: IQuickPickSeparatorButtonEvent) => void,
96+
onCheckedEmitter: Emitter<{ listElement: IListElement; checked: boolean }>
9597
) {
9698
this.hasCheckbox = hasCheckbox;
9799
this.index = index;
98100
this.fireButtonTriggered = fireButtonTriggered;
99101
this.fireSeparatorButtonTriggered = fireSeparatorButtonTriggered;
102+
this._onChecked = onCheckedEmitter;
103+
this.onChecked = Event.map(Event.filter<{ listElement: IListElement; checked: boolean }>(this._onChecked.event, e => e.listElement === this), e => e.checked);
100104

101105
if (mainItem.type === 'separator') {
102106
this._separator = mainItem;
@@ -170,7 +174,7 @@ class ListElement implements IListElement, IDisposable {
170174
set checked(value: boolean) {
171175
if (value !== this._checked) {
172176
this._checked = value;
173-
this._onChecked.fire(value);
177+
this._onChecked.fire({ listElement: this, checked: value });
174178
}
175179
}
176180

@@ -207,10 +211,6 @@ class ListElement implements IListElement, IDisposable {
207211
}
208212

209213
// #endregion
210-
211-
dispose() {
212-
this._onChecked.dispose();
213-
}
214214
}
215215

216216
interface IListElementTemplateData {
@@ -431,6 +431,7 @@ export class QuickInputList {
431431
onKeyDown: Event<StandardKeyboardEvent> = this._onKeyDown.event;
432432
private readonly _onLeave = new Emitter<void>();
433433
onLeave: Event<void> = this._onLeave.event;
434+
private readonly _listElementChecked = new Emitter<{ listElement: IListElement; checked: boolean }>();
434435
private _fireCheckedEvents = true;
435436
private elementDisposables: IDisposable[] = [];
436437
private disposables: IDisposable[] = [];
@@ -551,6 +552,7 @@ export class QuickInputList {
551552
}
552553
delayer.cancel();
553554
}));
555+
this.disposables.push(this._listElementChecked.event(_ => this.fireCheckedEvents()));
554556
this.disposables.push(
555557
this._onChangedAllVisibleChecked,
556558
this._onChangedCheckedCount,
@@ -666,12 +668,10 @@ export class QuickInputList {
666668
index,
667669
hasCheckbox,
668670
fireButtonTriggered,
669-
fireSeparatorButtonTriggered
671+
fireSeparatorButtonTriggered,
672+
this._listElementChecked
670673
);
671674

672-
this.elementDisposables.push(element);
673-
this.elementDisposables.push(element.onChecked(() => this.fireCheckedEvents()));
674-
675675
result.push(element);
676676
elementsToIndexes.set(element.item ?? element.separator!, index);
677677
return result;

0 commit comments

Comments
 (0)