diff options
author | João Moreno <joao.moreno@microsoft.com> | 2022-05-11 10:40:32 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-11 10:40:32 +0300 |
commit | 93ddae524266cd44dd909186d7f68889be5ae37e (patch) | |
tree | e97d94465e28b6007f73675c52befaaacc2d01c5 | |
parent | 3dff256a53deeb7a42a7193d78b02de1baeb69d9 (diff) |
allow createSerializedGrid to provide leaf node data (#149167)
-rw-r--r-- | src/vs/base/browser/ui/grid/grid.ts | 36 | ||||
-rw-r--r-- | src/vs/base/test/browser/ui/grid/grid.test.ts | 38 |
2 files changed, 57 insertions, 17 deletions
diff --git a/src/vs/base/browser/ui/grid/grid.ts b/src/vs/base/browser/ui/grid/grid.ts index 6a8982c175b..e4cbed18667 100644 --- a/src/vs/base/browser/ui/grid/grid.ts +++ b/src/vs/base/browser/ui/grid/grid.ts @@ -749,6 +749,16 @@ export class SerializableGrid<T extends ISerializableView> extends Grid<T> { } /** + * Construct a new {@link SerializableGrid} from a grid descriptor. + * + * @param gridDescriptor A grid descriptor in which leaf nodes point to actual views. + * @returns A new {@link SerializableGrid} instance. + */ + static from<T extends ISerializableView>(gridDescriptor: GridDescriptor<T>, options: IGridOptions = {}): SerializableGrid<T> { + return SerializableGrid.deserialize(createSerializedGrid(gridDescriptor), { fromJSON: view => view }, options); + } + + /** * Useful information in order to proportionally restore view sizes * upon the very first layout call. */ @@ -776,15 +786,21 @@ export class SerializableGrid<T extends ISerializableView> extends Grid<T> { } } -export type GridNodeDescriptor = { size?: number; groups?: GridNodeDescriptor[] }; -export type GridDescriptor = { orientation: Orientation; groups?: GridNodeDescriptor[] }; +export type GridLeafNodeDescriptor<T> = { size?: number; data?: any }; +export type GridBranchNodeDescriptor<T> = { size?: number; groups: GridNodeDescriptor<T>[] }; +export type GridNodeDescriptor<T> = GridBranchNodeDescriptor<T> | GridLeafNodeDescriptor<T>; +export type GridDescriptor<T> = { orientation: Orientation } & GridBranchNodeDescriptor<T>; + +function isGridBranchNodeDescriptor<T>(nodeDescriptor: GridNodeDescriptor<T>): nodeDescriptor is GridBranchNodeDescriptor<T> { + return !!(nodeDescriptor as GridBranchNodeDescriptor<T>).groups; +} -export function sanitizeGridNodeDescriptor(nodeDescriptor: GridNodeDescriptor, rootNode: boolean): void { - if (!rootNode && nodeDescriptor.groups && nodeDescriptor.groups.length <= 1) { - nodeDescriptor.groups = undefined; +export function sanitizeGridNodeDescriptor<T>(nodeDescriptor: GridNodeDescriptor<T>, rootNode: boolean): void { + if (!rootNode && (nodeDescriptor as any).groups && (nodeDescriptor as any).groups.length <= 1) { + (nodeDescriptor as any).groups = undefined; } - if (!nodeDescriptor.groups) { + if (!isGridBranchNodeDescriptor(nodeDescriptor)) { return; } @@ -811,11 +827,11 @@ export function sanitizeGridNodeDescriptor(nodeDescriptor: GridNodeDescriptor, r } } -function createSerializedNode(nodeDescriptor: GridNodeDescriptor): ISerializedNode { - if (nodeDescriptor.groups) { +function createSerializedNode<T>(nodeDescriptor: GridNodeDescriptor<T>): ISerializedNode { + if (isGridBranchNodeDescriptor(nodeDescriptor)) { return { type: 'branch', data: nodeDescriptor.groups.map(c => createSerializedNode(c)), size: nodeDescriptor.size! }; } else { - return { type: 'leaf', data: null, size: nodeDescriptor.size! }; + return { type: 'leaf', data: nodeDescriptor.data, size: nodeDescriptor.size! }; } } @@ -843,7 +859,7 @@ function getDimensions(node: ISerializedNode, orientation: Orientation): { width * Creates a new JSON object from a {@link GridDescriptor}, which can * be deserialized by {@link SerializableGrid.deserialize}. */ -export function createSerializedGrid(gridDescriptor: GridDescriptor): ISerializedGrid { +export function createSerializedGrid<T>(gridDescriptor: GridDescriptor<T>): ISerializedGrid { sanitizeGridNodeDescriptor(gridDescriptor, true); const root = createSerializedNode(gridDescriptor); diff --git a/src/vs/base/test/browser/ui/grid/grid.test.ts b/src/vs/base/test/browser/ui/grid/grid.test.ts index bd351acce0d..8dcbb829d7b 100644 --- a/src/vs/base/test/browser/ui/grid/grid.test.ts +++ b/src/vs/base/test/browser/ui/grid/grid.test.ts @@ -785,26 +785,26 @@ suite('SerializableGrid', function () { }); test('sanitizeGridNodeDescriptor', () => { - const nodeDescriptor = { groups: [{ size: 0.2 }, { size: 0.2 }, { size: 0.6, groups: [{}, {}] }] }; - const nodeDescriptorCopy = deepClone<GridNodeDescriptor>(nodeDescriptor); + const nodeDescriptor: GridNodeDescriptor<any> = { groups: [{ size: 0.2 }, { size: 0.2 }, { size: 0.6, groups: [{}, {}] }] }; + const nodeDescriptorCopy = deepClone(nodeDescriptor); sanitizeGridNodeDescriptor(nodeDescriptorCopy, true); assert.deepStrictEqual(nodeDescriptorCopy, { groups: [{ size: 0.2 }, { size: 0.2 }, { size: 0.6, groups: [{ size: 0.5 }, { size: 0.5 }] }] }); }); test('createSerializedGrid', () => { - const gridDescriptor = { orientation: Orientation.VERTICAL, groups: [{ size: 0.2 }, { size: 0.2 }, { size: 0.6, groups: [{}, {}] }] }; + const gridDescriptor = { orientation: Orientation.VERTICAL, groups: [{ size: 0.2, data: 'a' }, { size: 0.2, data: 'b' }, { size: 0.6, groups: [{ data: 'c' }, { data: 'd' }] }] }; const serializedGrid = createSerializedGrid(gridDescriptor); assert.deepStrictEqual(serializedGrid, { root: { type: 'branch', size: undefined, data: [ - { type: 'leaf', size: 0.2, data: null }, - { type: 'leaf', size: 0.2, data: null }, + { type: 'leaf', size: 0.2, data: 'a' }, + { type: 'leaf', size: 0.2, data: 'b' }, { type: 'branch', size: 0.6, data: [ - { type: 'leaf', size: 0.5, data: null }, - { type: 'leaf', size: 0.5, data: null } + { type: 'leaf', size: 0.5, data: 'c' }, + { type: 'leaf', size: 0.5, data: 'd' } ] } ] @@ -842,6 +842,30 @@ suite('SerializableGrid', function () { grid.removeView(views[2]); }); + test('from', () => { + const createView = (): ISerializableView => ({ + element: document.createElement('div'), + layout: () => null, + minimumWidth: 0, + maximumWidth: Number.POSITIVE_INFINITY, + minimumHeight: 0, + maximumHeight: Number.POSITIVE_INFINITY, + onDidChange: Event.None, + toJSON: () => ({}) + }); + + const a = createView(); + const b = createView(); + const c = createView(); + const d = createView(); + + const gridDescriptor = { orientation: Orientation.VERTICAL, groups: [{ size: 0.2, data: a }, { size: 0.2, data: b }, { size: 0.6, groups: [{ data: c }, { data: d }] }] }; + const grid = SerializableGrid.from(gridDescriptor); + + assert.deepStrictEqual(nodesToArrays(grid.getViews()), [a, b, [c, d]]); + grid.dispose(); + }); + test('serialize should store visibility and previous size', function () { const view1 = new TestSerializableView('view1', 50, Number.MAX_VALUE, 50, Number.MAX_VALUE); const grid = new SerializableGrid(view1); |