diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs index 25012a8..b4ef8cf 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs @@ -38,12 +38,31 @@ namespace AIStudio.Wpf.Flowchart { base.Init(); - DesignerItemViewModelBase start = new MindLevel1Node() { Left = 100, Top = 0, ItemWidth = 80, ItemHeight = 40, Text = "思维导图" }; - DiagramViewModel.DirectAddItemCommand.Execute(start); - DiagramViewModel?.CenterMoveCommand.Execute(start); + MindLevel1Node level1node = new MindLevel1Node() { Text = "思维导图" }; + DiagramViewModel.DirectAddItemCommand.Execute(level1node); + DiagramViewModel.CenterMoveCommand.Execute(level1node); + + MindLevel2Node level2node1_1 = new MindLevel2Node() { Text = "分支主题1" }; + DiagramViewModel.DirectAddItemCommand.Execute(level2node1_1); + level1node.Children.Add(level2node1_1); + + MindLevel3Node level3node1_1_1 = new MindLevel3Node() { Text = "分支主题1_1" }; + DiagramViewModel.DirectAddItemCommand.Execute(level3node1_1_1); + level2node1_1.Children.Add(level3node1_1_1); + + MindLevel3Node level3node1_1_2 = new MindLevel3Node() { Text = "分支主题1_2" }; + DiagramViewModel.DirectAddItemCommand.Execute(level3node1_1_2); + level2node1_1.Children.Add(level3node1_1_2); + + MindLevel2Node level2node1_2 = new MindLevel2Node() { Text = "分支主题2" }; + DiagramViewModel.DirectAddItemCommand.Execute(level2node1_2); + level1node.Children.Add(level2node1_2); + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); - + + level1node.LayoutUpdated(); + } public override void Dispose() diff --git a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml index 108400f..97e9126 100644 --- a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml @@ -1898,14 +1898,14 @@ + Margin="20,0,0,20" /> diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs index 913c7df..24e3b4e 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs @@ -29,11 +29,14 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels node2.ClearConnectors(); var port2_1 = new FullyCreatedConnectorInfo(DiagramViewModel, node2, ConnectorOrientation.Top, true) { XRatio = 0.2, YRatio = 0.8 }; var port2_2 = new FullyCreatedConnectorInfo(DiagramViewModel, node2, ConnectorOrientation.Top, true) { XRatio = 0.8, YRatio = 0.2 }; + node2.AddConnector(port2_1); + node2.AddConnector(port2_2); DiagramViewModel.DirectAddItemCommand.Execute(node2); DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 300, Top = 50, Text = "3" }; node3.ClearConnectors(); var port3 = new FullyCreatedConnectorInfo(DiagramViewModel, node3, ConnectorOrientation.Bottom, true) { XRatio = 0.5, YRatio = 0.5 }; + node3.AddConnector(port3); DiagramViewModel.DirectAddItemCommand.Execute(node3); ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, port1, port2_1, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml index 4441b6d..abc6a2f 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml @@ -425,8 +425,7 @@ Binding="{Binding Connectors.Count}"> - + diff --git a/AIStudio.Wpf.Mind/Themes/MindNode.xaml b/AIStudio.Wpf.Mind/Themes/MindNode.xaml index bde512e..e228f08 100644 --- a/AIStudio.Wpf.Mind/Themes/MindNode.xaml +++ b/AIStudio.Wpf.Mind/Themes/MindNode.xaml @@ -6,6 +6,19 @@ + + + + + + + + + + diff --git a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs index 93667f8..345bcab 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs @@ -51,16 +51,50 @@ namespace AIStudio.Wpf.Mind.ViewModels 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 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 @@ -84,24 +118,23 @@ namespace AIStudio.Wpf.Mind.ViewModels { } - - public void LayoutUpdated() + protected override void Init(IDiagramViewModel root) { - foreach(var child in Children) - { + 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 RectangleBase GetChildRectangle() - //{ - // //Children.Select(p => p.Size) - //} + } public class MindLevel2Node : MindNode @@ -126,6 +159,20 @@ namespace AIStudio.Wpf.Mind.ViewModels } + 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; @@ -153,7 +200,19 @@ namespace AIStudio.Wpf.Mind.ViewModels { } + 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;