可以切换MindType

This commit is contained in:
艾竹
2023-03-05 23:22:34 +08:00
parent 79f4896fbd
commit cd20abd7fe
18 changed files with 286 additions and 254 deletions

View File

@@ -23,7 +23,7 @@ namespace AIStudio.Wpf.Flowchart
} }
public MindViewModel(string filename, DiagramDocument diagramDocument) : base(filename, diagramDocument) public MindViewModel(string filename, DiagramDocument diagramDocument) : base(filename, diagramDocument)
{ {
_service.DrawModeViewModel.LineDrawMode = DrawMode.ConnectingLineSmooth;
} }
protected override void InitDiagramViewModel() protected override void InitDiagramViewModel()
@@ -35,6 +35,14 @@ namespace AIStudio.Wpf.Flowchart
DiagramViewModel.AllowDrop = false; DiagramViewModel.AllowDrop = false;
} }
public IMindDiagramViewModel MindDiagramViewModel
{
get
{
return DiagramViewModel as IMindDiagramViewModel;
}
}
protected override void Init() protected override void Init()
{ {
DiagramViewModels = new ObservableCollection<IDiagramViewModel>() DiagramViewModels = new ObservableCollection<IDiagramViewModel>()
@@ -44,51 +52,32 @@ namespace AIStudio.Wpf.Flowchart
DiagramViewModel = DiagramViewModels.FirstOrDefault(); DiagramViewModel = DiagramViewModels.FirstOrDefault();
InitDiagramViewModel(); InitDiagramViewModel();
var level1node = MindDiagramViewModel.RootItem;
MindNode level1node = new MindNode(DiagramViewModel, Mind.NodeLevel.Level1, MindType) { Text = "思维导图" };
DiagramViewModel.DirectAddItemCommand.Execute(level1node);
DiagramViewModel.CenterMoveCommand.Execute(level1node); DiagramViewModel.CenterMoveCommand.Execute(level1node);
MindNode level2node1_1 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2, MindType) { Text = "分支主题1" }; MindNode level2node1_1 = new MindNode(DiagramViewModel) { Text = "分支主题1" };
level1node.AddChild(level2node1_1); MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level1node, level2node1_1 });
MindNode level3node1_1_1 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level3, MindType) { Text = "分支主题1_1" }; MindNode level2node1_1_1 = new MindNode(DiagramViewModel) { Text = "分支主题1_1" };
level2node1_1.AddChild(level3node1_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" }; MindNode level2node1_1_2 = new MindNode(DiagramViewModel) { Text = "分支主题1_2" };
level2node1_1.AddChild(level3node1_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" }; MindNode level2node1_1_3 = new MindNode(DiagramViewModel) { Text = "分支主题1_3" };
level2node1_1.AddChild(level3node1_1_3); MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level2node1_1, level2node1_1_3 });
MindNode level2node1_2 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2, MindType) { Text = "分支主题2" }; MindNode level2node1_2 = new MindNode(DiagramViewModel) { Text = "分支主题2" };
level1node.AddChild(level2node1_2); MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level1node, level2node1_2 });
MindNode level2node1_3 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2, MindType) { Text = "分支主题3" }; MindNode level2node1_3 = new MindNode(DiagramViewModel) { Text = "分支主题3" };
level1node.AddChild(level2node1_3); MindDiagramViewModel.AddChildCommand.Execute(new MindNode[] { level1node, level2node1_3 });
DiagramViewModel.ClearSelectedItemsCommand.Execute(null); DiagramViewModel.ClearSelectedItemsCommand.Execute(null);
level1node.LayoutUpdated(); 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() public override void Dispose()
{ {
base.Dispose(); base.Dispose();

View File

@@ -1763,16 +1763,16 @@
<TextBlock Text="S" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="9"/> <TextBlock Text="S" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="9"/>
</Grid> </Grid>
</Fluent:SplitButton.LargeIcon> </Fluent:SplitButton.LargeIcon>
<ListBox BorderThickness="0" helper:EnumHelper.Enum="{x:Type mimd:MindType}" SelectedItem="{Binding SelectedItem.MindType}"> <!--<ListBox BorderThickness="0" helper:EnumHelper.Enum="{x:Type mimd:MindType}" SelectedItem="{Binding SelectedItem.MindType}">
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<TextBlock Text="{Binding .,Converter={StaticResource EnumDescriptionConverter}}" Margin="5"/> <TextBlock Text="{Binding .,Converter={StaticResource EnumDescriptionConverter}}" Margin="5"/>
</DataTemplate> </DataTemplate>
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
</ListBox> </ListBox>-->
<Fluent:SplitButton.ToolTip> <Fluent:SplitButton.ToolTip>
<Fluent:ScreenTip Title="PageSize" <Fluent:ScreenTip Title="MindType"
Text="页面大小" Text="类型"
Width="190" /> Width="190" />
</Fluent:SplitButton.ToolTip> </Fluent:SplitButton.ToolTip>
</Fluent:SplitButton> </Fluent:SplitButton>

View File

@@ -250,14 +250,30 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
private string _pathMode;
public string PathMode public string PathMode
{ {
get; set; get
{
return _pathMode;
}
set
{
SetProperty(ref _pathMode, value);
}
} }
private string _routerMode;
public string RouterMode public string RouterMode
{ {
get; set; get
{
return _routerMode;
}
set
{
SetProperty(ref _routerMode, value);
}
} }
public IRouter Router public IRouter Router

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using AIStudio.Wpf.DiagramDesigner;
using AIStudio.Wpf.DiagramModels.ViewModels; using AIStudio.Wpf.DiagramModels.ViewModels;
namespace AIStudio.Wpf.DiagramModels namespace AIStudio.Wpf.DiagramModels
@@ -180,9 +181,9 @@ namespace AIStudio.Wpf.DiagramModels
get; set; get; set;
} }
public virtual DiagramItemViewModel ToNodel() public virtual DiagramItemViewModel ToNodel(IDiagramViewModel diagramViewModel)
{ {
return new DiagramItemViewModel(); return new DiagramItemViewModel(diagramViewModel);
} }
} }

