using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using AIStudio.Wpf.DiagramDesigner; using AIStudio.Wpf.DiagramDesigner.Geometrys; using AIStudio.Wpf.DiagramDesigner.Models; namespace AIStudio.Wpf.Mind.ViewModels { public class MindNode : DesignerItemViewModelBase { public MindNode(NodeLevel nodeLevel) : this(null, nodeLevel) { } public MindNode(IDiagramViewModel root, NodeLevel nodeLevel) : base(root) { NodeLevel = nodeLevel; } public MindNode(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) { } public MindNode(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) { } [Browsable(false)] public NodeLevel NodeLevel { get; set; } private double _cornerRadius = 3; public double CornerRadius { get { return _cornerRadius; } set { SetProperty(ref _cornerRadius, value); } } public double Spacing { get; set; } = 20; public List Children { get; set; } = new List(); public SizeBase SizeWithSpacing { get { return this.Size.Add(Spacing * 2); } } public SizeBase DesiredSize { get;set; } public SizeBase MeasureOverride() { var sizewithSpacing = SizeWithSpacing; if (Children?.Count > 0) { var childrensizes = Children.Select(p => p.MeasureOverride()).ToArray(); sizewithSpacing = new SizeBase(sizewithSpacing.Width + childrensizes.Max(p => p.Width), Math.Max(sizewithSpacing.Height, childrensizes.Sum(p => p.Height))); } DesiredSize = sizewithSpacing; return DesiredSize; } public void LayoutUpdated() { var size = MeasureOverride(); ArrangeOverride(size); } public void ArrangeOverride(SizeBase sizeBase) { double left = MiddlePosition.X + ItemWidth / 2 + Spacing; double top = MiddlePosition.Y - sizeBase.Height / 2; if (Children?.Count > 0) { foreach (var child in Children) { child.Left = left + Spacing; child.Top = top + child.DesiredSize.Height / 2 - child.ItemHeight; top += child.DesiredSize.Height; child.ArrangeOverride(child.DesiredSize); } } } } public class MindLevel1Node : MindNode { public MindLevel1Node() : this(null) { } public MindLevel1Node(IDiagramViewModel root) : base(root, NodeLevel.Level1) { } public MindLevel1Node(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) { } public MindLevel1Node(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) { } protected override void Init(IDiagramViewModel root) { base.Init(root); ItemWidth = 80; ItemHeight = 40; this.ClearConnectors(); var port = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 0.5, YRatio = 0.5 }; this.AddConnector(port); IsInnerConnector = true; } public RectangleBase Rectangle { get; set; } } public class MindLevel2Node : MindNode { public MindLevel2Node() : this(null) { } public MindLevel2Node(IDiagramViewModel root) : base(root, NodeLevel.Level2) { } public MindLevel2Node(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) { } public MindLevel2Node(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) { } protected override void Init(IDiagramViewModel root) { base.Init(root); ItemWidth = 80; ItemHeight = 40; this.ClearConnectors(); var port1 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 0, YRatio = 0.5 }; this.AddConnector(port1); var port2 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 1, YRatio = 0.5 }; this.AddConnector(port2); IsInnerConnector = true; } public PointBase Offset { get; set; } } public class MindLevel3Node : MindNode { public MindLevel3Node() : this(null) { } public MindLevel3Node(IDiagramViewModel root) : base(root, NodeLevel.Level2) { } public MindLevel3Node(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) { } public MindLevel3Node(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) { } protected override void Init(IDiagramViewModel root) { base.Init(root); ItemWidth = 80; ItemHeight = 40; this.ClearConnectors(); var port1 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 0, YRatio = 1 }; this.AddConnector(port1); var port2 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 1, YRatio = 1 }; this.AddConnector(port2); IsInnerConnector = true; } public PointBase Offset { get; set; } } }