Files
aistudio-wpf-diagram/AIStudio.Wpf.Mind/ViewModels/MindNode.cs
2023-02-16 19:21:37 +08:00

222 lines
5.9 KiB
C#

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<MindNode> Children
{
get; set;
} = new List<MindNode>();
public SizeBase SizeWithSpacing
{
get
{
return this.Size.Add(Spacing * 2);
}
}
public SizeBase GetSize()
{
var sizewithSpacing = SizeWithSpacing;
if (Children?.Count > 0)
{
var childrensizes = Children.Select(p => p.GetSize());
sizewithSpacing = new SizeBase(sizewithSpacing.Width + childrensizes.Max(p => p.Width), Math.Max(sizewithSpacing.Height, childrensizes.Sum(p => p.Height)));
}
return sizewithSpacing;
}
public void LayoutUpdated()
{
var totalsize = GetSize();
double left = MiddlePosition.X + ItemWidth / 2 + Spacing;
double top = MiddlePosition.Y - totalsize.Height / 2;
if (Children?.Count > 0)
{
foreach (var child in Children)
{
child.Left = left + Spacing;
child.Top = top + Spacing;
top += child.SizeWithSpacing.Height;
child.LayoutUpdated();
}
}
}
}
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;
}
}
}