View File

@@ -119,7 +119,7 @@ namespace AIStudio.Wpf.DiagramModels
private static DiagramItemViewModel ToNodelModel(this DiagramNode diagramNode, IDiagramViewModel diagram) private static DiagramItemViewModel ToNodelModel(this DiagramNode diagramNode, IDiagramViewModel diagram)
{ {
DiagramItemViewModel nodeModel = diagramNode.ToNodel(); DiagramItemViewModel nodeModel = diagramNode.ToNodel(diagram);
nodeModel.Id = new Guid(diagramNode.Id); nodeModel.Id = new Guid(diagramNode.Id);
if (!string.IsNullOrEmpty(diagramNode.ParentId)) if (!string.IsNullOrEmpty(diagramNode.ParentId))

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using AIStudio.Wpf.DiagramDesigner;
using AIStudio.Wpf.DiagramModels; using AIStudio.Wpf.DiagramModels;
using AIStudio.Wpf.DiagramModels.ViewModels; using AIStudio.Wpf.DiagramModels.ViewModels;
using AIStudio.Wpf.Flowchart.ViewModels; using AIStudio.Wpf.Flowchart.ViewModels;
@@ -57,40 +58,40 @@ namespace AIStudio.Wpf.Flowchart.Models
get; set; get; set;
} }
public override DiagramItemViewModel ToNodel() public override DiagramItemViewModel ToNodel(IDiagramViewModel diagramViewModel)
{ {
FlowNode flowNode = null; FlowNode flowNode = null;
switch (Kind) switch (Kind)
{ {
case NodeKinds.Start: case NodeKinds.Start:
{ {
flowNode = new StartFlowNode(); flowNode = new StartFlowNode(diagramViewModel);
break; break;
} }
case NodeKinds.End: case NodeKinds.End:
{ {
flowNode = new EndFlowNode(); flowNode = new EndFlowNode(diagramViewModel);
break; break;
} }
case NodeKinds.Decide: case NodeKinds.Decide:
{ {
flowNode = new DecideFlowNode(); flowNode = new DecideFlowNode(diagramViewModel);
break; break;
} }
case NodeKinds.COBegin: case NodeKinds.COBegin:
{ {
flowNode = new COBeginFlowNode(); flowNode = new COBeginFlowNode(diagramViewModel);
break; break;
} }
case NodeKinds.COEnd: case NodeKinds.COEnd:
{ {
flowNode = new COEndFlowNode(); flowNode = new COEndFlowNode(diagramViewModel);
break; break;
} }
case NodeKinds.Middle: case NodeKinds.Middle:
{ {
var flowchartNodelModel = new MiddleFlowNode(); var flowchartNodelModel = new MiddleFlowNode(diagramViewModel);
flowNode = flowchartNodelModel; flowNode = flowchartNodelModel;
flowchartNodelModel.UserIds = UserIds?.ToList(); flowchartNodelModel.UserIds = UserIds?.ToList();
flowchartNodelModel.RoleIds = RoleIds?.ToList(); flowchartNodelModel.RoleIds = RoleIds?.ToList();
@@ -99,7 +100,7 @@ namespace AIStudio.Wpf.Flowchart.Models
} }
default: default:
{ {
var flowNodelModel = new FlowNode(NodeKinds.Normal); var flowNodelModel = new FlowNode(diagramViewModel, NodeKinds.Normal);
flowNode = flowNodelModel; flowNode = flowNodelModel;
break; break;
} }

View File

@@ -90,14 +90,14 @@ namespace AIStudio.Wpf.Mind.Controls
private void CreateFlowchartModel(string json) private void CreateFlowchartModel(string json)
{ {
_diagramViewModel.IsLoading = true; //_diagramViewModel.IsLoading = true;
_diagramViewModel.Items.Clear(); //_diagramViewModel.Items.Clear();
MindNode level1node = new MindNode(_diagramViewModel, Mind.NodeLevel.Level1, _diagramViewModel.MindType) { Text = "思维导图" }; //MindNode level1node = new MindNode(_diagramViewModel) { Text = "思维导图" };
_diagramViewModel.DirectAddItemCommand.Execute(level1node); //_diagramViewModel.DirectAddItemCommand.Execute(level1node);
level1node.Left = 200; //level1node.Left = 200;
level1node.Top = 200; //level1node.Top = 200;
_diagramViewModel.DoCommandManager.Init(); //_diagramViewModel.DoCommandManager.Init();
_diagramViewModel.IsLoading = false; //_diagramViewModel.IsLoading = false;
} }
public static readonly DependencyProperty GetDataFuncProperty = public static readonly DependencyProperty GetDataFuncProperty =

View File

@@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers
{ {
switch (mindNode.NodeLevel) switch (mindNode.NodeLevel)
{ {
case NodeLevel.Level1: case 0:
{ {
mindNode.ItemWidth = 110; mindNode.ItemWidth = 110;
mindNode.ItemHeight = 40; mindNode.ItemHeight = 40;
@@ -38,7 +38,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ConnectorOrientation = ConnectorOrientation.None; mindNode.ConnectorOrientation = ConnectorOrientation.None;
break; break;
} }
case NodeLevel.Level2: case 1:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; mindNode.ItemHeight = 25;
@@ -55,7 +55,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall;
break; break;
} }
case NodeLevel.Level3: default:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; 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.ColorViewModel.LineColor = source.ColorViewModel.LineColor;
connector.SmoothMargin = 20; connector.SmoothMargin = 20;
connector.SmoothAutoSlope = 0.2; connector.SmoothAutoSlope = 0.2;
@@ -108,7 +118,7 @@ namespace AIStudio.Wpf.Mind.Helpers
var sizewithSpacing = mindNode.SizeWithSpacing; var sizewithSpacing = mindNode.SizeWithSpacing;
if (mindNode.Children?.Count > 0) 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(); 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)); 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) 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 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; double top = mindNode.MiddlePosition.Y + mindNode.ItemHeight / 2 + mindNode.Spacing.Height;
@@ -142,10 +152,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.FirstConnector); connector?.SetSourcePort(mindNode.FirstConnector);
connect?.SetSinkPort(child.TopConnector); connector?.SetSinkPort(child.TopConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }
@@ -164,10 +174,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.BottomConnector); connector?.SetSourcePort(mindNode.BottomConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }

View File

@@ -21,7 +21,7 @@ namespace AIStudio.Wpf.Mind.Helpers
switch (mindNode.NodeLevel) switch (mindNode.NodeLevel)
{ {
case NodeLevel.Level1: case 0:
{ {
mindNode.ItemWidth = 110; mindNode.ItemWidth = 110;
mindNode.ItemHeight = 40; mindNode.ItemHeight = 40;
@@ -43,7 +43,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ConnectorOrientation = ConnectorOrientation.None; mindNode.ConnectorOrientation = ConnectorOrientation.None;
break; break;
} }
case NodeLevel.Level2: case 1:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; mindNode.ItemHeight = 25;
@@ -62,7 +62,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall;
break; break;
} }
case NodeLevel.Level3: default:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; mindNode.ItemHeight = 25;
@@ -89,16 +89,16 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.GetLevel1Node().LayoutUpdating = false; mindNode.GetLevel1Node().LayoutUpdating = false;
} }
public ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink) public ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null)
{ {
DrawMode drawMode; DrawMode drawMode;
RouterMode routerMode; RouterMode routerMode;
if (source.NodeLevel == NodeLevel.Level1) if (source.NodeLevel == 0)
{ {
drawMode = DrawMode.ConnectingLineStraight; drawMode = DrawMode.ConnectingLineStraight;
routerMode = RouterMode.RouterFishBone; routerMode = RouterMode.RouterFishBone;
} }
else if (source.NodeLevel == NodeLevel.Level2) else if (source.NodeLevel == 1)
{ {
drawMode = DrawMode.ConnectingLineStraight; drawMode = DrawMode.ConnectingLineStraight;
routerMode = RouterMode.RouterNormal; routerMode = RouterMode.RouterNormal;
@@ -109,7 +109,17 @@ namespace AIStudio.Wpf.Mind.Helpers
routerMode = RouterMode.RouterOrthogonal; 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.ColorViewModel.LineColor = source.ColorViewModel.LineColor;
connector.SmoothMargin = 20; connector.SmoothMargin = 20;
connector.SmoothAutoSlope = 0.2; connector.SmoothAutoSlope = 0.2;
@@ -138,7 +148,7 @@ namespace AIStudio.Wpf.Mind.Helpers
var bottomoffset = mindNode.Spacing.Width / 2; var bottomoffset = mindNode.Spacing.Width / 2;
if (mindNode.Children?.Count > 0) 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(); var tops = mindNode.Children.Where((p, index) => index % 2 == 0).ToList();
tops.ForEach(p => p.ConnectorOrientation = ConnectorOrientation.BottomLeft); 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(); 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)); 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 childrensizes = mindNode.Children.Select(p => MeasureOverride(p, mindNode.IsExpanded && isExpanded)).ToArray();
var lastchildsize = childrensizes.LastOrDefault(); 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)); 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(); 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)); 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) 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(); var tops = mindNode.Children.Where(p => p.ConnectorOrientation == ConnectorOrientation.BottomLeft).ToList();
double topleft = mindNode.MiddlePosition.X + mindNode.ItemWidth / 2 + mindNode.Spacing.Width; double topleft = mindNode.MiddlePosition.X + mindNode.ItemWidth / 2 + mindNode.Spacing.Width;
@@ -185,10 +195,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.RightConnector); connector?.SetSourcePort(mindNode.RightConnector);
connect?.SetSinkPort(child.BottomLeftConnector); connector?.SetSinkPort(child.BottomLeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
@@ -208,14 +218,14 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.RightConnector); connector?.SetSourcePort(mindNode.RightConnector);
connect?.SetSinkPort(child.TopLeftConnector); connector?.SetSinkPort(child.TopLeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }
else if (mindNode.NodeLevel == NodeLevel.Level2) else if (mindNode.NodeLevel == 1)
{ {
if (mindNode.ConnectorOrientation == ConnectorOrientation.BottomLeft) if (mindNode.ConnectorOrientation == ConnectorOrientation.BottomLeft)
{ {
@@ -233,10 +243,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.BottomLeftConnector); connector?.SetSourcePort(mindNode.BottomLeftConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }
@@ -256,15 +266,15 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.TopLeftConnector); connector?.SetSourcePort(mindNode.TopLeftConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }
} }
else if (mindNode.NodeLevel == NodeLevel.Level3) else
{ {
if (mindNode.GetLevel2Node().ConnectorOrientation == ConnectorOrientation.BottomLeft) if (mindNode.GetLevel2Node().ConnectorOrientation == ConnectorOrientation.BottomLeft)
{ {
@@ -281,10 +291,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.BottomConnector); connector?.SetSourcePort(mindNode.BottomConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }
@@ -303,10 +313,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.TopConnector); connector?.SetSourcePort(mindNode.TopConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }

View File

@@ -9,7 +9,7 @@ namespace AIStudio.Wpf.Mind.Helpers
public interface IMindLayout public interface IMindLayout
{ {
void Appearance(MindNode mindNode); void Appearance(MindNode mindNode);
ConnectionViewModel GetConnectionViewModel(MindNode source, MindNode sink); ConnectionViewModel GetOrSetConnectionViewModel(MindNode source, MindNode sink, ConnectionViewModel connector = null);
void LayoutUpdated(MindNode mindNode); void LayoutUpdated(MindNode mindNode);
} }

View File

@@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers
{ {
switch (mindNode.NodeLevel) switch (mindNode.NodeLevel)
{ {
case NodeLevel.Level1: case 0:
{ {
mindNode.ItemWidth = 110; mindNode.ItemWidth = 110;
mindNode.ItemHeight = 40; mindNode.ItemHeight = 40;
@@ -39,7 +39,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ConnectorOrientation = ConnectorOrientation.None; mindNode.ConnectorOrientation = ConnectorOrientation.None;
break; break;
} }
case NodeLevel.Level2: case 1:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; mindNode.ItemHeight = 25;
@@ -56,7 +56,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall;
break; break;
} }
case NodeLevel.Level3: case 2:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; 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.ColorViewModel.LineColor = source.ColorViewModel.LineColor;
connector.SmoothMargin = 20; connector.SmoothMargin = 20;
connector.SmoothAutoSlope = 0.2; connector.SmoothAutoSlope = 0.2;
@@ -131,10 +141,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.RightConnector ?? mindNode.FirstConnector); connector?.SetSourcePort(mindNode.RightConnector ?? mindNode.FirstConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }

View File

@@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers
{ {
switch (mindNode.NodeLevel) switch (mindNode.NodeLevel)
{ {
case NodeLevel.Level1: case 0:
{ {
mindNode.ItemWidth = 110; mindNode.ItemWidth = 110;
mindNode.ItemHeight = 40; mindNode.ItemHeight = 40;
@@ -39,7 +39,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ConnectorOrientation = ConnectorOrientation.None; mindNode.ConnectorOrientation = ConnectorOrientation.None;
break; break;
} }
case NodeLevel.Level2: case 1:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; mindNode.ItemHeight = 25;
@@ -56,7 +56,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall; mindNode.ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall;
break; break;
} }
case NodeLevel.Level3: default:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; 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.ColorViewModel.LineColor = source.ColorViewModel.LineColor;
connector.SmoothMargin = 20; connector.SmoothMargin = 20;
connector.SmoothAutoSlope = 0.2; connector.SmoothAutoSlope = 0.2;
@@ -108,7 +118,7 @@ namespace AIStudio.Wpf.Mind.Helpers
var sizewithSpacing = mindNode.SizeWithSpacing; var sizewithSpacing = mindNode.SizeWithSpacing;
if (mindNode.Children?.Count > 0) 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(); var rights = mindNode.Children.Where((p, index) => index % 2 == 0).ToList();
rights.ForEach(p => p.ConnectorOrientation = ConnectorOrientation.Left); rights.ForEach(p => p.ConnectorOrientation = ConnectorOrientation.Left);
@@ -132,7 +142,7 @@ namespace AIStudio.Wpf.Mind.Helpers
public void ArrangeOverride(MindNode mindNode) public void ArrangeOverride(MindNode mindNode)
{ {
if (mindNode.NodeLevel == NodeLevel.Level1) if (mindNode.NodeLevel == 0)
{ {
if (mindNode.Children?.Count > 0) if (mindNode.Children?.Count > 0)
{ {
@@ -148,10 +158,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.FirstConnector); connector?.SetSourcePort(mindNode.FirstConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
var lefts = mindNode.Children.Where(p => p.ConnectorOrientation == ConnectorOrientation.Right).ToList(); var lefts = mindNode.Children.Where(p => p.ConnectorOrientation == ConnectorOrientation.Right).ToList();
@@ -166,10 +176,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.FirstConnector); connector?.SetSourcePort(mindNode.FirstConnector);
connect?.SetSinkPort(child.RightConnector); connector?.SetSinkPort(child.RightConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }
@@ -190,10 +200,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.RightConnector); connector?.SetSourcePort(mindNode.RightConnector);
connect?.SetSinkPort(child.LeftConnector); connector?.SetSinkPort(child.LeftConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }
@@ -212,10 +222,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.LeftConnector); connector?.SetSourcePort(mindNode.LeftConnector);
connect?.SetSinkPort(child.RightConnector); connector?.SetSinkPort(child.RightConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }
} }

View File

@@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Mind.Helpers
{ {
switch (mindNode.NodeLevel) switch (mindNode.NodeLevel)
{ {
case NodeLevel.Level1: case 0:
{ {
mindNode.ItemWidth = 110; mindNode.ItemWidth = 110;
mindNode.ItemHeight = 40; mindNode.ItemHeight = 40;
@@ -38,7 +38,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ConnectorOrientation = ConnectorOrientation.None; mindNode.ConnectorOrientation = ConnectorOrientation.None;
break; break;
} }
case NodeLevel.Level2: case 1:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; mindNode.ItemHeight = 25;
@@ -56,7 +56,7 @@ namespace AIStudio.Wpf.Mind.Helpers
mindNode.ConnectorOrientation = ConnectorOrientation.Top; mindNode.ConnectorOrientation = ConnectorOrientation.Top;
break; break;
} }
case NodeLevel.Level3: default:
{ {
mindNode.ItemWidth = 80; mindNode.ItemWidth = 80;
mindNode.ItemHeight = 25; 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.ColorViewModel.LineColor = source.ColorViewModel.LineColor;
connector.SmoothMargin = 20; connector.SmoothMargin = 20;
connector.SmoothAutoSlope = 0.2; connector.SmoothAutoSlope = 0.2;
@@ -133,10 +143,10 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child); ArrangeOverride(child);
var connect = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child); var connector = mindNode.Root?.Items.OfType<ConnectionViewModel>().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connect?.SetSourcePort(mindNode.BottomConnector); connector?.SetSourcePort(mindNode.BottomConnector);
connect?.SetSinkPort(child.TopConnector); connector?.SetSinkPort(child.TopConnector);
connect?.SetVisible(child.Visible); connector?.SetVisible(child.Visible);
} }
} }

View File

@@ -14,26 +14,11 @@ namespace AIStudio.Wpf.Mind.Models
} }
public MindNodeDesignerItem(MindNode item) : base(item) public MindNodeDesignerItem(MindNode item) : base(item)
{ {
NodeLevel = item.NodeLevel;
MindType = item.MindType;
Spacing = item.Spacing; Spacing = item.Spacing;
Offset = item.Offset; Offset = item.Offset;
IsExpanded = item.IsExpanded; IsExpanded = item.IsExpanded;
} }
[XmlAttribute]
public NodeLevel NodeLevel
{
get; set;
}
[XmlAttribute]
public MindType MindType
{
get; set;
}
[XmlIgnore] [XmlIgnore]
public Size Spacing public Size Spacing
{ {

View File

@@ -1,4 +1,5 @@
using System.Windows; using System.Windows;
using AIStudio.Wpf.DiagramDesigner;
using AIStudio.Wpf.DiagramModels; using AIStudio.Wpf.DiagramModels;
using AIStudio.Wpf.DiagramModels.ViewModels; using AIStudio.Wpf.DiagramModels.ViewModels;
using AIStudio.Wpf.Mind; using AIStudio.Wpf.Mind;
@@ -9,16 +10,6 @@ namespace AIStudio.Wpf.Flowchart.Models
public class MindNodeModel : DiagramNode public class MindNodeModel : DiagramNode
{ {
public NodeLevel NodeLevel
{
get; set;
}
public MindType MindType
{
get; set;
}
public Size Spacing public Size Spacing
{ {
get; set; get; set;
@@ -35,9 +26,9 @@ namespace AIStudio.Wpf.Flowchart.Models
get; set; 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.Spacing = Spacing;
mindNode.Offset = Offset; mindNode.Offset = Offset;

View File

@@ -11,7 +11,12 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
MindType MindType MindType MindType
{ {
get;set; get; set;
}
MindNode RootItem
{
get;
} }
SimpleCommand AddParentCommand SimpleCommand AddParentCommand

View File

@@ -23,9 +23,21 @@ namespace AIStudio.Wpf.Mind.ViewModels
} }
} }
} }
public MindNode RootItem
{
get
{
return Items.OfType<MindNode>().FirstOrDefault();
}
}
#endregion #endregion
#region #region
public SimpleCommand AddRootCommand
{
get; private set;
}
public SimpleCommand AddParentCommand public SimpleCommand AddParentCommand
{ {
@@ -115,6 +127,11 @@ namespace AIStudio.Wpf.Mind.ViewModels
DeleteSelfCommand = new SimpleCommand(MindLevelEnable, ExecuteDeleteSelfCommand); DeleteSelfCommand = new SimpleCommand(MindLevelEnable, ExecuteDeleteSelfCommand);
MoveForwardCommand = new SimpleCommand(MindExecuteEnable, ExecuteMoveForwardCommand); MoveForwardCommand = new SimpleCommand(MindExecuteEnable, ExecuteMoveForwardCommand);
MoveBackCommand = new SimpleCommand(MindExecuteEnable, ExecuteMoveBackCommand); 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) public bool MindExecuteEnable(object para)
@@ -130,7 +147,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
if (MindExecuteEnable(obj) == false) return false; if (MindExecuteEnable(obj) == false) return false;
return (SelectedItem as MindNode).NodeLevel != NodeLevel.Level1; return (SelectedItem as MindNode).NodeLevel != 0;
} }
#region #region
@@ -138,9 +155,9 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
if (obj is MindType mindType) if (obj is MindType mindType)
{ {
Items.OfType<MindNode>().ToList().ForEach(item => { item.MindType = mindType; }); Items.OfType<MindNode>().ToList().ForEach(item => { item.InitLayout(true); });
Items.OfType<MindNode>().ToList().ForEach(item => { item.InitConnectLayout(); });
Items.OfType<MindNode>().FirstOrDefault()?.LayoutUpdated(); RootItem?.LayoutUpdated();
} }
} }
@@ -163,7 +180,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
if (items?.Count == 0) 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); items.Add(node);
} }
@@ -203,7 +220,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
} }
if (items?.Count == 0) 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) if (node.Parent is MindNode parent)
@@ -249,7 +266,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
if (items?.Count == 0) if (items?.Count == 0)
{ {
var node = new MindNode(this, pear.NodeLevel, this.MindType) { Text = "分支主题" }; var node = new MindNode(this) { Text = "分支主题" };
items.Add(node); items.Add(node);
} }

