Skip to content

Commit 5d228fb

Browse files
committed
grid: onDidSashReset with preferred width/height
1 parent 6cfe067 commit 5d228fb

3 files changed

Lines changed: 49 additions & 16 deletions

File tree

src/vs/base/browser/ui/grid/grid.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ function oppositeDirection(direction: Direction): Direction {
3030
}
3131

3232
export interface IView extends IGridViewView {
33-
readonly preferredSize?: number;
33+
readonly preferredHeight?: number;
34+
readonly preferredWidth?: number;
3435
}
3536

3637
export interface GridLeafNode<T extends IView> {
@@ -339,7 +340,7 @@ export class Grid<T extends IView = IView> extends Disposable {
339340
}
340341

341342
getViews(): GridBranchNode<T> {
342-
return this.gridview.getViews() as GridBranchNode<T>;
343+
return this.gridview.getView() as GridBranchNode<T>;
343344
}
344345

345346
getNeighborViews(view: T, direction: Direction, wrap: boolean = false): T[] {
@@ -375,7 +376,36 @@ export class Grid<T extends IView = IView> extends Disposable {
375376
}
376377

377378
private onDidSashReset(location: number[]): void {
378-
const [parentLocation,] = tail(location);
379+
const resizeToPreferredSize = (node: GridNode<T>): boolean => {
380+
if (isGridBranchNode(node)) {
381+
return false;
382+
}
383+
384+
const direction = getLocationOrientation(this.orientation, location);
385+
const size = direction === Orientation.HORIZONTAL ? node.view.preferredWidth : node.view.preferredHeight;
386+
387+
if (typeof size !== 'number') {
388+
return false;
389+
}
390+
391+
const viewSize = Orientation.HORIZONTAL ? { width: size } : { height: size };
392+
this.gridview.resizeView(location, viewSize);
393+
return true;
394+
};
395+
396+
let node = this.gridview.getView(location) as GridNode<T>;
397+
398+
if (resizeToPreferredSize(node)) {
399+
return;
400+
}
401+
402+
const [parentLocation, index] = tail(location);
403+
node = this.gridview.getView([...parentLocation, index + 1]) as GridNode<T>;
404+
405+
if (resizeToPreferredSize(node)) {
406+
return;
407+
}
408+
379409
this.gridview.distributeViewSizes(parentLocation);
380410
}
381411
}

src/vs/base/browser/ui/grid/gridview.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,8 +903,11 @@ export class GridView implements IDisposable {
903903
parent.setChildVisible(index, visible);
904904
}
905905

906-
getViews(): GridBranchNode {
907-
return this._getViews(this.root, this.orientation, { top: 0, left: 0, width: this.width, height: this.height }) as GridBranchNode;
906+
getView(): GridBranchNode;
907+
getView(location?: number[]): GridNode;
908+
getView(location?: number[]): GridNode {
909+
const node = location ? this.getNode(location)[1] : this._root;
910+
return this._getViews(node, this.orientation, { top: 0, left: 0, width: this.width, height: this.height });
908911
}
909912

910913
private _getViews(node: Node, orientation: Orientation, box: Box): GridNode {

src/vs/base/test/browser/ui/grid/gridview.test.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ suite('Gridview', function () {
2222
});
2323

2424
test('empty gridview is empty', function () {
25-
assert.deepEqual(nodesToArrays(gridview.getViews()), []);
25+
assert.deepEqual(nodesToArrays(gridview.getView()), []);
2626
gridview.dispose();
2727
});
2828

@@ -43,7 +43,7 @@ suite('Gridview', function () {
4343
gridview.addView(views[1], 200, [1]);
4444
gridview.addView(views[2], 200, [2]);
4545

46-
assert.deepEqual(nodesToArrays(gridview.getViews()), views);
46+
assert.deepEqual(nodesToArrays(gridview.getView()), views);
4747

4848
gridview.dispose();
4949
});
@@ -62,7 +62,7 @@ suite('Gridview', function () {
6262
gridview.addView((views[1] as TestView[])[0] as IView, 200, [1]);
6363
gridview.addView((views[1] as TestView[])[1] as IView, 200, [1, 1]);
6464

65-
assert.deepEqual(nodesToArrays(gridview.getViews()), views);
65+
assert.deepEqual(nodesToArrays(gridview.getView()), views);
6666

6767
gridview.dispose();
6868
});
@@ -71,35 +71,35 @@ suite('Gridview', function () {
7171

7272
const view1 = new TestView(20, 20, 20, 20);
7373
gridview.addView(view1 as IView, 200, [0]);
74-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1]);
74+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1]);
7575

7676
const view2 = new TestView(20, 20, 20, 20);
7777
gridview.addView(view2 as IView, 200, [1]);
78-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, view2]);
78+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1, view2]);
7979

8080
const view3 = new TestView(20, 20, 20, 20);
8181
gridview.addView(view3 as IView, 200, [1, 0]);
82-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view3, view2]]);
82+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1, [view3, view2]]);
8383

8484
const view4 = new TestView(20, 20, 20, 20);
8585
gridview.addView(view4 as IView, 200, [1, 0, 0]);
86-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [[view4, view3], view2]]);
86+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1, [[view4, view3], view2]]);
8787

8888
const view5 = new TestView(20, 20, 20, 20);
8989
gridview.addView(view5 as IView, 200, [1, 0]);
90-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, [view4, view3], view2]]);
90+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1, [view5, [view4, view3], view2]]);
9191

9292
const view6 = new TestView(20, 20, 20, 20);
9393
gridview.addView(view6 as IView, 200, [2]);
94-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, [view4, view3], view2], view6]);
94+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1, [view5, [view4, view3], view2], view6]);
9595

9696
const view7 = new TestView(20, 20, 20, 20);
9797
gridview.addView(view7 as IView, 200, [1, 1]);
98-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, view7, [view4, view3], view2], view6]);
98+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1, [view5, view7, [view4, view3], view2], view6]);
9999

100100
const view8 = new TestView(20, 20, 20, 20);
101101
gridview.addView(view8 as IView, 200, [1, 1, 0]);
102-
assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, [view8, view7], [view4, view3], view2], view6]);
102+
assert.deepEqual(nodesToArrays(gridview.getView()), [view1, [view5, [view8, view7], [view4, view3], view2], view6]);
103103

104104
gridview.dispose();
105105
});

0 commit comments

Comments
 (0)