diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/DiagramsViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/DiagramsViewModel.cs index 705fd32..8f77870 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/DiagramsViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/DiagramsViewModel.cs @@ -268,11 +268,11 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName); DesignerItemViewModelBase sourceItem = GetConnectorDataItem(viewModel, connectionItem.SourceId, connectionItem.SourceType); ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation; - FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint); + FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint, connectionItem.SourceInnerPoint); DesignerItemViewModelBase sinkItem = GetConnectorDataItem(viewModel, connectionItem.SinkId, connectionItem.SinkType); ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation; - FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint); + FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint, connectionItem.SinkInnerPoint); ConnectionViewModel connectionVM = new ConnectionViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connectionItem); viewModel.Items.Add(connectionVM); @@ -354,25 +354,36 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels return dataItem; } - private FullyCreatedConnectorInfo GetFullConnectorInfo(Guid connectorId, DesignerItemViewModelBase dataItem, ConnectorOrientation connectorOrientation, double xRatio, double yRatio, bool isInnerPoint) + private FullyCreatedConnectorInfo GetFullConnectorInfo(Guid connectorId, DesignerItemViewModelBase dataItem, ConnectorOrientation connectorOrientation, double xRatio, double yRatio, bool isInnerPoint,bool isPortless) { if (isInnerPoint) { return dataItem.Connectors.Where(p => p.XRatio == xRatio && p.YRatio == yRatio).FirstOrDefault(); } + else if(isPortless) + { + return dataItem.PortlessConnector; + } else { switch (connectorOrientation) { - case ConnectorOrientation.Top: - return dataItem.TopConnector; case ConnectorOrientation.Left: return dataItem.LeftConnector; + case ConnectorOrientation.TopLeft: + return dataItem.TopLeftConnector; + case ConnectorOrientation.Top: + return dataItem.TopConnector; + case ConnectorOrientation.TopRight: + return dataItem.TopRightConnector; case ConnectorOrientation.Right: return dataItem.RightConnector; + case ConnectorOrientation.BottomRight: + return dataItem.BottomRightConnector; case ConnectorOrientation.Bottom: return dataItem.BottomConnector; - + case ConnectorOrientation.BottomLeft: + return dataItem.BottomLeftConnector; default: throw new InvalidOperationException( string.Format("Found invalid persisted Connector Orientation for Connector Id: {0}", connectorId)); @@ -539,11 +550,11 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName); DesignerItemViewModelBase sourceItem = GetConnectorDataItem(viewModel, connectionItem.SourceId, connectionItem.SourceType); ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation; - FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint); + FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint, connectionItem.SourceIsPortless); DesignerItemViewModelBase sinkItem = GetConnectorDataItem(viewModel, connectionItem.SinkId, connectionItem.SinkType); ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation; - FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint); + FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint, connectionItem.SinkIsPortless); ConnectionViewModel connectionVM = new ConnectionViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connectionItem); viewModel.Items.Add(connectionVM); diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PortlessLinksViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PortlessLinksViewModel.cs index 21ef33e..f2d1daa 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PortlessLinksViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PortlessLinksViewModel.cs @@ -34,7 +34,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, node1.PortlessConnector, node2.PortlessConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); DiagramViewModel.DirectAddItemCommand.Execute(connector1); - ConnectionViewModel connector2 = new ConnectionViewModel(DiagramViewModel, node2.PortlessConnector, node3.RightConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + ConnectionViewModel connector2 = new ConnectionViewModel(DiagramViewModel, node2.PortlessConnector, node3.TopConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); DiagramViewModel.DirectAddItemCommand.Execute(connector2); ConnectionViewModel connector3 = new ConnectionViewModel(DiagramViewModel, node3.LeftConnector, node4.PortlessConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs index 619377e..b39b067 100644 --- a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs @@ -32,6 +32,7 @@ namespace AIStudio.Wpf.DiagramDesigner this.SourceXRatio = viewmodel.SourceConnectorInfo.GetXRatioFromConnector(); this.SourceYRatio = viewmodel.SourceConnectorInfo.GetYRatioFromConnector(); this.SourceInnerPoint = viewmodel.SourceConnectorInfo.IsInnerPoint; + this.SourceIsPortless = viewmodel.SourceConnectorInfo.IsPortless; this.SinkId = viewmodel.SinkConnectorInfoFully.DataItem.Id; this.SinkOrientation = viewmodel.SinkConnectorInfoFully.Orientation; @@ -40,6 +41,8 @@ namespace AIStudio.Wpf.DiagramDesigner this.SinkXRatio = viewmodel.SinkConnectorInfoFully.GetXRatioFromConnector(); this.SinkYRatio = viewmodel.SinkConnectorInfoFully.GetYRatioFromConnector(); this.SinkInnerPoint = viewmodel.SinkConnectorInfoFully.IsInnerPoint; + this.SinkIsPortless = viewmodel.SourceConnectorInfo.IsPortless; + this.RouterMode = viewmodel.RouterMode; this.PathMode = viewmodel.PathMode; this.Vertices = viewmodel.Vertices.Select(p => new ConnectorVertexItem(p)).ToList(); @@ -68,6 +71,12 @@ namespace AIStudio.Wpf.DiagramDesigner [XmlAttribute] public bool SourceInnerPoint { get; set; } + [XmlAttribute] + public bool SourceIsPortless + { + get; set; + } + [XmlAttribute] public Guid SinkId { get; set; } @@ -89,6 +98,12 @@ namespace AIStudio.Wpf.DiagramDesigner [XmlAttribute] public bool SinkInnerPoint { get; set; } + [XmlAttribute] + public bool SinkIsPortless + { + get; set; + } + [XmlAttribute] public string RouterMode { diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/Connector/FullyCreatedConnectorInfoItem.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/Connector/FullyCreatedConnectorInfoItem.cs index 8912471..9420190 100644 --- a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/Connector/FullyCreatedConnectorInfoItem.cs +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/Connector/FullyCreatedConnectorInfoItem.cs @@ -27,23 +27,41 @@ namespace AIStudio.Wpf.DiagramDesigner XRatio = viewmodel.XRatio; YRatio = viewmodel.YRatio; IsInnerPoint = viewmodel.IsInnerPoint; + IsPortless = viewmodel.IsPortless; ValueTypePoint = viewmodel.ValueTypePoint; } [XmlAttribute] - public double XRatio { get; set; } + public double XRatio + { + get; set; + } [XmlAttribute] - public double YRatio { get; set; } - + public double YRatio + { + get; set; + } [XmlAttribute] - public bool IsInnerPoint { get; set; } + public bool IsInnerPoint + { + get; set; + } [XmlAttribute] - public ValueTypePoint ValueTypePoint { get; set; } + public bool IsPortless + { + get; set; + } + + [XmlAttribute] + public ValueTypePoint ValueTypePoint + { + get; set; + } + - } } diff --git a/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Utils.cs b/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Utils.cs index f97b80e..8f6b1db 100644 --- a/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Utils.cs +++ b/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Utils.cs @@ -10,6 +10,10 @@ namespace AIStudio.Wpf.DiagramDesigner var pt = port.Position; switch (port.Orientation) { + case ConnectorOrientation.Left: + return new PointBase(pt.X, pt.Y + port.ConnectorHeight / 2); + case ConnectorOrientation.TopLeft: + return new PointBase(pt.X, pt.Y); case ConnectorOrientation.Top: return new PointBase(pt.X + port.ConnectorWidth / 2, pt.Y); case ConnectorOrientation.TopRight: @@ -21,9 +25,7 @@ namespace AIStudio.Wpf.DiagramDesigner case ConnectorOrientation.Bottom: return new PointBase(pt.X + port.ConnectorWidth / 2, pt.Y + port.ConnectorHeight); case ConnectorOrientation.BottomLeft: - return new PointBase(pt.X, pt.Y + port.ConnectorHeight); - case ConnectorOrientation.Left: - return new PointBase(pt.X, pt.Y + port.ConnectorHeight / 2); + return new PointBase(pt.X, pt.Y + port.ConnectorHeight); default: return pt; } diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml index 528864d..022ed33 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml @@ -550,7 +550,7 @@ - diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs index 560ff27..d2f934f 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs @@ -10,16 +10,17 @@ namespace AIStudio.Wpf.DiagramDesigner { public class FullyCreatedConnectorInfo : ConnectorInfoBase { - public FullyCreatedConnectorInfo(DesignerItemViewModelBase dataItem, ConnectorOrientation orientation, bool isInnerPoint = false, ValueTypePoint valueTypePoint = 0) - : this(null, dataItem, orientation, isInnerPoint, valueTypePoint) + public FullyCreatedConnectorInfo(DesignerItemViewModelBase dataItem, ConnectorOrientation orientation, bool isInnerPoint = false, bool isPortless = false, ValueTypePoint valueTypePoint = 0) + : this(null, dataItem, orientation, isInnerPoint, isPortless, valueTypePoint) { } - public FullyCreatedConnectorInfo(IDiagramViewModel root, DesignerItemViewModelBase dataItem, ConnectorOrientation orientation, bool isInnerPoint = false, ValueTypePoint valueTypePoint = 0) + public FullyCreatedConnectorInfo(IDiagramViewModel root, DesignerItemViewModelBase dataItem, ConnectorOrientation orientation, bool isInnerPoint = false, bool isPortless = false, ValueTypePoint valueTypePoint = 0) : base(root, orientation) { this.Parent = dataItem; this.IsInnerPoint = isInnerPoint; + this.IsPortless = IsPortless; this.ValueTypePoint = valueTypePoint; if (IsInnerPoint == true) { @@ -69,6 +70,7 @@ namespace AIStudio.Wpf.DiagramDesigner XRatio = designer.XRatio; YRatio = designer.YRatio; IsInnerPoint = designer.IsInnerPoint; + IsPortless = designer.IsPortless; ValueTypePoint = designer.ValueTypePoint; } } @@ -231,18 +233,30 @@ namespace AIStudio.Wpf.DiagramDesigner { return XRatio; } + else if (IsPortless) + { + return 0.5; + } else { switch (Orientation) { - case ConnectorOrientation.Top: - return 0.5; case ConnectorOrientation.Left: return 0; - case ConnectorOrientation.Bottom: + case ConnectorOrientation.TopLeft: + return 0; + case ConnectorOrientation.Top: return 0.5; + case ConnectorOrientation.TopRight: + return 1; case ConnectorOrientation.Right: return 1; + case ConnectorOrientation.BottomRight: + return 1; + case ConnectorOrientation.Bottom: + return 0.5; + case ConnectorOrientation.BottomLeft: + return 0; default: return XRatio; } } @@ -254,18 +268,30 @@ namespace AIStudio.Wpf.DiagramDesigner { return YRatio; } + else if (IsPortless) + { + return 0.5; + } else { switch (Orientation) { - case ConnectorOrientation.Top: - return 0; case ConnectorOrientation.Left: return 0.5; - case ConnectorOrientation.Bottom: - return 1; + case ConnectorOrientation.TopLeft: + return 0; + case ConnectorOrientation.Top: + return 0; + case ConnectorOrientation.TopRight: + return 0; case ConnectorOrientation.Right: return 0.5; + case ConnectorOrientation.BottomRight: + return 1; + case ConnectorOrientation.Bottom: + return 1; + case ConnectorOrientation.BottomLeft: + return 1; default: return YRatio; } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index 12bdf82..6b5c39c 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -1479,11 +1479,11 @@ namespace AIStudio.Wpf.DiagramDesigner connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName); DesignerItemViewModelBase sourceItem = GetConnectorDataItem(this, connectionItem.SourceId, connectionItem.SourceType); ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation; - FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint); + FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint, connectionItem.SourceIsPortless); DesignerItemViewModelBase sinkItem = GetConnectorDataItem(this, connectionItem.SinkId, connectionItem.SinkType); ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation; - FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint); + FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint, connectionItem.SinkIsPortless); ConnectionViewModel connectionVM = new ConnectionViewModel(this, sourceConnectorInfo, sinkConnectorInfo, connectionItem); connectors.Add(connectionVM); @@ -1514,24 +1514,36 @@ namespace AIStudio.Wpf.DiagramDesigner return dataItem; } - private FullyCreatedConnectorInfo GetFullConnectorInfo(Guid connectorId, DesignerItemViewModelBase dataItem, ConnectorOrientation connectorOrientation, double xRatio, double yRatio, bool isInnerPoint) + private FullyCreatedConnectorInfo GetFullConnectorInfo(Guid connectorId, DesignerItemViewModelBase dataItem, ConnectorOrientation connectorOrientation, double xRatio, double yRatio, bool isInnerPoint, bool isPortless) { if (isInnerPoint) { return dataItem.Connectors.Where(p => p.XRatio == xRatio && p.YRatio == yRatio).FirstOrDefault(); } + else if (isPortless) + { + return dataItem.PortlessConnector; + } else { switch (connectorOrientation) { - case ConnectorOrientation.Top: - return dataItem.TopConnector; case ConnectorOrientation.Left: return dataItem.LeftConnector; + case ConnectorOrientation.TopLeft: + return dataItem.TopLeftConnector; + case ConnectorOrientation.Top: + return dataItem.TopConnector; + case ConnectorOrientation.TopRight: + return dataItem.TopRightConnector; case ConnectorOrientation.Right: return dataItem.RightConnector; + case ConnectorOrientation.BottomRight: + return dataItem.BottomRightConnector; case ConnectorOrientation.Bottom: return dataItem.BottomConnector; + case ConnectorOrientation.BottomLeft: + return dataItem.BottomLeftConnector; default: throw new InvalidOperationException( diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LogicalGateItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LogicalGateItemViewModelBase.cs index 547d333..19c45d4 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LogicalGateItemViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LogicalGateItemViewModelBase.cs @@ -222,7 +222,7 @@ namespace AIStudio.Wpf.DiagramDesigner { this.ItemHeight = this.ItemHeight * (Input.Values.Count + 1) / Input.Values.Count; } - FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Left, true, ValueTypeInput.Count > index ? ValueTypeInput[index] : ValueTypeInput[0]); + FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Left, true, false, ValueTypeInput.Count > index ? ValueTypeInput[index] : ValueTypeInput[0]); connector.XRatio = 0; Input.Add(Input.Count, connector); for (int i = 0; i < Input.Values.Count; i++) @@ -234,7 +234,7 @@ namespace AIStudio.Wpf.DiagramDesigner public virtual void ExecuteAddOutput(object parameter, int index = 0) { - FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Right, true, ValueTypeOutput.Count > index ? ValueTypeOutput[index] : ValueTypeInput[0]); + FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Right, true, false, ValueTypeOutput.Count > index ? ValueTypeOutput[index] : ValueTypeInput[0]); connector.XRatio = 1; Output.Add(Output.Count, connector); for (int i = 0; i < Output.Values.Count; i++)