Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vscode.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoão Moreno <joao.moreno@microsoft.com>2022-05-11 10:40:32 +0300
committerGitHub <noreply@github.com>2022-05-11 10:40:32 +0300
commit93ddae524266cd44dd909186d7f68889be5ae37e (patch)
treee97d94465e28b6007f73675c52befaaacc2d01c5
parent3dff256a53deeb7a42a7193d78b02de1baeb69d9 (diff)
allow createSerializedGrid to provide leaf node data (#149167)
-rw-r--r--src/vs/base/browser/ui/grid/grid.ts36
-rw-r--r--src/vs/base/test/browser/ui/grid/grid.test.ts38
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);