From 3da876686f64f61dbca978e7596a81ea7765a744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20ROU=C3=8BN=C3=89?= Date: Mon, 3 Mar 2025 11:19:29 +0100 Subject: [PATCH] [4657] Resize a node using a list layout when one of its children has disappeared MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: https://github.com/eclipse-sirius/sirius-web/issues/4657 Signed-off-by: Florian ROUËNÉ --- CHANGELOG.adoc | 1 + .../src/renderer/layout/ListNodeLayoutHandler.ts | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index d00b913e81..5ae5110f1c 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -81,6 +81,7 @@ Except for the specific case where `cause === 'refresh'` in `DiagramRenderer` (w - https://github.com/eclipse-sirius/sirius-web/issues/4451[#4451] [diagram] Keep using the same node after a refresh if possible in order to avoid rerendering all the nodes after converting the diagram - https://github.com/eclipse-sirius/sirius-web/issues/4575[#4575] [diagram] Memoize the style of a label to avoid rerendering them all when refreshing the diagram - https://github.com/eclipse-sirius/sirius-web/issues/4577[#4577] [diagram] Improve the performance of the diagram by removing useless data from `DiagramContext` +- https://github.com/eclipse-sirius/sirius-web/issues/4657[#4657] [diagram] Resize a parent node using a list layout when one of its children has disappeared even when the node has been manually resized diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/layout/ListNodeLayoutHandler.ts b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/layout/ListNodeLayoutHandler.ts index 8dcc2c71f3..42b0df239f 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/layout/ListNodeLayoutHandler.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/layout/ListNodeLayoutHandler.ts @@ -87,6 +87,11 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler { const previousNode = (previousDiagram?.nodes ?? []).find((previouseNode) => previouseNode.id === node.id); const previousDimensions = computePreviousSize(previousNode, node); + const heightLostSincePrevDiagram: number = + previousDiagram?.nodes + .filter((prevNode) => prevNode.parentId === node.id && !prevNode.hidden) + .reduce((height, node) => height + (node.height ?? 0), 0) ?? 0; + if (node.data.resizedByUser) { if (nodeMinComputeWidth > previousDimensions.width) { node.width = nodeMinComputeWidth; @@ -96,7 +101,7 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler { if (nodeMinComputeHeight > previousDimensions.height) { node.height = nodeMinComputeHeight; } else { - node.height = previousDimensions.height; + node.height = getDefaultOrMinHeight(previousDimensions.height - heightLostSincePrevDiagram, node); } } else { node.width = nodeWith; @@ -129,6 +134,12 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler { (previouseNode) => previouseNode.id === node.id ); + const heightLostSincePrevDiagram: number = + previousDiagram?.nodes + .filter((prevNode) => prevNode.parentId === node.id && !prevNode.hidden) + .filter((prevNode) => !directChildren.map((child) => child.id).includes(prevNode.id)) + .reduce((height, node) => height + (node.height ?? 0), 0) ?? 0; + if (!forceDimensions) { let previousChildrenContentBoxWidthToConsider: number = getDefaultOrMinWidth(0, node) - borderWidth * 2; let previousChildrenContentBoxHeightToConsider: number = 0; @@ -161,6 +172,7 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler { (height, node) => height + (node.height ?? 0), 0 ); + previousChildrenContentBoxHeightToConsider -= node.data.topGap + node.data.bottomGap; const growableChilds = directNodesChildren.filter( (child) => node.data.growableNodeIds.includes(child.data.descriptionId) && !child.data.resizedByUser @@ -215,7 +227,7 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler { if (nodeMinComputeHeight > previousDimensions.height) { node.height = nodeMinComputeHeight; } else { - node.height = previousDimensions.height; + node.height = getDefaultOrMinHeight(previousDimensions.height - heightLostSincePrevDiagram, node); } } else { node.width = nodeWidth;