|
6 | 6 | import { BugIndicatingError } from '../../../../base/common/errors.js'; |
7 | 7 | import { Emitter, Event } from '../../../../base/common/event.js'; |
8 | 8 | import { Disposable, DisposableStore, IDisposable, IReference, toDisposable } from '../../../../base/common/lifecycle.js'; |
9 | | -import { autorun, derived, IObservable, ITransaction, observableValue, transaction } from '../../../../base/common/observable.js'; |
| 9 | +import { autorun, derived, IObservable, ITransaction, mapObservableArrayCached, observableValue, transaction } from '../../../../base/common/observable.js'; |
10 | 10 | import { OffsetRange } from '../../../common/core/ranges/offsetRange.js'; |
11 | 11 | import { ICompressedVirtualizedScrollItem, ICompressedVirtualizedScrollItemContext, ICompressedVirtualizedScrollViewContext } from './compressedVirtualizedScrollView.js'; |
12 | 12 |
|
@@ -93,40 +93,21 @@ export interface IVirtualizedItemDelegate<TItem, TBinding extends IVirtualizedIt |
93 | 93 |
|
94 | 94 | export class VirtualizedItemManager<TItem, TBinding extends IVirtualizedItemBinding<TItem>, TTemplate extends IVirtualizedItemTemplate<TItem, TBinding>> extends Disposable { |
95 | 95 | private readonly _pools = new Map<string, VirtualizedTemplatePool<TItem, TBinding, TTemplate>>(); |
96 | | - private readonly _managedItems = new Map<unknown, ManagedVirtualizedItem<TItem, TBinding, TTemplate>>(); |
97 | | - private readonly _virtualizedItems = observableValue<readonly ManagedVirtualizedItem<TItem, TBinding, TTemplate>[]>(this, []); |
98 | | - readonly virtualizedItems: IObservable<readonly ManagedVirtualizedItem<TItem, TBinding, TTemplate>[]> = this._virtualizedItems; |
| 96 | + readonly virtualizedItems: IObservable<readonly ManagedVirtualizedItem<TItem, TBinding, TTemplate>[]>; |
99 | 97 |
|
100 | 98 | constructor( |
101 | 99 | items: IObservable<readonly TItem[]>, |
102 | 100 | private readonly _context: ICompressedVirtualizedScrollViewContext, |
103 | 101 | private readonly _delegate: IVirtualizedItemDelegate<TItem, TBinding, TTemplate>, |
104 | 102 | ) { |
105 | 103 | super(); |
106 | | - this._register(autorun(reader => { |
107 | | - const nextItems = items.read(reader); |
108 | | - const itemsToRemove = new Set(this._managedItems.keys()); |
109 | | - const nextManagedItems = nextItems.map(item => { |
110 | | - const key = _delegate.getId(item); |
111 | | - itemsToRemove.delete(key); |
112 | | - let managedItem = this._managedItems.get(key); |
113 | | - if (!managedItem) { |
114 | | - managedItem = new ManagedVirtualizedItem(item, this, _delegate); |
115 | | - this._managedItems.set(key, managedItem); |
116 | | - } |
117 | | - return managedItem; |
118 | | - }); |
119 | | - for (const key of itemsToRemove) { |
120 | | - this._managedItems.get(key)!.dispose(); |
121 | | - this._managedItems.delete(key); |
122 | | - } |
123 | | - transaction(tx => this._virtualizedItems.set(nextManagedItems, tx)); |
124 | | - })); |
| 104 | + this.virtualizedItems = mapObservableArrayCached( |
| 105 | + this, |
| 106 | + items, |
| 107 | + (item, store) => store.add(new ManagedVirtualizedItem(item, this, _delegate)), |
| 108 | + item => _delegate.getId(item), |
| 109 | + ).recomputeInitiallyAndOnChange(this._store); |
125 | 110 | this._register(toDisposable(() => { |
126 | | - for (const item of this._managedItems.values()) { |
127 | | - item.dispose(); |
128 | | - } |
129 | | - this._managedItems.clear(); |
130 | 111 | for (const pool of this._pools.values()) { |
131 | 112 | pool.dispose(); |
132 | 113 | } |
|
0 commit comments