Skip to content

Commit

Permalink
[4657] Resize a node using a list layout when one of its children has…
Browse files Browse the repository at this point in the history
… disappeared

Bug: #4657
Signed-off-by: Florian ROUËNÉ <[email protected]>
  • Loading branch information
frouene authored and sbegaudeau committed Mar 6, 2025
1 parent 8fbf3b5 commit 3da8766
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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



Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler<ListNodeData> {
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<number>((height, node) => height + (node.height ?? 0), 0) ?? 0;

if (node.data.resizedByUser) {
if (nodeMinComputeWidth > previousDimensions.width) {
node.width = nodeMinComputeWidth;
Expand All @@ -96,7 +101,7 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler<ListNodeData> {
if (nodeMinComputeHeight > previousDimensions.height) {
node.height = nodeMinComputeHeight;
} else {
node.height = previousDimensions.height;
node.height = getDefaultOrMinHeight(previousDimensions.height - heightLostSincePrevDiagram, node);
}
} else {
node.width = nodeWith;
Expand Down Expand Up @@ -129,6 +134,12 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler<ListNodeData> {
(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<number>((height, node) => height + (node.height ?? 0), 0) ?? 0;

if (!forceDimensions) {
let previousChildrenContentBoxWidthToConsider: number = getDefaultOrMinWidth(0, node) - borderWidth * 2;
let previousChildrenContentBoxHeightToConsider: number = 0;
Expand Down Expand Up @@ -161,6 +172,7 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler<ListNodeData> {
(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
Expand Down Expand Up @@ -215,7 +227,7 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler<ListNodeData> {
if (nodeMinComputeHeight > previousDimensions.height) {
node.height = nodeMinComputeHeight;
} else {
node.height = previousDimensions.height;
node.height = getDefaultOrMinHeight(previousDimensions.height - heightLostSincePrevDiagram, node);
}
} else {
node.width = nodeWidth;
Expand Down

0 comments on commit 3da8766

Please sign in to comment.