View File

@@ -25,16 +25,13 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
public class MindNode : DiagramItemViewModel 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) public MindNode(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
@@ -67,7 +64,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
BuildMenuOptions(); 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"); 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(); MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout();
@@ -76,6 +73,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
MindLayout.Appearance(this); MindLayout.Appearance(this);
} }
this.PropertyChanged -= this.Item_PropertyChanged;
this.PropertyChanged += this.Item_PropertyChanged; this.PropertyChanged += this.Item_PropertyChanged;
} }
@@ -85,8 +83,6 @@ namespace AIStudio.Wpf.Mind.ViewModels
if (designerbase is MindNodeDesignerItem designer) if (designerbase is MindNodeDesignerItem designer)
{ {
NodeLevel = designer.NodeLevel;
MindType = designer.MindType;
Spacing = designer.Spacing; Spacing = designer.Spacing;
Offset = designer.Offset; Offset = designer.Offset;
IsExpanded = designer.IsExpanded; IsExpanded = designer.IsExpanded;
@@ -97,8 +93,6 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
var mindNodeModel = new MindNodeModel(); var mindNodeModel = new MindNodeModel();
mindNodeModel.NodeLevel = NodeLevel;
mindNodeModel.MindType = MindType;
mindNodeModel.Spacing = Spacing; mindNodeModel.Spacing = Spacing;
mindNodeModel.Offset = Offset; mindNodeModel.Offset = Offset;
mindNodeModel.IsExpanded = IsExpanded; mindNodeModel.IsExpanded = IsExpanded;
@@ -111,7 +105,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
if (Command_Enable(obj) == false) return false; if (Command_Enable(obj) == false) return false;
return NodeLevel != NodeLevel.Level1; return NodeLevel != 0;
} }
#region #region
@@ -119,53 +113,36 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
get; set; get; set;
} }
[Browsable(false)]
private NodeLevel _nodeLevel; public MindNode ParentNode
public NodeLevel NodeLevel
{ {
get 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 public MindType MindType
{ {
get get
{ {
return _mindType; return (Root as IMindDiagramViewModel)?.MindType ?? MindType.Mind;
}
set
{
SetProperty(ref _mindType, value);
} }
} }
@@ -395,14 +372,6 @@ namespace AIStudio.Wpf.Mind.ViewModels
#region #region
public void AddChild(MindNode item, int index = -1) 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) if (index >= 0)
{ {
this.Children.Insert(index, item); this.Children.Insert(index, item);
@@ -412,7 +381,9 @@ namespace AIStudio.Wpf.Mind.ViewModels
this.Children.Add(item); this.Children.Add(item);
} }
item.Parent = this; 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 }); Root?.DirectAddItemCommand.Execute(new SelectableDesignerItemViewModelBase[] { item, connector });
connector.ZIndex = -1; connector.ZIndex = -1;
this.IsSelected = true; this.IsSelected = true;
@@ -440,6 +411,15 @@ namespace AIStudio.Wpf.Mind.ViewModels
} }
} }
} }
public void InitConnectLayout()
{
var connector = Root?.Items.OfType<ConnectionViewModel>().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 #endregion
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
@@ -458,14 +438,11 @@ namespace AIStudio.Wpf.Mind.ViewModels
case nameof(NodeLevel): case nameof(NodeLevel):
MindLayout?.Appearance(this); MindLayout?.Appearance(this);
break; break;
case nameof(MindType):
InitLayout(true);
break;
case nameof(Left): case nameof(Left):
{ {
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{ {
if (NodeLevel == NodeLevel.Level1) if (NodeLevel == 0)
{ {
LayoutUpdated(); LayoutUpdated();
} }
@@ -481,7 +458,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
{ {
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{ {
if (NodeLevel == NodeLevel.Level1) if (NodeLevel == 0)
{ {
LayoutUpdated(); LayoutUpdated();
} }
@@ -516,7 +493,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
public MindNode GetLevel2Node() public MindNode GetLevel2Node()
{ {
var node = this; var node = this;
while (node.Parent is MindNode mindNode && mindNode.NodeLevel == NodeLevel.Level2) while (node.Parent is MindNode mindNode && mindNode.NodeLevel == 1)
{ {
node = mindNode; node = mindNode;
} }