Skip to content

Commit ba6fe7b

Browse files
committed
IndexTreeModel.updateElementHeight
1 parent fc1ea2d commit ba6fe7b

10 files changed

Lines changed: 80 additions & 64 deletions

File tree

src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { ISpliceable } from 'vs/base/common/sequence';
76
import { Iterable } from 'vs/base/common/iterator';
87
import { Event } from 'vs/base/common/event';
98
import { ITreeModel, ITreeNode, ITreeElement, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError, TreeFilterResult, TreeVisibility, WeakMapper } from 'vs/base/browser/ui/tree/tree';
109
import { IObjectTreeModelOptions, ObjectTreeModel, IObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel';
10+
import { IList } from 'vs/base/browser/ui/tree/indexTreeModel';
1111

1212
// Exported only for test reasons, do not use directly
1313
export interface ICompressedTreeElement<T> extends ITreeElement<T> {
@@ -126,7 +126,7 @@ export class CompressedObjectTreeModel<T extends NonNullable<any>, TFilterData e
126126

127127
constructor(
128128
private user: string,
129-
list: ISpliceable<ITreeNode<ICompressedTreeNode<T>, TFilterData>>,
129+
list: IList<ITreeNode<ICompressedTreeNode<T>, TFilterData>>,
130130
options: ICompressedObjectTreeModelOptions<T, TFilterData> = {}
131131
) {
132132
this.model = new ObjectTreeModel(user, list, options);
@@ -340,10 +340,13 @@ class CompressedTreeNodeWrapper<T, TFilterData> implements ITreeNode<T | null, T
340340
) { }
341341
}
342342

343-
function mapList<T, TFilterData>(nodeMapper: CompressedNodeWeakMapper<T, TFilterData>, list: ISpliceable<ITreeNode<T, TFilterData>>): ISpliceable<ITreeNode<ICompressedTreeNode<T>, TFilterData>> {
343+
function mapList<T, TFilterData>(nodeMapper: CompressedNodeWeakMapper<T, TFilterData>, list: IList<ITreeNode<T, TFilterData>>): IList<ITreeNode<ICompressedTreeNode<T>, TFilterData>> {
344344
return {
345345
splice(start: number, deleteCount: number, toInsert: ITreeNode<ICompressedTreeNode<T>, TFilterData>[]): void {
346346
list.splice(start, deleteCount, toInsert.map(node => nodeMapper.map(node)) as ITreeNode<T, TFilterData>[]);
347+
},
348+
updateElementHeight(index: number, height: number): void {
349+
list.updateElementHeight(index, height);
347350
}
348351
};
349352
}
@@ -402,7 +405,7 @@ export class CompressibleObjectTreeModel<T extends NonNullable<any>, TFilterData
402405

403406
constructor(
404407
user: string,
405-
list: ISpliceable<ITreeNode<T, TFilterData>>,
408+
list: IList<ITreeNode<T, TFilterData>>,
406409
options: ICompressibleObjectTreeModelOptions<T, TFilterData> = {}
407410
) {
408411
this.elementMapper = options.elementMapper || DefaultElementMapper;

src/vs/base/browser/ui/tree/dataTree.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree';
7-
import { ISpliceable } from 'vs/base/common/sequence';
87
import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, IDataSource, TreeError } from 'vs/base/browser/ui/tree/tree';
98
import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel';
109
import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list';
1110
import { Iterable } from 'vs/base/common/iterator';
11+
import { IList } from 'vs/base/browser/ui/tree/indexTreeModel';
1212

1313
export interface IDataTreeOptions<T, TFilterData = void> extends IAbstractTreeOptions<T, TFilterData> {
1414
readonly sorter?: ITreeSorter<T>;
@@ -171,7 +171,7 @@ export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | nu
171171
return { elements, size: children.length };
172172
}
173173

174-
protected createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: IDataTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
174+
protected createModel(user: string, view: IList<ITreeNode<T, TFilterData>>, options: IDataTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
175175
return new ObjectTreeModel(user, view, options);
176176
}
177177

src/vs/base/browser/ui/tree/indexTree.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
import 'vs/css!./media/tree';
77
import { Iterable } from 'vs/base/common/iterator';
88
import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree';
9-
import { ISpliceable } from 'vs/base/common/sequence';
10-
import { IndexTreeModel } from 'vs/base/browser/ui/tree/indexTreeModel';
9+
import { IndexTreeModel, IList } from 'vs/base/browser/ui/tree/indexTreeModel';
1110
import { ITreeElement, ITreeModel, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree';
1211
import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
1312

@@ -41,7 +40,7 @@ export class IndexTree<T, TFilterData = void> extends AbstractTree<T, TFilterDat
4140
this.model.rerender(location);
4241
}
4342

44-
protected createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: IIndexTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, number[]> {
43+
protected createModel(user: string, view: IList<ITreeNode<T, TFilterData>>, options: IIndexTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, number[]> {
4544
return new IndexTreeModel(user, view, this.rootElement, options);
4645
}
4746
}

src/vs/base/browser/ui/tree/indexTreeModel.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ function isCollapsibleStateUpdate(update: CollapseStateUpdate): update is Collap
5656
return typeof (update as any).collapsible === 'boolean';
5757
}
5858

59+
export interface IList<T> extends ISpliceable<T> {
60+
updateElementHeight(index: number, height: number): void;
61+
}
62+
5963
export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = void> implements ITreeModel<T, TFilterData, number[]> {
6064

6165
readonly rootRef = [];
@@ -78,7 +82,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
7882

7983
constructor(
8084
private user: string,
81-
private list: ISpliceable<ITreeNode<T, TFilterData>>,
85+
private list: IList<ITreeNode<T, TFilterData>>,
8286
rootElement: T,
8387
options: IIndexTreeModelOptions<T, TFilterData> = {}
8488
) {
@@ -212,6 +216,15 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
212216
}
213217
}
214218

219+
updateElementHeight(location: number[], height: number) {
220+
if (location.length === 0) {
221+
throw new TreeError(this.user, 'Invalid tree location');
222+
}
223+
224+
const { listIndex } = this.getTreeNodeWithListIndex(location);
225+
this.list.updateElementHeight(listIndex, height);
226+
}
227+
215228
has(location: number[]): boolean {
216229
return this.hasTreeNode(location);
217230
}

src/vs/base/browser/ui/tree/objectTree.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55

66
import { Iterable } from 'vs/base/common/iterator';
77
import { AbstractTree, IAbstractTreeOptions, IAbstractTreeOptionsUpdate } from 'vs/base/browser/ui/tree/abstractTree';
8-
import { ISpliceable } from 'vs/base/common/sequence';
98
import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, ICollapseStateChangeEvent } from 'vs/base/browser/ui/tree/tree';
109
import { ObjectTreeModel, IObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel';
1110
import { IListVirtualDelegate, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list';
1211
import { Event } from 'vs/base/common/event';
1312
import { CompressibleObjectTreeModel, ElementMapper, ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel';
1413
import { memoize } from 'vs/base/common/decorators';
14+
import { IList } from 'vs/base/browser/ui/tree/indexTreeModel';
1515

1616
export interface IObjectTreeOptions<T, TFilterData = void> extends IAbstractTreeOptions<T, TFilterData> {
1717
readonly sorter?: ITreeSorter<T>;
@@ -54,7 +54,7 @@ export class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends
5454
return this.model.has(element);
5555
}
5656

57-
protected createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: IObjectTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
57+
protected createModel(user: string, view: IList<ITreeNode<T, TFilterData>>, options: IObjectTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
5858
return new ObjectTreeModel(user, view, options);
5959
}
6060
}
@@ -188,7 +188,7 @@ export class CompressibleObjectTree<T extends NonNullable<any>, TFilterData = vo
188188
this.model.setChildren(element, children);
189189
}
190190

191-
protected createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: ICompressibleObjectTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
191+
protected createModel(user: string, view: IList<ITreeNode<T, TFilterData>>, options: ICompressibleObjectTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
192192
return new CompressibleObjectTreeModel(user, view, options);
193193
}
194194

src/vs/base/browser/ui/tree/objectTreeModel.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { ISpliceable } from 'vs/base/common/sequence';
76
import { Iterable } from 'vs/base/common/iterator';
8-
import { IndexTreeModel, IIndexTreeModelOptions } from 'vs/base/browser/ui/tree/indexTreeModel';
7+
import { IndexTreeModel, IIndexTreeModelOptions, IList } from 'vs/base/browser/ui/tree/indexTreeModel';
98
import { Event } from 'vs/base/common/event';
109
import { ITreeModel, ITreeNode, ITreeElement, ITreeSorter, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError } from 'vs/base/browser/ui/tree/tree';
1110
import { IIdentityProvider } from 'vs/base/browser/ui/list/list';
@@ -41,7 +40,7 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
4140

4241
constructor(
4342
private user: string,
44-
list: ISpliceable<ITreeNode<T, TFilterData>>,
43+
list: IList<ITreeNode<T, TFilterData>>,
4544
options: IObjectTreeModelOptions<T, TFilterData> = {}
4645
) {
4746
this.model = new IndexTreeModel(user, list, null, options);

src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as assert from 'assert';
77
import { compress, ICompressedTreeElement, ICompressedTreeNode, decompress, CompressedObjectTreeModel } from 'vs/base/browser/ui/tree/compressedObjectTreeModel';
88
import { Iterable } from 'vs/base/common/iterator';
99
import { ITreeNode } from 'vs/base/browser/ui/tree/tree';
10-
import { ISpliceable } from 'vs/base/common/sequence';
10+
import { IList } from 'vs/base/browser/ui/tree/indexTreeModel';
1111

1212
interface IResolvedCompressedTreeElement<T> extends ICompressedTreeElement<T> {
1313
readonly element: T;
@@ -289,11 +289,12 @@ suite('CompressedObjectTree', function () {
289289
});
290290
});
291291

292-
function toSpliceable<T>(arr: T[]): ISpliceable<T> {
292+
function toList<T>(arr: T[]): IList<T> {
293293
return {
294294
splice(start: number, deleteCount: number, elements: T[]): void {
295295
arr.splice(start, deleteCount, ...elements);
296-
}
296+
},
297+
updateElementHeight() { }
297298
};
298299
}
299300

@@ -305,15 +306,15 @@ suite('CompressedObjectTree', function () {
305306

306307
test('ctor', () => {
307308
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
308-
const model = new CompressedObjectTreeModel<number>('test', toSpliceable(list));
309+
const model = new CompressedObjectTreeModel<number>('test', toList(list));
309310
assert(model);
310311
assert.equal(list.length, 0);
311312
assert.equal(model.size, 0);
312313
});
313314

314315
test('flat', () => {
315316
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
316-
const model = new CompressedObjectTreeModel<number>('test', toSpliceable(list));
317+
const model = new CompressedObjectTreeModel<number>('test', toList(list));
317318

318319
model.setChildren(null, [
319320
{ element: 0 },
@@ -340,7 +341,7 @@ suite('CompressedObjectTree', function () {
340341

341342
test('nested', () => {
342343
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
343-
const model = new CompressedObjectTreeModel<number>('test', toSpliceable(list));
344+
const model = new CompressedObjectTreeModel<number>('test', toList(list));
344345

345346
model.setChildren(null, [
346347
{
@@ -376,7 +377,7 @@ suite('CompressedObjectTree', function () {
376377

377378
test('compressed', () => {
378379
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
379-
const model = new CompressedObjectTreeModel<number>('test', toSpliceable(list));
380+
const model = new CompressedObjectTreeModel<number>('test', toList(list));
380381

381382
model.setChildren(null, [
382383
{

0 commit comments

Comments
 (0)