Skip to content

Commit ab8b83b

Browse files
committed
Update list view item height.
1 parent 14cf2b8 commit ab8b83b

3 files changed

Lines changed: 53 additions & 6 deletions

File tree

src/vs/base/browser/ui/list/listView.ts

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { equals, distinct } from 'vs/base/common/arrays';
2121
import { DataTransfers, StaticDND, IDragAndDropData } from 'vs/base/browser/dnd';
2222
import { disposableTimeout, Delayer } from 'vs/base/common/async';
2323
import { isFirefox } from 'vs/base/browser/browser';
24+
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
2425

2526
interface IItem<T> {
2627
readonly id: string;
@@ -198,6 +199,7 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
198199

199200
get onDidScroll(): Event<ScrollEvent> { return this.scrollableElement.onScroll; }
200201
get onWillScroll(): Event<ScrollEvent> { return this.scrollableElement.onWillScroll; }
202+
get containerDomNode(): HTMLElement { return this.rowsContainer; }
201203

202204
constructor(
203205
container: HTMLElement,
@@ -273,6 +275,28 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
273275
this.layout();
274276
}
275277

278+
triggerScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent) {
279+
this.scrollableElement.triggerScrollFromMouseWheelEvent(browserEvent);
280+
}
281+
282+
updateElementHeight(index: number, element: T, size: number): void {
283+
const lastRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);
284+
285+
let heightDiff = index < lastRenderRange.start ? size - this.items[index].size : 0;
286+
this.rangeMap.splice(index, 1, [{ size: size }]);
287+
288+
this.items[index].size = size;
289+
290+
this.render(lastRenderRange, this.lastRenderTop + heightDiff, this.lastRenderHeight, undefined, undefined, true);
291+
292+
if (this.supportDynamicHeights) {
293+
this._rerender(this.lastRenderTop, this.lastRenderHeight);
294+
}
295+
296+
this.eventuallyUpdateScrollDimensions();
297+
return;
298+
}
299+
276300
splice(start: number, deleteCount: number, elements: T[] = []): T[] {
277301
if (this.splicing) {
278302
throw new Error('Can\'t run recursive splices.');
@@ -516,14 +540,21 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
516540

517541
// Render
518542

519-
private render(renderTop: number, renderHeight: number, renderLeft: number, scrollWidth: number): void {
520-
const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);
543+
private render(previousRenderRange: IRange, renderTop: number, renderHeight: number, renderLeft: number | undefined, scrollWidth: number | undefined, updateItemsInDOM: boolean = false): void {
521544
const renderRange = this.getRenderRange(renderTop, renderHeight);
522545

523546
const rangesToInsert = Range.relativeComplement(renderRange, previousRenderRange);
524547
const rangesToRemove = Range.relativeComplement(previousRenderRange, renderRange);
525548
const beforeElement = this.getNextToLastElement(rangesToInsert);
526549

550+
if (updateItemsInDOM) {
551+
const rangesToUpdate = Range.intersect(previousRenderRange, renderRange);
552+
553+
for (let i = rangesToUpdate.start; i < rangesToUpdate.end; i++) {
554+
this.updateItemInDOM(this.items[i], i);
555+
}
556+
}
557+
527558
for (const range of rangesToInsert) {
528559
for (let i = range.start; i < range.end; i++) {
529560
this.insertItemInDOM(i, beforeElement);
@@ -536,10 +567,13 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
536567
}
537568
}
538569

539-
this.rowsContainer.style.left = `-${renderLeft}px`;
570+
if (renderLeft !== undefined) {
571+
this.rowsContainer.style.left = `-${renderLeft}px`;
572+
}
573+
540574
this.rowsContainer.style.top = `-${renderTop}px`;
541575

542-
if (this.horizontalScrolling) {
576+
if (this.horizontalScrolling && scrollWidth !== undefined) {
543577
this.rowsContainer.style.width = `${Math.max(scrollWidth, this.renderWidth)}px`;
544578
}
545579

@@ -741,7 +775,8 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
741775

742776
private onScroll(e: ScrollEvent): void {
743777
try {
744-
this.render(e.scrollTop, e.height, e.scrollLeft, e.scrollWidth);
778+
const previousRenderRange = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight);
779+
this.render(previousRenderRange, e.scrollTop, e.height, e.scrollLeft, e.scrollWidth);
745780

746781
if (this.supportDynamicHeights) {
747782
this._rerender(e.scrollTop, e.height);
@@ -1097,6 +1132,14 @@ export class ListView<T> implements ISpliceable<T>, IDisposable {
10971132
}
10981133

10991134
const size = item.size;
1135+
1136+
if (item.row && item.row.domNode) {
1137+
let newSize = item.row.domNode.offsetHeight;
1138+
item.size = newSize;
1139+
item.lastDynamicHeightWidth = this.renderWidth;
1140+
return newSize - size;
1141+
}
1142+
11001143
const row = this.cache.alloc(item.templateId);
11011144

11021145
row.domNode!.style.height = '';

src/vs/base/browser/ui/list/listWidget.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1115,7 +1115,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
11151115
private focus: Trait<T>;
11161116
private selection: Trait<T>;
11171117
private eventBufferer = new EventBufferer();
1118-
private view: ListView<T>;
1118+
protected view: ListView<T>;
11191119
private spliceable: ISpliceable<T>;
11201120
private styleController: IStyleController;
11211121
private typeLabelController?: TypeLabelController<T>;

src/vs/base/browser/ui/scrollbar/scrollableElement.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@ export abstract class AbstractScrollableElement extends Widget {
303303
this._revealOnScroll = value;
304304
}
305305

306+
public triggerScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent) {
307+
this._onMouseWheel(new StandardWheelEvent(browserEvent));
308+
}
309+
306310
// -------------------- mouse wheel scrolling --------------------
307311

308312
private _setListeningToMouseWheel(shouldListen: boolean): void {

0 commit comments

Comments
 (0)