Ejemplo n.º 1
0
        private GroupLayoutInfo LayoutRecursive(
            [NotNull] DiagramLayoutStructure layoutStructure,
            [NotNull] ILayoutGroup layoutGroup,
            [NotNull] IGroupLayoutAlgorithm layoutAlgorithm)
        {
            var childLayoutByParentNodeId = new Dictionary <ModelNodeId, GroupLayoutInfo>();

            foreach (var node in layoutGroup.Nodes)
            {
                var maybeLayoutGroup = layoutStructure.TryGetLayoutGroupByNodeId(node.Id);
                if (!maybeLayoutGroup.HasValue || maybeLayoutGroup.Value.IsEmpty)
                {
                    continue;
                }

                var nodeLayoutAlgorithm    = _layoutAlgorithmSelectionStrategy.GetForNode(node);
                var childrenAreaLayoutInfo = LayoutRecursive(layoutStructure, maybeLayoutGroup.Value, nodeLayoutAlgorithm);

                layoutGroup.SetChildrenAreaSize(node.Id, childrenAreaLayoutInfo.Rect.Size);
                childLayoutByParentNodeId.Add(node.Id, childrenAreaLayoutInfo);
            }

            var groupLayoutInfo = layoutAlgorithm.Calculate(layoutGroup);

            foreach (var nodeLayoutInfo in groupLayoutInfo.Nodes)
            {
                if (childLayoutByParentNodeId.TryGetValue(nodeLayoutInfo.Node.Id, out var childrenAreaLayoutInfo))
                {
                    nodeLayoutInfo.ChildrenArea = childrenAreaLayoutInfo;
                }
            }

            return(groupLayoutInfo);
        }
        private GroupLayoutInfo LayoutRecursive(
            [NotNull] DiagramLayoutStructure layoutStructure,
            [NotNull] ILayoutGroup layoutGroup,
            [NotNull] IGroupLayoutAlgorithm layoutAlgorithm)
        {
            var childLayoutByParentNodeId = new Dictionary <string, GroupLayoutInfo>();

            foreach (var node in layoutGroup.Nodes)
            {
                var maybeLayoutGroup = layoutStructure.TryGetLayoutGroupByNodeId(node.Id);
                if (!maybeLayoutGroup.HasValue || maybeLayoutGroup.Value.IsEmpty)
                {
                    continue;
                }

                var nodeLayoutAlgorithm    = _layoutAlgorithmSelectionStrategy.GetForNode(node);
                var childrenAreaLayoutInfo = LayoutRecursive(layoutStructure, maybeLayoutGroup.Value, nodeLayoutAlgorithm);

                layoutGroup.SetChildrenAreaSize(node.Id, childrenAreaLayoutInfo.Rect.Size.WithMargin(ChildrenAreaPadding));
                childLayoutByParentNodeId.Add(node.ShapeId, childrenAreaLayoutInfo);
            }

            var layoutInfo = layoutAlgorithm.Calculate(layoutGroup);

            var boxes = layoutGroup.Nodes.Select(
                i =>
            {
                childLayoutByParentNodeId.TryGetValue(i.ShapeId, out var childrenAreaLayoutInfo);

                return(new BoxLayoutInfo(
                           i.ShapeId,
                           layoutInfo.VertexRects[i.Id].TopLeft,
                           payloadAreaSize: i.PayloadAreaSize,
                           childrenAreaLayoutInfo?.Rect.Size.WithMargin(ChildrenAreaPadding) ?? Size2D.Zero,
                           childrenAreaLayoutInfo));
            }
                );

            var lines = layoutGroup.Connectors.Select(i => new LineLayoutInfo(i.ShapeId, layoutInfo.EdgeRoutes[i.Id]));

            return(new GroupLayoutInfo(boxes, lines));
        }
Ejemplo n.º 3
0
 public void SetLayoutAlgorithmForNode(IDiagramNode node, IGroupLayoutAlgorithm layoutAlgorithm)
 {
     _nodeLayoutAlgorithms.Add(node.Id, layoutAlgorithm);
 }
Ejemplo n.º 4
0
 public void SetLayoutAlgorithmForRoot(IGroupLayoutAlgorithm layoutAlgorithm)
 {
     _rootLayoutAlgorithm = layoutAlgorithm;
 }