Skip to content

Commit 2dfb838

Browse files
authored
Add contentWidth/onDidChangeContentWidth to ListView, adopt in debugHover (#183479)
* Add contentWidth/onDidChangeContentWidth to ListView, adopt in debugHover For #173980 * cleanup
1 parent 0977318 commit 2dfb838

File tree

5 files changed

+39
-16
lines changed

5 files changed

+39
-16
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ export interface IListView<T> extends ISpliceable<T>, IDisposable {
219219
readonly scrollableElementDomNode: HTMLElement;
220220
readonly length: number;
221221
readonly contentHeight: number;
222+
readonly contentWidth: number;
222223
readonly onDidChangeContentHeight: Event<number>;
224+
readonly onDidChangeContentWidth: Event<number>;
223225
readonly renderHeight: number;
224226
readonly scrollHeight: number;
225227
readonly firstVisibleIndex: number;
@@ -310,8 +312,11 @@ export class ListView<T> implements IListView<T> {
310312
private readonly disposables: DisposableStore = new DisposableStore();
311313

312314
private readonly _onDidChangeContentHeight = new Emitter<number>();
315+
private readonly _onDidChangeContentWidth = new Emitter<number>();
313316
readonly onDidChangeContentHeight: Event<number> = Event.latch(this._onDidChangeContentHeight.event, undefined, this.disposables);
317+
readonly onDidChangeContentWidth: Event<number> = Event.latch(this._onDidChangeContentWidth.event, undefined, this.disposables);
314318
get contentHeight(): number { return this.rangeMap.size; }
319+
get contentWidth(): number { return this.scrollWidth ?? 0; }
315320

316321
get onDidScroll(): Event<ScrollEvent> { return this.scrollableElement.onScroll; }
317322
get onWillScroll(): Event<ScrollEvent> { return this.scrollableElement.onWillScroll; }
@@ -689,6 +694,7 @@ export class ListView<T> implements IListView<T> {
689694

690695
this.scrollWidth = scrollWidth;
691696
this.scrollableElement.setScrollDimensions({ scrollWidth: scrollWidth === 0 ? 0 : (scrollWidth + 10) });
697+
this._onDidChangeContentWidth.fire(this.scrollWidth);
692698
}
693699

694700
updateWidth(index: number): void {
@@ -702,6 +708,7 @@ export class ListView<T> implements IListView<T> {
702708
if (typeof item.width !== 'undefined' && item.width > this.scrollWidth) {
703709
this.scrollWidth = item.width;
704710
this.scrollableElement.setScrollDimensions({ scrollWidth: this.scrollWidth + 10 });
711+
this._onDidChangeContentWidth.fire(this.scrollWidth);
705712
}
706713
}
707714

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,10 +1506,18 @@ export class List<T> implements ISpliceable<T>, IDisposable {
15061506
return this.view.contentHeight;
15071507
}
15081508

1509+
get contentWidth(): number {
1510+
return this.view.contentWidth;
1511+
}
1512+
15091513
get onDidChangeContentHeight(): Event<number> {
15101514
return this.view.onDidChangeContentHeight;
15111515
}
15121516

1517+
get onDidChangeContentWidth(): Event<number> {
1518+
return this.view.onDidChangeContentWidth;
1519+
}
1520+
15131521
get scrollTop(): number {
15141522
return this.view.getScrollTop();
15151523
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,10 +1706,18 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
17061706
return this.view.contentHeight;
17071707
}
17081708

1709+
get contentWidth(): number {
1710+
return this.view.contentWidth;
1711+
}
1712+
17091713
get onDidChangeContentHeight(): Event<number> {
17101714
return this.view.onDidChangeContentHeight;
17111715
}
17121716

1717+
get onDidChangeContentWidth(): Event<number> {
1718+
return this.view.onDidChangeContentWidth;
1719+
}
1720+
17131721
get scrollTop(): number {
17141722
return this.view.scrollTop;
17151723
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,10 +438,18 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
438438
return this.tree.contentHeight;
439439
}
440440

441+
get contentWidth(): number {
442+
return this.tree.contentWidth;
443+
}
444+
441445
get onDidChangeContentHeight(): Event<number> {
442446
return this.tree.onDidChangeContentHeight;
443447
}
444448

449+
get onDidChangeContentWidth(): Event<number> {
450+
return this.tree.onDidChangeContentWidth;
451+
}
452+
445453
get scrollTop(): number {
446454
return this.tree.scrollTop;
447455
}

src/vs/workbench/contrib/debug/browser/debugHover.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ export class DebugHoverWidget implements IContentWidget {
112112
private create(): void {
113113
this.domNode = $('.debug-hover-widget');
114114
this.complexValueContainer = dom.append(this.domNode, $('.complex-value'));
115-
this.complexValueContainer.style.visibility = 'hidden';
116115
this.complexValueTitle = dom.append(this.complexValueContainer, $('.title'));
117116
this.treeContainer = dom.append(this.complexValueContainer, $('.debug-hover-tree'));
118117
this.treeContainer.setAttribute('role', 'tree');
@@ -150,6 +149,12 @@ export class DebugHoverWidget implements IContentWidget {
150149
this.layoutTreeAndContainer();
151150
}
152151
}));
152+
this.toDispose.push(this.tree.onDidChangeContentWidth(() => {
153+
if (!this.isUpdatingTree) {
154+
// Don't do a layout in the middle of the async setInput
155+
this.layoutTreeAndContainer();
156+
}
157+
}));
153158

154159
this.registerListeners();
155160
this.editor.addContentWidget(this);
@@ -295,12 +300,7 @@ export class DebugHoverWidget implements IContentWidget {
295300
const scrollBarHeight = 10;
296301
const treeHeight = Math.min(Math.max(266, this.editor.getLayoutInfo().height * 0.55), this.tree.contentHeight + scrollBarHeight);
297302

298-
// Reset to a smaller width, if it was previously rendered wide
299-
this.tree.layout(treeHeight, 400);
300-
301-
// const titleWidth = this.complexValueTitle.clientWidth;
302-
const realTreeWidth = this.tree.getHTMLElement().offsetWidth;
303-
// const contentWidth = Math.max(titleWidth, realTreeWidth);
303+
const realTreeWidth = this.tree.contentWidth;
304304
const treeWidth = clamp(realTreeWidth, 400, 550);
305305
this.tree.layout(treeHeight, treeWidth);
306306
this.treeContainer.style.height = `${treeHeight}px`;
@@ -315,14 +315,7 @@ export class DebugHoverWidget implements IContentWidget {
315315

316316
// Do this in beforeRender once the content widget is no longer display=none so that its elements' sizes will be measured correctly.
317317
this.isUpdatingTree = true;
318-
this.tree.setInput(expression).then(() => {
319-
dom.scheduleAtNextAnimationFrame(() => {
320-
// Wait for scrollWidth to update after a frame
321-
this.layoutTree();
322-
this.editor.layoutContentWidget(this);
323-
this.complexValueContainer.style.visibility = '';
324-
});
325-
}).finally(() => {
318+
this.tree.setInput(expression).finally(() => {
326319
this.isUpdatingTree = false;
327320
});
328321
}
@@ -339,7 +332,6 @@ export class DebugHoverWidget implements IContentWidget {
339332

340333

341334
hide(): void {
342-
this.complexValueContainer.style.visibility = 'hidden';
343335
if (this.showCancellationSource) {
344336
this.showCancellationSource.cancel();
345337
this.showCancellationSource = undefined;

0 commit comments

Comments
 (0)