diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs index 47c5cae..665c037 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs @@ -23,7 +23,7 @@ namespace AIStudio.Wpf.Flowchart } public MindViewModel(string filename, DiagramDocument diagramDocument) : base(filename, diagramDocument) { - _service.DrawModeViewModel.LineDrawMode = DrawMode.ConnectingLineSmooth; + } protected override void InitDiagramViewModel() @@ -35,6 +35,14 @@ namespace AIStudio.Wpf.Flowchart DiagramViewModel.AllowDrop = false; } + public IMindDiagramViewModel MindDiagramViewModel + { + get + { + return DiagramViewModel as IMindDiagramViewModel; + } + } + protected override void Init() { DiagramViewModels = new ObservableCollection() @@ -44,51 +52,32 @@ namespace AIStudio.Wpf.Flowchart DiagramViewModel = DiagramViewModels.FirstOrDefault(); InitDiagramViewModel(); - - MindNode level1node = new MindNode(DiagramViewModel, Mind.NodeLevel.Level1, MindType) { Text = "思维导图" }; - DiagramViewModel.DirectAddItemCommand.Execute(level1node); + var level1node = MindDiagramViewModel.RootItem; DiagramViewModel.CenterMoveCommand.Execute(level1node); - MindNode level2node1_1 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2, MindType) { Text = "分支主题1" }; - level1node.AddChild(level2node1_1); + MindNode level2node1_1 = new MindNode(DiagramViewModel) { Text = "分支主题1" }; + MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level1node, level2node1_1 }); - MindNode level3node1_1_1 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level3, MindType) { Text = "分支主题1_1" }; - level2node1_1.AddChild(level3node1_1_1); + MindNode level2node1_1_1 = new MindNode(DiagramViewModel) { Text = "分支主题1_1" }; + MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level2node1_1, level2node1_1_1 }); - MindNode level3node1_1_2 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level3, MindType) { Text = "分支主题1_2" }; - level2node1_1.AddChild(level3node1_1_2); + MindNode level2node1_1_2 = new MindNode(DiagramViewModel) { Text = "分支主题1_2" }; + MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level2node1_1, level2node1_1_2 });; - MindNode level3node1_1_3 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level3, MindType) { Text = "分支主题1_3" }; - level2node1_1.AddChild(level3node1_1_3); + MindNode level2node1_1_3 = new MindNode(DiagramViewModel) { Text = "分支主题1_3" }; + MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level2node1_1, level2node1_1_3 }); - MindNode level2node1_2 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2, MindType) { Text = "分支主题2" }; - level1node.AddChild(level2node1_2); + MindNode level2node1_2 = new MindNode(DiagramViewModel) { Text = "分支主题2" }; + MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level1node, level2node1_2 }); - MindNode level2node1_3 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2, MindType) { Text = "分支主题3" }; - level1node.AddChild(level2node1_3); + MindNode level2node1_3 = new MindNode(DiagramViewModel) { Text = "分支主题3" }; + MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level1node, level2node1_3 }); DiagramViewModel.ClearSelectedItemsCommand.Execute(null); level1node.LayoutUpdated(); } - private MindType _mindType = Mind.MindType.Organizational; - public MindType MindType - { - get - { - return _mindType; - } - set - { - if (SetProperty(ref _mindType, value)) - { - //DiagramViewModel as MindDiagramViewModel - } - } - } - - public override void Dispose() { base.Dispose(); diff --git a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml index 6ff6171..515bc96 100644 --- a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml @@ -1763,16 +1763,16 @@ - + - diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs index 4470490..aef7635 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs @@ -250,14 +250,30 @@ namespace AIStudio.Wpf.DiagramDesigner } } + private string _pathMode; public string PathMode { - get; set; + get + { + return _pathMode; + } + set + { + SetProperty(ref _pathMode, value); + } } + private string _routerMode; public string RouterMode { - get; set; + get + { + return _routerMode; + } + set + { + SetProperty(ref _routerMode, value); + } } public IRouter Router diff --git a/AIStudio.Wpf.DiagramModels/DiagramData.cs b/AIStudio.Wpf.DiagramModels/DiagramData.cs index c4c9b76..c6b4ce5 100644 --- a/AIStudio.Wpf.DiagramModels/DiagramData.cs +++ b/AIStudio.Wpf.DiagramModels/DiagramData.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using AIStudio.Wpf.DiagramDesigner; using AIStudio.Wpf.DiagramModels.ViewModels; namespace AIStudio.Wpf.DiagramModels @@ -180,9 +181,9 @@ namespace AIStudio.Wpf.DiagramModels get; set; } - public virtual DiagramItemViewModel ToNodel() + public virtual DiagramItemViewModel ToNodel(IDiagramViewModel diagramViewModel) { - return new DiagramItemViewModel(); + return new DiagramItemViewModel(diagramViewModel); } } diff --git a/AIStudio.Wpf.DiagramModels/DiagramDataExtention.cs b/AIStudio.Wpf.DiagramModels/DiagramDataExtention.cs index 3fd64e9..38b05be 100644 --- a/AIStudio.Wpf.DiagramModels/DiagramDataExtention.cs +++ b/AIStudio.Wpf.DiagramModels/DiagramDataExtention.cs @@ -119,7 +119,7 @@ namespace AIStudio.Wpf.DiagramModels private static DiagramItemViewModel ToNodelModel(this DiagramNode diagramNode, IDiagramViewModel diagram) { - DiagramItemViewModel nodeModel = diagramNode.ToNodel(); + DiagramItemViewModel nodeModel = diagramNode.ToNodel(diagram); nodeModel.Id = new Guid(diagramNode.Id); if (!string.IsNullOrEmpty(diagramNode.ParentId)) diff --git a/AIStudio.Wpf.Flowchart/Models/FlowchartNode.cs b/AIStudio.Wpf.Flowchart/Models/FlowchartNode.cs index eee0850..634937d 100644 --- a/AIStudio.Wpf.Flowchart/Models/FlowchartNode.cs +++ b/AIStudio.Wpf.Flowchart/Models/FlowchartNode.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AIStudio.Wpf.DiagramDesigner; using AIStudio.Wpf.DiagramModels; using AIStudio.Wpf.DiagramModels.ViewModels; using AIStudio.Wpf.Flowchart.ViewModels; @@ -57,40 +58,40 @@ namespace AIStudio.Wpf.Flowchart.Models get; set; } - public override DiagramItemViewModel ToNodel() + public override DiagramItemViewModel ToNodel(IDiagramViewModel diagramViewModel) { FlowNode flowNode = null; switch (Kind) { case NodeKinds.Start: { - flowNode = new StartFlowNode(); + flowNode = new StartFlowNode(diagramViewModel); break; } case NodeKinds.End: { - flowNode = new EndFlowNode(); + flowNode = new EndFlowNode(diagramViewModel); break; } case NodeKinds.Decide: { - flowNode = new DecideFlowNode(); + flowNode = new DecideFlowNode(diagramViewModel); break; } case NodeKinds.COBegin: { - flowNode = new COBeginFlowNode(); + flowNode = new COBeginFlowNode(diagramViewModel); break; } case NodeKinds.COEnd: { - flowNode = new COEndFlowNode(); + flowNode = new COEndFlowNode(diagramViewModel); break; } case NodeKinds.Middle: { - var flowchartNodelModel = new MiddleFlowNode(); + var flowchartNodelModel = new MiddleFlowNode(diagramViewModel); flowNode = flowchartNodelModel; flowchartNodelModel.UserIds = UserIds?.ToList(); flowchartNodelModel.RoleIds = RoleIds?.ToList(); @@ -99,7 +100,7 @@ namespace AIStudio.Wpf.Flowchart.Models } default: { - var flowNodelModel = new FlowNode(NodeKinds.Normal); + var flowNodelModel = new FlowNode(diagramViewModel, NodeKinds.Normal); flowNode = flowNodelModel; break; } diff --git a/AIStudio.Wpf.Mind/Controls/MindEditor.xaml.cs b/AIStudio.Wpf.Mind/Controls/MindEditor.xaml.cs index d6cfe57..ce78b0e 100644 --- a/AIStudio.Wpf.Mind/Controls/MindEditor.xaml.cs +++ b/AIStudio.Wpf.Mind/Controls/MindEditor.xaml.cs @@ -35,7 +35,7 @@ namespace AIStudio.Wpf.Mind.Controls _diagramViewModel = new MindDiagramViewModel(); _diagramViewModel.GridMarginSize = new Size(0, 0); _diagramViewModel.PageSizeType = PageSizeType.Custom; - _diagramViewModel.PageSize = new SizeBase(double.NaN, double.NaN); + _diagramViewModel.PageSize = new SizeBase(double.NaN, double.NaN); _diagramViewModel.PropertyChanged += DiagramViewModel_PropertyChanged; } @@ -90,14 +90,14 @@ namespace AIStudio.Wpf.Mind.Controls private void CreateFlowchartModel(string json) { - _diagramViewModel.IsLoading = true; - _diagramViewModel.Items.Clear(); - MindNode level1node = new MindNode(_diagramViewModel, Mind.NodeLevel.Level1, _diagramViewModel.MindType) { Text = "思维导图" }; - _diagramViewModel.DirectAddItemCommand.Execute(level1node); - level1node.Left = 200; - level1node.Top = 200; - _diagramViewModel.DoCommandManager.Init(); - _diagramViewModel.IsLoading = false; + //_diagramViewModel.IsLoading = true; + //_diagramViewModel.Items.Clear(); + //MindNode level1node = new MindNode(_diagramViewModel) { Text = "思维导图" }; + //_diagramViewModel.DirectAddItemCommand.Execute(level1node); + //level1node.Left = 200; + //level1node.Top = 200; + //_diagramViewModel.DoCommandManager.Init(); + //_diagramViewModel.IsLoading = false; } public static readonly DependencyProperty GetDataFuncProperty = diff --git a/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs b/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs index ae2014c..a633f4e 100644 --- a/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs +++ b/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs @@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers { switch (mindNode.NodeLevel) { - case NodeLevel.Level1: + case 0: { mindNode.ItemWidth = 110; mindNode.ItemHeight = 40; @@ -38,7 +38,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ConnectorOrientation = ConnectorOrientation.None; break; } - case NodeLevel.Level2: + case 1: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -55,7 +55,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; break; } - case NodeLevel.Level3: + default: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -77,9 +77,19 @@ namespace AIStudio.Wpf.Mind.Helpers } } - public ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink) + public ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null) { - var connector = new ConnectionViewModel(source.Root, source.Connectors.FirstOrDefault(), sink.Connectors.FirstOrDefault(), DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + if (connector == null) + { + connector = new ConnectionViewModel(source.Root, source.FirstConnector, sink.FirstConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + } + else + { + connector?.SetSourcePort(source.FirstConnector); + connector?.SetSinkPort(sink.FirstConnector); + connector.PathMode = DrawMode.ConnectingLineStraight.ToString(); + connector.RouterMode = RouterMode.RouterOrthogonal.ToString(); + } connector.ColorViewModel.LineColor = source.ColorViewModel.LineColor; connector.SmoothMargin = 20; connector.SmoothAutoSlope = 0.2; @@ -108,7 +118,7 @@ namespace AIStudio.Wpf.Mind.Helpers var sizewithSpacing = mindNode.SizeWithSpacing; if (mindNode.Children?.Count > 0) { - if (mindNode.NodeLevel == NodeLevel.Level1) + if (mindNode.NodeLevel == 0) { var childrensizes = mindNode.Children.Select(p => MeasureOverride(p, mindNode.IsExpanded && isExpanded)).ToArray(); sizewithSpacing = new SizeBase(Math.Max(sizewithSpacing.Width, childrensizes.SumOrDefault(p => p.Width)), sizewithSpacing.Height + childrensizes.MaxOrDefault(p => p.Height)); @@ -127,7 +137,7 @@ namespace AIStudio.Wpf.Mind.Helpers public void ArrangeOverride(MindNode mindNode) { - if (mindNode.NodeLevel == NodeLevel.Level1) + if (mindNode.NodeLevel == 0) { double left = mindNode.MiddlePosition.X - Math.Max(mindNode.DesiredSize.Width, mindNode.Children.SumOrDefault(p => p.DesiredSize.Width)) / 2; double top = mindNode.MiddlePosition.Y + mindNode.ItemHeight / 2 + mindNode.Spacing.Height; @@ -142,10 +152,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.FirstConnector); - connect?.SetSinkPort(child.TopConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.FirstConnector); + connector?.SetSinkPort(child.TopConnector); + connector?.SetVisible(child.Visible); } } } @@ -164,10 +174,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.BottomConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.BottomConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } } } diff --git a/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs b/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs index c69889a..edd7b78 100644 --- a/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs +++ b/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs @@ -21,7 +21,7 @@ namespace AIStudio.Wpf.Mind.Helpers switch (mindNode.NodeLevel) { - case NodeLevel.Level1: + case 0: { mindNode.ItemWidth = 110; mindNode.ItemHeight = 40; @@ -43,7 +43,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ConnectorOrientation = ConnectorOrientation.None; break; } - case NodeLevel.Level2: + case 1: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -62,7 +62,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; break; } - case NodeLevel.Level3: + default: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -89,16 +89,16 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.GetLevel1Node().LayoutUpdating = false; } - public ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink) + public ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null) { DrawMode drawMode; RouterMode routerMode; - if (source.NodeLevel == NodeLevel.Level1) + if (source.NodeLevel == 0) { drawMode = DrawMode.ConnectingLineStraight; routerMode = RouterMode.RouterFishBone; } - else if (source.NodeLevel == NodeLevel.Level2) + else if (source.NodeLevel == 1) { drawMode = DrawMode.ConnectingLineStraight; routerMode = RouterMode.RouterNormal; @@ -109,7 +109,17 @@ namespace AIStudio.Wpf.Mind.Helpers routerMode = RouterMode.RouterOrthogonal; } - var connector = new ConnectionViewModel(source.Root, source.Connectors.FirstOrDefault(), sink.Connectors.FirstOrDefault(), drawMode, routerMode); + if (connector == null) + { + connector = new ConnectionViewModel(source.Root, source.FirstConnector, sink.FirstConnector, drawMode, routerMode); + } + else + { + connector?.SetSourcePort(source.FirstConnector); + connector?.SetSinkPort(sink.FirstConnector); + connector.PathMode = drawMode.ToString(); + connector.RouterMode = routerMode.ToString(); + } connector.ColorViewModel.LineColor = source.ColorViewModel.LineColor; connector.SmoothMargin = 20; connector.SmoothAutoSlope = 0.2; @@ -138,7 +148,7 @@ namespace AIStudio.Wpf.Mind.Helpers var bottomoffset = mindNode.Spacing.Width / 2; if (mindNode.Children?.Count > 0) { - if (mindNode.NodeLevel == NodeLevel.Level1) + if (mindNode.NodeLevel == 0) { var tops = mindNode.Children.Where((p, index) => index % 2 == 0).ToList(); tops.ForEach(p => p.ConnectorOrientation = ConnectorOrientation.BottomLeft); @@ -148,13 +158,13 @@ namespace AIStudio.Wpf.Mind.Helpers var bottomsizes = bottoms.Select(p => MeasureOverride(p, mindNode.IsExpanded && isExpanded)).ToArray(); sizewithSpacing = new SizeBase(sizewithSpacing.Width + bottomoffset + Math.Max(topsizes.SumOrDefault(p => p.Width), bottomsizes.SumOrDefault(p => p.Width)), sizewithSpacing.Height + topsizes.MaxOrDefault(p => p.Height) + bottomsizes.MaxOrDefault(p => p.Height)); } - else if (mindNode.NodeLevel == NodeLevel.Level2) + else if (mindNode.NodeLevel == 1) { var childrensizes = mindNode.Children.Select(p => MeasureOverride(p, mindNode.IsExpanded && isExpanded)).ToArray(); var lastchildsize = childrensizes.LastOrDefault(); sizewithSpacing = new SizeBase(Math.Max(sizewithSpacing.Width, sizewithSpacing.Height + childrensizes.SumOrDefault(p => p.Height) - lastchildsize.Height / 2 + lastchildsize.Width), sizewithSpacing.Height + childrensizes.SumOrDefault(p => p.Height)); } - else if (mindNode.NodeLevel == NodeLevel.Level3) + else { var childrensizes = mindNode.Children.Select(p => MeasureOverride(p, mindNode.IsExpanded && isExpanded)).ToArray(); sizewithSpacing = new SizeBase(Math.Max(sizewithSpacing.Width, sizewithSpacing.Width * 0.5 + childrensizes.MaxOrDefault(p => p.Width)), sizewithSpacing.Height + childrensizes.SumOrDefault(p => p.Height)); @@ -168,7 +178,7 @@ namespace AIStudio.Wpf.Mind.Helpers public void ArrangeOverride(MindNode mindNode) { - if (mindNode.NodeLevel == NodeLevel.Level1) + if (mindNode.NodeLevel == 0) { var tops = mindNode.Children.Where(p => p.ConnectorOrientation == ConnectorOrientation.BottomLeft).ToList(); double topleft = mindNode.MiddlePosition.X + mindNode.ItemWidth / 2 + mindNode.Spacing.Width; @@ -185,10 +195,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.RightConnector); - connect?.SetSinkPort(child.BottomLeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.RightConnector); + connector?.SetSinkPort(child.BottomLeftConnector); + connector?.SetVisible(child.Visible); } } @@ -208,14 +218,14 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.RightConnector); - connect?.SetSinkPort(child.TopLeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.RightConnector); + connector?.SetSinkPort(child.TopLeftConnector); + connector?.SetVisible(child.Visible); } } } - else if (mindNode.NodeLevel == NodeLevel.Level2) + else if (mindNode.NodeLevel == 1) { if (mindNode.ConnectorOrientation == ConnectorOrientation.BottomLeft) { @@ -233,10 +243,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.BottomLeftConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.BottomLeftConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } } } @@ -256,15 +266,15 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.TopLeftConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.TopLeftConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } } } } - else if (mindNode.NodeLevel == NodeLevel.Level3) + else { if (mindNode.GetLevel2Node().ConnectorOrientation == ConnectorOrientation.BottomLeft) { @@ -281,10 +291,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.BottomConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.BottomConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } } } @@ -303,10 +313,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.TopConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.TopConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } } } diff --git a/AIStudio.Wpf.Mind/Helpers/IMindLayout.cs b/AIStudio.Wpf.Mind/Helpers/IMindLayout.cs index 55acb73..d1482c3 100644 --- a/AIStudio.Wpf.Mind/Helpers/IMindLayout.cs +++ b/AIStudio.Wpf.Mind/Helpers/IMindLayout.cs @@ -9,7 +9,7 @@ namespace AIStudio.Wpf.Mind.Helpers public interface IMindLayout { void Appearance(MindNode mindNode); - ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink); + ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null); void LayoutUpdated(MindNode mindNode); } diff --git a/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs b/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs index 2a92eb5..2303e4c 100644 --- a/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs +++ b/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs @@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers { switch (mindNode.NodeLevel) { - case NodeLevel.Level1: + case 0: { mindNode.ItemWidth = 110; mindNode.ItemHeight = 40; @@ -39,7 +39,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ConnectorOrientation = ConnectorOrientation.None; break; } - case NodeLevel.Level2: + case 1: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -56,7 +56,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; break; } - case NodeLevel.Level3: + case 2: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -77,9 +77,19 @@ namespace AIStudio.Wpf.Mind.Helpers } } } - public ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink) + public ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null) { - var connector = new ConnectionViewModel(source.Root, source.Connectors.FirstOrDefault(), sink.Connectors.FirstOrDefault(), DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + if (connector == null) + { + connector = new ConnectionViewModel(source.Root, source.FirstConnector, sink.FirstConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + } + else + { + connector?.SetSourcePort(source.FirstConnector); + connector?.SetSinkPort(sink.FirstConnector); + connector.PathMode = DrawMode.ConnectingLineSmooth.ToString(); + connector.RouterMode = RouterMode.RouterNormal.ToString(); + } connector.ColorViewModel.LineColor = source.ColorViewModel.LineColor; connector.SmoothMargin = 20; connector.SmoothAutoSlope = 0.2; @@ -131,10 +141,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.RightConnector ?? mindNode.FirstConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.RightConnector ?? mindNode.FirstConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } } diff --git a/AIStudio.Wpf.Mind/Helpers/MindLayout.cs b/AIStudio.Wpf.Mind/Helpers/MindLayout.cs index 892d2c7..7f61a4b 100644 --- a/AIStudio.Wpf.Mind/Helpers/MindLayout.cs +++ b/AIStudio.Wpf.Mind/Helpers/MindLayout.cs @@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers { switch (mindNode.NodeLevel) { - case NodeLevel.Level1: + case 0: { mindNode.ItemWidth = 110; mindNode.ItemHeight = 40; @@ -39,7 +39,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ConnectorOrientation = ConnectorOrientation.None; break; } - case NodeLevel.Level2: + case 1: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -56,7 +56,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; break; } - case NodeLevel.Level3: + default: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -78,9 +78,19 @@ namespace AIStudio.Wpf.Mind.Helpers } } - public ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink) + public ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null) { - var connector = new ConnectionViewModel(source.Root, source.Connectors.FirstOrDefault(), sink.Connectors.FirstOrDefault(), DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + if (connector == null) + { + connector = new ConnectionViewModel(source.Root, source.FirstConnector, sink.FirstConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + } + else + { + connector?.SetSourcePort(source.FirstConnector); + connector?.SetSinkPort(sink.FirstConnector); + connector.PathMode = DrawMode.ConnectingLineSmooth.ToString(); + connector.RouterMode = RouterMode.RouterNormal.ToString(); + } connector.ColorViewModel.LineColor = source.ColorViewModel.LineColor; connector.SmoothMargin = 20; connector.SmoothAutoSlope = 0.2; @@ -108,7 +118,7 @@ namespace AIStudio.Wpf.Mind.Helpers var sizewithSpacing = mindNode.SizeWithSpacing; if (mindNode.Children?.Count > 0) { - if (mindNode.NodeLevel == NodeLevel.Level1) + if (mindNode.NodeLevel == 0) { var rights = mindNode.Children.Where((p, index) => index % 2 == 0).ToList(); rights.ForEach(p => p.ConnectorOrientation = ConnectorOrientation.Left); @@ -132,7 +142,7 @@ namespace AIStudio.Wpf.Mind.Helpers public void ArrangeOverride(MindNode mindNode) { - if (mindNode.NodeLevel == NodeLevel.Level1) + if (mindNode.NodeLevel == 0) { if (mindNode.Children?.Count > 0) { @@ -148,10 +158,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.FirstConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.FirstConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } var lefts = mindNode.Children.Where(p => p.ConnectorOrientation == ConnectorOrientation.Right).ToList(); @@ -166,10 +176,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.FirstConnector); - connect?.SetSinkPort(child.RightConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.FirstConnector); + connector?.SetSinkPort(child.RightConnector); + connector?.SetVisible(child.Visible); } } } @@ -190,10 +200,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.RightConnector); - connect?.SetSinkPort(child.LeftConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.RightConnector); + connector?.SetSinkPort(child.LeftConnector); + connector?.SetVisible(child.Visible); } } } @@ -212,10 +222,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.LeftConnector); - connect?.SetSinkPort(child.RightConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.LeftConnector); + connector?.SetSinkPort(child.RightConnector); + connector?.SetVisible(child.Visible); } } } diff --git a/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs b/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs index a069fdf..3af3b8a 100644 --- a/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs +++ b/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs @@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers { switch (mindNode.NodeLevel) { - case NodeLevel.Level1: + case 0: { mindNode.ItemWidth = 110; mindNode.ItemHeight = 40; @@ -38,7 +38,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ConnectorOrientation = ConnectorOrientation.None; break; } - case NodeLevel.Level2: + case 1: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -56,7 +56,7 @@ namespace AIStudio.Wpf.Mind.Helpers mindNode.ConnectorOrientation = ConnectorOrientation.Top; break; } - case NodeLevel.Level3: + default: { mindNode.ItemWidth = 80; mindNode.ItemHeight = 25; @@ -79,9 +79,19 @@ namespace AIStudio.Wpf.Mind.Helpers } } - public ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink) + public ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null) { - var connector = new ConnectionViewModel(source.Root, source.Connectors.FirstOrDefault(), sink.Connectors.FirstOrDefault(), DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + if (connector == null) + { + connector = new ConnectionViewModel(source.Root, source.FirstConnector, sink.FirstConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + } + else + { + connector?.SetSourcePort(source.FirstConnector); + connector?.SetSinkPort(sink.FirstConnector); + connector.PathMode = DrawMode.ConnectingLineStraight.ToString(); + connector.RouterMode = RouterMode.RouterOrthogonal.ToString(); + } connector.ColorViewModel.LineColor = source.ColorViewModel.LineColor; connector.SmoothMargin = 20; connector.SmoothAutoSlope = 0.2; @@ -133,10 +143,10 @@ namespace AIStudio.Wpf.Mind.Helpers ArrangeOverride(child); - var connect = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); - connect?.SetSourcePort(mindNode.BottomConnector); - connect?.SetSinkPort(child.TopConnector); - connect?.SetVisible(child.Visible); + var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); + connector?.SetSourcePort(mindNode.BottomConnector); + connector?.SetSinkPort(child.TopConnector); + connector?.SetVisible(child.Visible); } } diff --git a/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs b/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs index bf5f273..64dc0d9 100644 --- a/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs +++ b/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs @@ -14,26 +14,11 @@ namespace AIStudio.Wpf.Mind.Models } public MindNodeDesignerItem(MindNode item) : base(item) { - NodeLevel = item.NodeLevel; - MindType = item.MindType; Spacing = item.Spacing; Offset = item.Offset; IsExpanded = item.IsExpanded; } - - [XmlAttribute] - public NodeLevel NodeLevel - { - get; set; - } - - [XmlAttribute] - public MindType MindType - { - get; set; - } - [XmlIgnore] public Size Spacing { diff --git a/AIStudio.Wpf.Mind/Models/MindNodeModel.cs b/AIStudio.Wpf.Mind/Models/MindNodeModel.cs index 2f44ff7..ce093f2 100644 --- a/AIStudio.Wpf.Mind/Models/MindNodeModel.cs +++ b/AIStudio.Wpf.Mind/Models/MindNodeModel.cs @@ -1,4 +1,5 @@ using System.Windows; +using AIStudio.Wpf.DiagramDesigner; using AIStudio.Wpf.DiagramModels; using AIStudio.Wpf.DiagramModels.ViewModels; using AIStudio.Wpf.Mind; @@ -9,16 +10,6 @@ namespace AIStudio.Wpf.Flowchart.Models public class MindNodeModel : DiagramNode { - public NodeLevel NodeLevel - { - get; set; - } - - public MindType MindType - { - get; set; - } - public Size Spacing { get; set; @@ -35,9 +26,9 @@ namespace AIStudio.Wpf.Flowchart.Models get; set; } - public override DiagramItemViewModel ToNodel() + public override DiagramItemViewModel ToNodel(IDiagramViewModel diagramViewModel) { - MindNode mindNode = new MindNode(NodeLevel, MindType); + MindNode mindNode = new MindNode(diagramViewModel); mindNode.Spacing = Spacing; mindNode.Offset = Offset; diff --git a/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs b/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs index a3ec4f6..c3968c9 100644 --- a/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs +++ b/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs @@ -11,22 +11,27 @@ namespace AIStudio.Wpf.Mind.ViewModels { MindType MindType { - get;set; + get; set; + } + + MindNode RootItem + { + get; } SimpleCommand AddParentCommand { - get; + get; } SimpleCommand AddChildCommand { - get; + get; } SimpleCommand AddPeerCommand { - get; + get; } SimpleCommand DeleteSelfCommand @@ -52,6 +57,6 @@ namespace AIStudio.Wpf.Mind.ViewModels SimpleCommand ChangeMindThemeCommand { get; - } + } } } diff --git a/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs b/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs index 55701ea..6b74941 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs @@ -23,9 +23,21 @@ namespace AIStudio.Wpf.Mind.ViewModels } } } + + public MindNode RootItem + { + get + { + return Items.OfType().FirstOrDefault(); + } + } #endregion #region 命令 + public SimpleCommand AddRootCommand + { + get; private set; + } public SimpleCommand AddParentCommand { @@ -64,7 +76,7 @@ namespace AIStudio.Wpf.Mind.ViewModels { return this._changeMindTypeCommand ?? (this._changeMindTypeCommand = new SimpleCommand(MindExecuteEnable, this.ExecutedChangeMindTypeCommand)); } - } + } public SimpleCommand ChangeMindThemeCommand { @@ -115,6 +127,11 @@ namespace AIStudio.Wpf.Mind.ViewModels DeleteSelfCommand = new SimpleCommand(MindLevelEnable, ExecuteDeleteSelfCommand); MoveForwardCommand = new SimpleCommand(MindExecuteEnable, ExecuteMoveForwardCommand); MoveBackCommand = new SimpleCommand(MindExecuteEnable, ExecuteMoveBackCommand); + + MindNode level1node = new MindNode(this) { Left = 200, Top = 200, Text = "思维导图" }; + level1node.InitLayout(true); + Items.Add(level1node); + level1node.IsSelected = true; } public bool MindExecuteEnable(object para) @@ -130,7 +147,7 @@ namespace AIStudio.Wpf.Mind.ViewModels { if (MindExecuteEnable(obj) == false) return false; - return (SelectedItem as MindNode).NodeLevel != NodeLevel.Level1; + return (SelectedItem as MindNode).NodeLevel != 0; } #region 操作 @@ -138,9 +155,9 @@ namespace AIStudio.Wpf.Mind.ViewModels { if (obj is MindType mindType) { - Items.OfType().ToList().ForEach(item => { item.MindType = mindType; }); - - Items.OfType().FirstOrDefault()?.LayoutUpdated(); + Items.OfType().ToList().ForEach(item => { item.InitLayout(true); }); + Items.OfType().ToList().ForEach(item => { item.InitConnectLayout(); }); + RootItem?.LayoutUpdated(); } } @@ -163,7 +180,7 @@ namespace AIStudio.Wpf.Mind.ViewModels if (items?.Count == 0) { - var node = new MindNode(this, (NodeLevel)Math.Min((int)parent.NodeLevel + 1, (int)NodeLevel.Level3), this.MindType) { Text = "分支主题" }; + var node = new MindNode(this) { Text = "分支主题" }; items.Add(node); } @@ -203,7 +220,7 @@ namespace AIStudio.Wpf.Mind.ViewModels } if (items?.Count == 0) { - items.Add(new MindNode(this, node.NodeLevel, this.MindType) { Text = "分支主题" }); + items.Add(new MindNode(this) { Text = "分支主题" }); } if (node.Parent is MindNode parent) @@ -249,7 +266,7 @@ namespace AIStudio.Wpf.Mind.ViewModels if (items?.Count == 0) { - var node = new MindNode(this, pear.NodeLevel, this.MindType) { Text = "分支主题" }; + var node = new MindNode(this) { Text = "分支主题" }; items.Add(node); } diff --git a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs index ee698f5..a8f5bae 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs @@ -25,16 +25,13 @@ namespace AIStudio.Wpf.Mind.ViewModels { public class MindNode : DiagramItemViewModel { - public MindNode(NodeLevel nodeLevel, MindType mindType = MindType.Mind) : this(null, nodeLevel, mindType) + public MindNode() : this(null) { } - public MindNode(IDiagramViewModel root, NodeLevel nodeLevel, MindType mindType = MindType.Mind) : base(root) + public MindNode(IDiagramViewModel root) : base(root) { - NodeLevel = nodeLevel; - MindType = mindType; - InitLayout(true); } public MindNode(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) @@ -67,7 +64,7 @@ namespace AIStudio.Wpf.Mind.ViewModels BuildMenuOptions(); } - protected void InitLayout(bool initAppearance) + public void InitLayout(bool initAppearance) { var layout = GlobalType.AllTypes.Where(p => typeof(IMindLayout).IsAssignableFrom(p)).FirstOrDefault(p => p.Name == MindType.ToString() + "Layout"); MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout(); @@ -76,6 +73,7 @@ namespace AIStudio.Wpf.Mind.ViewModels { MindLayout.Appearance(this); } + this.PropertyChanged -= this.Item_PropertyChanged; this.PropertyChanged += this.Item_PropertyChanged; } @@ -85,8 +83,6 @@ namespace AIStudio.Wpf.Mind.ViewModels if (designerbase is MindNodeDesignerItem designer) { - NodeLevel = designer.NodeLevel; - MindType = designer.MindType; Spacing = designer.Spacing; Offset = designer.Offset; IsExpanded = designer.IsExpanded; @@ -97,8 +93,6 @@ namespace AIStudio.Wpf.Mind.ViewModels { var mindNodeModel = new MindNodeModel(); - mindNodeModel.NodeLevel = NodeLevel; - mindNodeModel.MindType = MindType; mindNodeModel.Spacing = Spacing; mindNodeModel.Offset = Offset; mindNodeModel.IsExpanded = IsExpanded; @@ -111,7 +105,7 @@ namespace AIStudio.Wpf.Mind.ViewModels { if (Command_Enable(obj) == false) return false; - return NodeLevel != NodeLevel.Level1; + return NodeLevel != 0; } #region 属性 @@ -119,53 +113,36 @@ namespace AIStudio.Wpf.Mind.ViewModels { get; set; } - [Browsable(false)] - private NodeLevel _nodeLevel; - public NodeLevel NodeLevel + + public MindNode ParentNode { get { - return _nodeLevel; + return Parent as MindNode; } - set + + } + + public int NodeLevel + { + get { - SetProperty(ref _nodeLevel, value); + if (ParentNode == null) + { + return 0; + } + else + { + return ParentNode.NodeLevel + 1; + } } } - //public MindNode ParentNode - //{ - // get - // { - // return Parent as MindNode; - // } - //} - - //public int NodeLevel - //{ - // get - // { - // if (ParentNode == null) - // { - // return 0; - // } - // else - // { - // return ParentNode.NodeLevel + 1; - // } - // } - //} - - private MindType _mindType; public MindType MindType { get { - return _mindType; - } - set - { - SetProperty(ref _mindType, value); + return (Root as IMindDiagramViewModel)?.MindType ?? MindType.Mind; } } @@ -395,14 +372,6 @@ namespace AIStudio.Wpf.Mind.ViewModels #region 操作 public void AddChild(MindNode item, int index = -1) { - if (this.NodeLevel == NodeLevel.Level1) - { - item.NodeLevel = NodeLevel.Level2; - } - else - { - item.NodeLevel = NodeLevel.Level3; - } if (index >= 0) { this.Children.Insert(index, item); @@ -412,7 +381,9 @@ namespace AIStudio.Wpf.Mind.ViewModels this.Children.Add(item); } item.Parent = this; - ConnectionViewModel connector = MindLayout?.GetConnectionViewModel(this, item); + item.InitLayout(true); + + ConnectionViewModel connector = MindLayout?.GetOrSetConnectionViewModel(this, item); Root?.DirectAddItemCommand.Execute(new SelectableDesignerItemViewModelBase[] { item, connector }); connector.ZIndex = -1; this.IsSelected = true; @@ -440,6 +411,15 @@ namespace AIStudio.Wpf.Mind.ViewModels } } } + + public void InitConnectLayout() + { + var connector = Root?.Items.OfType().Where(p => p.IsFullConnection).FirstOrDefault(p => p.SinkConnectorInfoFully.DataItem == this); + if (connector != null) + { + MindLayout?.GetOrSetConnectionViewModel(connector.SourceConnectorInfo.DataItem as MindNode, connector.SinkConnectorInfoFully.DataItem as MindNode, connector); + } + } #endregion private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) @@ -458,14 +438,11 @@ namespace AIStudio.Wpf.Mind.ViewModels case nameof(NodeLevel): MindLayout?.Appearance(this); break; - case nameof(MindType): - InitLayout(true); - break; case nameof(Left): { if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) { - if (NodeLevel == NodeLevel.Level1) + if (NodeLevel == 0) { LayoutUpdated(); } @@ -481,7 +458,7 @@ namespace AIStudio.Wpf.Mind.ViewModels { if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) { - if (NodeLevel == NodeLevel.Level1) + if (NodeLevel == 0) { LayoutUpdated(); } @@ -516,7 +493,7 @@ namespace AIStudio.Wpf.Mind.ViewModels public MindNode GetLevel2Node() { var node = this; - while (node.Parent is MindNode mindNode && mindNode.NodeLevel == NodeLevel.Level2) + while (node.Parent is MindNode mindNode && mindNode.NodeLevel == 1) { node = mindNode; }