整理序列化

This commit is contained in:
艾竹
2023-01-24 16:20:39 +08:00
parent f39a57b3e5
commit 8dbe05636d
55 changed files with 588 additions and 464 deletions

View File

@@ -373,10 +373,10 @@ namespace AIStudio.Wpf.DiagramDesigner
Connector sinkConnector = connectorsHit.Last();
FullyCreatedConnectorInfo sinkDataItem = sinkConnector.DataContext as FullyCreatedConnectorInfo;
int indexOfLastTempConnection = sinkDataItem.DataItem.Parent.Items.Count - 1;
sinkDataItem.DataItem.Parent.DirectRemoveItemCommand.Execute(
sinkDataItem.DataItem.Parent.Items[indexOfLastTempConnection]);
sinkDataItem.DataItem.Parent.AddItemCommand.Execute(new ConnectorViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode));
int indexOfLastTempConnection = sinkDataItem.DataItem.Root.Items.Count - 1;
sinkDataItem.DataItem.Root.DirectRemoveItemCommand.Execute(
sinkDataItem.DataItem.Root.Items[indexOfLastTempConnection]);
sinkDataItem.DataItem.Root.AddItemCommand.Execute(new ConnectorViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode));
}
else if (_service.DrawModeViewModel.GetDrawMode() == DrawMode.DirectLine && connectorsHit.Count() == 1)
{
@@ -396,9 +396,9 @@ namespace AIStudio.Wpf.DiagramDesigner
else
{
//Need to remove last item as we did not finish drawing the path
int indexOfLastTempConnection = sourceDataItem.DataItem.Parent.Items.Count - 1;
sourceDataItem.DataItem.Parent.DirectRemoveItemCommand.Execute(
sourceDataItem.DataItem.Parent.Items[indexOfLastTempConnection]);
int indexOfLastTempConnection = sourceDataItem.DataItem.Root.Items.Count - 1;
sourceDataItem.DataItem.Root.DirectRemoveItemCommand.Execute(
sourceDataItem.DataItem.Root.Items[indexOfLastTempConnection]);
}

View File

@@ -27,7 +27,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
if (designerItem != null && designerItem.IsSelected)
{
// we only move DesignerItems
designerItems = designerItem.Parent.SelectedItems.ToList();
designerItems = designerItem.Root.SelectedItems.ToList();
if (designerItem is ConnectorViewModel connector)
{
designerItems.Add(connector.SourceConnectorInfo.DataItem);

View File

@@ -31,7 +31,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
void DragThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
if (this.DataContext is ConnectorPoint point)
if (this.DataContext is ConnectorPointModel point)
{
point.X += e.HorizontalChange;
point.Y += e.VerticalChange;

View File

@@ -23,10 +23,10 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
private void ResizeThumb_DragStarted(object sender, DragStartedEventArgs e)
{
DesignerItemViewModelBase designerItem = this.DataContext as DesignerItemViewModelBase;
diagarmViewModel = designerItem.Parent;
diagarmViewModel = designerItem.Root;
if (designerItem != null && designerItem.IsSelected)
{
designerItems = designerItem.Parent.SelectedItems.ToList();
designerItems = designerItem.Root.SelectedItems.ToList();
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
{
item.BeginDo = true;

View File

@@ -32,7 +32,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
if (this.designerItem != null)
{
designerItems = designerItem.Parent.SelectedItems.ToList();
designerItems = designerItem.Root.SelectedItems.ToList();
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
{

View File

@@ -29,7 +29,7 @@ namespace AIStudio.Wpf.DiagramDesigner
PathGeometry pathGeometry = new PathGeometry();
if (values[0] != null)
{
List<ConnectorPoint> points = (List<ConnectorPoint>)values[0];
List<ConnectorPointModel> points = (List<ConnectorPointModel>)values[0];
PathFigure figure = new PathFigure();
figure.StartPoint = (PointBase)points[0];

View File

@@ -11,9 +11,12 @@ using System.Xml.Serialization;
namespace AIStudio.Wpf.DiagramDesigner
{
/// <summary>
/// 连接线
/// </summary>
[Serializable]
[XmlInclude(typeof(ConnectionItem))]
public class ConnectionItem : SelectableDesignerItemBase
public class ConnectionItem : SelectableItemBase
{
public ConnectionItem()
{
@@ -39,7 +42,8 @@ namespace AIStudio.Wpf.DiagramDesigner
this.SinkInnerPoint = viewmodel.SinkConnectorInfoFully.IsInnerPoint;
this.RouterMode = viewmodel.RouterMode;
this.PathMode = viewmodel.PathMode;
this.Vertices = viewmodel.Vertices.Select(p => (Point)p.MiddlePosition).ToList();
this.Vertices = viewmodel.Vertices.Select(p => new ConnectorVertexItem(p)).ToList();
this.Labels = viewmodel.Labels.Select(p => new ConnectorLabelItem(p)).ToList();
}
@@ -97,28 +101,14 @@ namespace AIStudio.Wpf.DiagramDesigner
get; set;
}
[XmlIgnore]
public List<Point> Vertices
[XmlArray]
public List<ConnectorVertexItem> Vertices
{
get; set;
}
[JsonIgnore]
[XmlAttribute("Vertices")]
public string XmlVertices
{
get
{
return SerializeHelper.SerializePointList(Vertices);
}
set
{
Vertices = SerializeHelper.DeserializePointList(value);
}
}
[XmlArray]
public List<ConnectorLabelItem> Connectors
public List<ConnectorLabelItem> Labels
{
get; set;
}

View File

@@ -4,20 +4,57 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace AIStudio.Wpf.DiagramDesigner
{
public class ConnectorItem
/// <summary>
/// 连接点
/// </summary>
[Serializable]
[XmlInclude(typeof(ConnectorItem))]
public class ConnectorItem : SelectableItemBase
{
public Guid ParentId { get; set; }
public Guid Id { get; set; }
public ConnectorItem()
{
}
public ConnectorItem(FullyCreatedConnectorInfo viewmodel) : base(viewmodel)
{
XRatio = viewmodel.XRatio;
YRatio = viewmodel.YRatio;
ConnectorWidth = viewmodel.ConnectorWidth;
ConnectorHeight = viewmodel.ConnectorHeight;
Orientation = viewmodel.Orientation;
IsInnerPoint = viewmodel.IsInnerPoint;
ValueTypePoint = viewmodel.ValueTypePoint;
ConnectorValue = viewmodel.ConnectorValue;
}
[XmlAttribute]
public double XRatio { get; set; }
[XmlAttribute]
public double YRatio { get; set; }
[XmlAttribute]
public double ConnectorWidth { get; set; }
[XmlAttribute]
public double ConnectorHeight { get; set; }
[XmlAttribute]
public ConnectorOrientation Orientation { get; set; }
[XmlAttribute]
public bool IsInnerPoint { get; set; }
[XmlAttribute]
public ValueTypePoint ValueTypePoint { get; set; }
[XmlAttribute]
public double ConnectorValue { get; set; }
}
}

View File

@@ -1,11 +1,54 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Xml.Serialization;
using Newtonsoft.Json;
namespace AIStudio.Wpf.DiagramDesigner
{
public class ConnectorLabelItem
/// <summary>
/// 连接点文字
/// </summary>
[Serializable]
[XmlInclude(typeof(ConnectorLabelItem))]
public class ConnectorLabelItem : ConnectorPointItem
{
public ConnectorLabelItem()
{
}
public ConnectorLabelItem(ConnectorLabelModel viewmodel) : base(viewmodel)
{
Distance = viewmodel.Distance;
Offset = viewmodel.Offset;
}
[XmlAttribute]
public double? Distance
{
get; set;
}
[XmlIgnore]
public Point Offset
{
get; set;
}
[JsonIgnore]
[XmlAttribute("Offset")]
public string XmlOffset
{
get
{
return SerializeHelper.SerializePoint(Offset);
}
set
{
Offset = SerializeHelper.DeserializePoint(value);
}
}
}
}

View File

@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
namespace AIStudio.Wpf.DiagramDesigner
{
/// <summary>
/// 连接中间点
/// </summary>
[Serializable]
[XmlInclude(typeof(ConnectorPointItem))]
public class ConnectorPointItem : SelectableItemBase
{
public ConnectorPointItem()
{
}
public ConnectorPointItem(ConnectorPointModel viewmodel) : base(viewmodel)
{
X = viewmodel.X;
Y = viewmodel.Y;
ConnectorWidth = viewmodel.ConnectorWidth;
ConnectorHeight = viewmodel.ConnectorHeight;
}
[XmlAttribute]
public double X
{
get;set;
}
[XmlAttribute]
public double Y
{
get; set;
}
[XmlAttribute]
public double ConnectorWidth
{
get; set;
}
[XmlAttribute]
public double ConnectorHeight
{
get; set;
}
}
}

View File

@@ -1,10 +1,25 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
namespace AIStudio.Wpf.DiagramDesigner
{
class ConnectorVertexItem
/// <summary>
/// 连接线。中间点
/// </summary>
[Serializable]
[XmlInclude(typeof(ConnectorVertexItem))]
public class ConnectorVertexItem : ConnectorPointItem
{
public ConnectorVertexItem()
{
}
public ConnectorVertexItem(ConnectorVertexModel viewmodel) : base(viewmodel)
{
}
}
}

View File

@@ -11,7 +11,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
[Serializable]
[XmlInclude(typeof(DesignerItemBase))]
public class DesignerItemBase : SelectableDesignerItemBase
public class DesignerItemBase : SelectableItemBase
{
public DesignerItemBase()
{

View File

@@ -15,14 +15,7 @@ namespace AIStudio.Wpf.DiagramDesigner
Connectors = new List<ConnectorItem>();
foreach (var fullyCreatedConnectorInfo in item.Connectors)
{
ConnectorItem connector = new ConnectorItem()
{
XRatio = fullyCreatedConnectorInfo.XRatio,
YRatio = fullyCreatedConnectorInfo.YRatio,
ConnectorWidth = fullyCreatedConnectorInfo.ConnectorWidth,
ConnectorHeight = fullyCreatedConnectorInfo.ConnectorHeight,
Orientation = fullyCreatedConnectorInfo.Orientation
};
ConnectorItem connector = new ConnectorItem(fullyCreatedConnectorInfo);
Connectors.Add(connector);
}
}

View File

@@ -18,17 +18,7 @@ namespace AIStudio.Wpf.DiagramDesigner
this.Connectors = new List<ConnectorItem>();
foreach (var fullyCreatedConnectorInfo in item.Connectors)
{
ConnectorItem connector = new ConnectorItem()
{
XRatio = fullyCreatedConnectorInfo.XRatio,
YRatio = fullyCreatedConnectorInfo.YRatio,
ConnectorWidth = fullyCreatedConnectorInfo.ConnectorWidth,
ConnectorHeight = fullyCreatedConnectorInfo.ConnectorHeight,
Orientation = fullyCreatedConnectorInfo.Orientation,
IsInnerPoint = fullyCreatedConnectorInfo.IsInnerPoint,
ValueTypePoint = fullyCreatedConnectorInfo.ValueTypePoint,
ConnectorValue = fullyCreatedConnectorInfo.ConnectorValue
};
ConnectorItem connector = new ConnectorItem(fullyCreatedConnectorInfo);
this.Connectors.Add(connector);
}
this.OrderNumber = item.OrderNumber;

View File

@@ -15,14 +15,7 @@ namespace AIStudio.Wpf.DiagramDesigner
Connectors = new List<ConnectorItem>();
foreach (var fullyCreatedConnectorInfo in item.Connectors)
{
ConnectorItem connector = new ConnectorItem()
{
XRatio = fullyCreatedConnectorInfo.XRatio,
YRatio = fullyCreatedConnectorInfo.YRatio,
ConnectorWidth = fullyCreatedConnectorInfo.ConnectorWidth,
ConnectorHeight = fullyCreatedConnectorInfo.ConnectorHeight,
Orientation = fullyCreatedConnectorInfo.Orientation
};
ConnectorItem connector = new ConnectorItem(fullyCreatedConnectorInfo);
Connectors.Add(connector);
}
}
@@ -32,14 +25,7 @@ namespace AIStudio.Wpf.DiagramDesigner
Connectors = new List<ConnectorItem>();
foreach (var fullyCreatedConnectorInfo in item.Connectors)
{
ConnectorItem connector = new ConnectorItem()
{
XRatio = fullyCreatedConnectorInfo.XRatio,
YRatio = fullyCreatedConnectorInfo.YRatio,
ConnectorWidth = fullyCreatedConnectorInfo.ConnectorWidth,
ConnectorHeight = fullyCreatedConnectorInfo.ConnectorHeight,
Orientation = fullyCreatedConnectorInfo.Orientation
};
ConnectorItem connector = new ConnectorItem(fullyCreatedConnectorInfo);
Connectors.Add(connector);
}
}

View File

@@ -13,27 +13,15 @@ using System.Xml.Serialization;
namespace AIStudio.Wpf.DiagramDesigner
{
public abstract class SelectableDesignerItemBase
public abstract class SelectableItemBase
{
public SelectableDesignerItemBase()
public SelectableItemBase()
{
ColorItem = new ColorItem() { LineColor = new ColorObjectItem(), FillColor = new ColorObjectItem() };
FontItem = new FontItem();
}
//public SelectableDesignerItemBase(Guid id, int zIndex, bool isGroup, Guid parentId, IColorViewModel colorViewModel, IFontViewModel fontViewModel)
//{
// this.Id = id;
// this.ZIndex = zIndex;
// this.IsGroup = isGroup;
// this.ParentId = parentId;
// ColorItem = CopyHelper.Mapper<ColorItem>(colorViewModel);
// FontItem = CopyHelper.Mapper<FontItem, IFontViewModel>(fontViewModel);
//}
public SelectableDesignerItemBase(SelectableDesignerItemViewModelBase viewmodel)
public SelectableItemBase(SelectableViewModelBase viewmodel)
{
this.Id = viewmodel.Id;
this.ZIndex = viewmodel.ZIndex;
@@ -45,6 +33,12 @@ namespace AIStudio.Wpf.DiagramDesigner
FontItem = CopyHelper.Mapper<FontItem, IFontViewModel>(viewmodel.FontViewModel);
}
[XmlAttribute]
public Guid ParentId
{
get; set;
}
[XmlAttribute]
public Guid Id
{
@@ -63,12 +57,6 @@ namespace AIStudio.Wpf.DiagramDesigner
get; set;
}
[XmlAttribute]
public Guid ParentId
{
get; set;
}
[XmlAttribute]
public string Text
{

View File

@@ -8,8 +8,25 @@ using AIStudio.Wpf.DiagramDesigner.Geometrys;
namespace AIStudio.Wpf.DiagramDesigner
{
public abstract class ConnectorInfoBase : BindableBase
public abstract class ConnectorInfoBase : SelectableViewModelBase
{
public ConnectorInfoBase(ConnectorOrientation orientation)
{
this.Orientation = orientation;
}
protected override void Init()
{
base.Init();
ColorViewModel = new ColorViewModel()
{
LineColor = new ColorObject() { Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x80) },
FillColor = new ColorObject() { Color = Colors.Lavender },
};
}
#region
public virtual PointBase Position
{
get;
@@ -21,17 +38,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
return new PointBase(Position.X + ConnectorWidth / 2, Position.Y + ConnectorHeight / 2);
}
}
public ConnectorInfoBase(ConnectorOrientation orientation)
{
this.Orientation = orientation;
ColorViewModel = new ColorViewModel()
{
LineColor = new ColorObject() { Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x80) },
FillColor = new ColorObject() { Color = Colors.Lavender },
};
}
}
private ConnectorOrientation _orientation;
public ConnectorOrientation Orientation
@@ -72,19 +79,6 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
private IColorViewModel _colorViewModel;
public IColorViewModel ColorViewModel
{
get
{
return _colorViewModel;
}
set
{
SetProperty(ref _colorViewModel, value);
}
}
public double _connectorValue;
public double ConnectorValue
{
@@ -97,5 +91,6 @@ namespace AIStudio.Wpf.DiagramDesigner
SetProperty(ref _connectorValue, value);
}
}
#endregion
}
}

View File

@@ -4,43 +4,29 @@ using SvgPathProperties;
namespace AIStudio.Wpf.DiagramDesigner
{
public class ConnectorLabelModel : ConnectorPoint, ISelectable
public class ConnectorLabelModel : ConnectorPointModel, ISelectable
{
public ConnectorLabelModel(ConnectorViewModel parent, string content, double? distance = null, PointBase? offset = null)
public ConnectorLabelModel(ConnectorViewModel connector, string content, double? distance = null, PointBase? offset = null)
{
Parent = parent;
Parent = connector;
Text = content;
Distance = distance;
Offset = offset ?? new PointBase();
FontViewModel = Parent.FontViewModel;
ColorViewModel = Parent.ColorViewModel;
Offset = offset ?? new PointBase();
}
protected override void Init()
{
base.Init();
DeleteLabelCommand = new SimpleCommand(DeleteLabel);
}
public ConnectorViewModel Parent
{
get;
}
public bool IsHitTestVisible
#region
public ConnectorViewModel Connector
{
get
{
return Parent.IsHitTestVisible;
}
}
private string _text;
public string Text
{
get
{
return _text;
}
set
{
SetProperty(ref _text, value);
return Parent as ConnectorViewModel;
}
}
@@ -59,8 +45,8 @@ namespace AIStudio.Wpf.DiagramDesigner
get; set;
}
private bool _isSelected;
public bool IsSelected
//private bool _isSelected;
public override bool IsSelected
{
get
{
@@ -73,7 +59,7 @@ namespace AIStudio.Wpf.DiagramDesigner
//如果没有文字,失去焦点自动清除
if (_isSelected == false && string.IsNullOrEmpty(Text))
{
Parent.Labels.Remove(this);
Connector.Labels.Remove(this);
}
}
@@ -84,6 +70,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
get; set;
}
#endregion
private bool updating = false;
@@ -120,7 +107,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
else
{
length = totalLength * (Parent.Labels.IndexOf(this) + 1) / (Parent.Labels.Count + 1);
length = totalLength * (Connector.Labels.IndexOf(this) + 1) / (Connector.Labels.Count + 1);
}
@@ -153,9 +140,9 @@ namespace AIStudio.Wpf.DiagramDesigner
Offset += new VectorBase(0, newvalue - oldvalue);
}
public void AddToSelection(bool selected)
public override void AddToSelection(bool selected)
{
foreach (var item in Parent.Labels.ToList())
foreach (var item in Connector.Labels.ToList())
item.IsSelected = false;
if (selected == true)
@@ -168,7 +155,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (parameter is ConnectorLabelModel label)
{
Parent.Labels.Remove(label);
Connector.Labels.Remove(label);
}
}

View File

@@ -8,29 +8,35 @@ using AIStudio.Wpf.DiagramDesigner.Geometrys;
namespace AIStudio.Wpf.DiagramDesigner
{
public class ConnectorPoint : BindableBase
public class ConnectorPointModel : SelectableViewModelBase
{
public ConnectorPoint()
public ConnectorPointModel()
{
ColorViewModel = new ColorViewModel()
{
LineColor = new ColorObject() { Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x80) },
FillColor = new ColorObject() { Color = Colors.Lavender },
};
}
public ConnectorPoint(PointBase point) : this()
public ConnectorPointModel(PointBase point) : this()
{
X = point.X;
Y = point.Y;
}
public ConnectorPoint(double x, double y) : this()
public ConnectorPointModel(double x, double y) : this()
{
X = x;
Y = y;
}
protected override void Init()
{
base.Init();
ColorViewModel = new ColorViewModel()
{
LineColor = new ColorObject() { Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x80) },
FillColor = new ColorObject() { Color = Colors.Lavender },
};
}
/// <summary>
/// 中间X
/// </summary>
@@ -114,54 +120,28 @@ namespace AIStudio.Wpf.DiagramDesigner
set { connectorHeight = value; }
}
private IColorViewModel _colorViewModel;
public IColorViewModel ColorViewModel
public static ConnectorPointModel operator -(ConnectorPointModel a, ConnectorPointModel b)
{
get
{
return _colorViewModel;
}
set
{
SetProperty(ref _colorViewModel, value);
}
return new ConnectorPointModel(a.X - b.X, a.Y - b.Y);
}
public static ConnectorPointModel operator +(ConnectorPointModel a, ConnectorPointModel b)
{
return new ConnectorPointModel(a.X + b.X, a.Y + b.Y);
}
private IFontViewModel _fontViewModel;
public IFontViewModel FontViewModel
public static implicit operator ConnectorPointModel(PointBase point)
{
get
{
return _fontViewModel;
}
set
{
SetProperty(ref _fontViewModel, value);
}
return new ConnectorPointModel(point);
}
public static ConnectorPoint operator -(ConnectorPoint a, ConnectorPoint b)
{
return new ConnectorPoint(a.X - b.X, a.Y - b.Y);
}
public static ConnectorPoint operator +(ConnectorPoint a, ConnectorPoint b)
{
return new ConnectorPoint(a.X + b.X, a.Y + b.Y);
}
public static implicit operator ConnectorPoint(PointBase point)
{
return new ConnectorPoint(point);
}
public static implicit operator PointBase(ConnectorPoint pointInfoBase)
public static implicit operator PointBase(ConnectorPointModel pointInfoBase)
{
return new PointBase(pointInfoBase.X, pointInfoBase.Y);
}
public static List<ConnectorPoint> ToList(List<PointBase> lst)
public static List<ConnectorPointModel> ToList(List<PointBase> lst)
{
return lst.Select(p => (ConnectorPoint)p).ToList();
return lst.Select(p => (ConnectorPointModel)p).ToList();
}
public override string ToString() => $"ConnectorPoint(x={X}, y={Y})";

View File

@@ -2,31 +2,45 @@
namespace AIStudio.Wpf.DiagramDesigner
{
public class ConnectorVertexModel : ConnectorPoint
public class ConnectorVertexModel : ConnectorPointModel
{
public ConnectorVertexModel(ConnectorViewModel parent, PointBase? position = null)
public ConnectorVertexModel(ConnectorViewModel connector, PointBase? position = null)
{
Parent = parent;
Parent = connector;
X = position?.X ?? 0;
Y = position?.Y ?? 0;
Y = position?.Y ?? 0;
}
protected override void Init()
{
base.Init();
DeleteVertexCommand = new SimpleCommand(DeleteVertex);
}
public ConnectorViewModel Parent
protected override void LoadDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designerbase)
{
get;
base.LoadDesignerItemViewModel(root, designerbase);
}
public ConnectorViewModel Connector
{
get
{
return Parent as ConnectorViewModel;
}
}
public override PointBase Position
{
get
{
return new PointBase(Parent.Area.Left + Left, Parent.Area.Top + Top);
return new PointBase(Connector.Area.Left + Left, Connector.Area.Top + Top);
}
}
public override PointBase MiddlePosition => new PointBase(Parent.Area.Left + Left + ConnectorWidth / 2, Parent.Area.Top + Top + ConnectorHeight / 2);
public override PointBase MiddlePosition => new PointBase(Connector.Area.Left + Left + ConnectorWidth / 2, Connector.Area.Top + Top + ConnectorHeight / 2);
public SimpleCommand DeleteVertexCommand
{
@@ -37,7 +51,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (parameter is ConnectorVertexModel vertice)
{
Parent.Vertices.Remove(vertice);
Connector.Vertices.Remove(vertice);
}
}

View File

@@ -15,15 +15,15 @@ namespace AIStudio.Wpf.DiagramDesigner
{
public class ConnectorViewModel : SelectableDesignerItemViewModelBase
{
public ConnectorViewModel(IDiagramViewModel parent, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode, RouterMode routerMode)
public ConnectorViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode, RouterMode routerMode)
{
Parent = parent;
Root = root;
PathMode = drawMode.ToString();
RouterMode = routerMode.ToString();
Init(sourceConnectorInfo, sinkConnectorInfo);
}
public ConnectorViewModel(IDiagramViewModel parent, FullyCreatedConnectorInfo sourceConnectorInfo, FullyCreatedConnectorInfo sinkConnectorInfo, ConnectionItem designer) : base(parent, designer)
public ConnectorViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, FullyCreatedConnectorInfo sinkConnectorInfo, ConnectionItem designer) : base(root, designer)
{
PathMode = designer.PathMode;
RouterMode = designer.RouterMode;
@@ -39,11 +39,11 @@ namespace AIStudio.Wpf.DiagramDesigner
protected virtual void Init(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo)
{
this.Parent = sourceConnectorInfo.DataItem.Parent;
this.Root = sourceConnectorInfo.DataItem.Root;
if (Parent != null && Parent.ColorViewModel != null)
if (Root != null && Root.ColorViewModel != null)
{
this.ColorViewModel = CopyHelper.Mapper(Parent.ColorViewModel);
this.ColorViewModel = CopyHelper.Mapper(Root.ColorViewModel);
}
if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false)
{
@@ -65,14 +65,14 @@ namespace AIStudio.Wpf.DiagramDesigner
AddLabelCommand = new SimpleCommand(AddLabel);
}
protected void LoadDesignerItemViewModel(SelectableDesignerItemBase designerbase)
protected void LoadDesignerItemViewModel(SelectableItemBase designerbase)
{
ConnectionItem designer = designerbase as ConnectionItem;
Vertices = new ObservableCollection<ConnectorVertexModel>(designer.Vertices.Select(p => new ConnectorVertexModel(this, new PointBase(p.X, p.Y))));
}
public override SelectableDesignerItemBase ToXmlObject()
public override SelectableItemBase ToXmlObject()
{
if (IsFullConnection)
{
@@ -92,6 +92,51 @@ namespace AIStudio.Wpf.DiagramDesigner
}
#region
private string _text;
[Browsable(true)]
[CanDo]
public override string Text
{
get
{
var text = _text;
if (Labels?.Count > 0)
{
text = Labels[0].Text;
}
if (FontViewModel.FontCase == FontCase.Upper)
{
return text?.ToUpper();
}
else if (FontViewModel.FontCase == FontCase.Lower)
{
return text?.ToLower();
}
else
{
return text;
}
}
set
{
if (SetProperty(ref _text, value))
{
if (!string.IsNullOrEmpty(_text))
{
if (Labels?.Count > 0)
{
Labels[0].Text = _text;
}
else
{
AddLabel(_text);
}
}
}
}
}
private PointBase _sourceA;
public PointBase SourceA
{
@@ -438,8 +483,8 @@ namespace AIStudio.Wpf.DiagramDesigner
{
switch (e.PropertyName)
{
case nameof(ConnectorPoint.X):
case nameof(ConnectorPoint.Y):
case nameof(ConnectorPointModel.X):
case nameof(ConnectorPointModel.Y):
UpdatePathGeneratorResult();
break;
@@ -449,7 +494,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
switch (e.PropertyName)
{
case nameof(ConnectorPoint.X):
case nameof(ConnectorPointModel.X):
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
@@ -457,7 +502,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
break;
}
case nameof(ConnectorPoint.Y):
case nameof(ConnectorPointModel.Y):
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
@@ -479,13 +524,13 @@ namespace AIStudio.Wpf.DiagramDesigner
if (SourceConnectorInfo == null || SinkConnectorInfo == null)
return;
var route = Router.Get(Parent, this);
var route = Router.Get(Root, this);
(var source, var target) = FindConnectionPoints(route);
if (source == null || target == null)
return;
PathGeneratorResult = PathGenerator.Get(Parent, this, route, source.Value, target.Value);
PathGeneratorResult = PathGenerator.Get(Root, this, route, source.Value, target.Value);
//修正旋转
switch (SourceConnectorInfo.Orientation)
@@ -560,9 +605,9 @@ namespace AIStudio.Wpf.DiagramDesigner
private void DeleteConnection(object args)
{
if (this.Parent is IDiagramViewModel)
if (this.Root is IDiagramViewModel)
{
var diagramVM = this.Parent as IDiagramViewModel;
var diagramVM = this.Root as IDiagramViewModel;
diagramVM.RemoveItemCommand.Execute(this);
}
}

View File

@@ -18,12 +18,12 @@ namespace AIStudio.Wpf.DiagramDesigner
ShapeDefiner = Shapes.Rectangle;
}
public DesignerItemViewModelBase(IDiagramViewModel parent, DesignerItemBase designer) : base(parent, designer)
public DesignerItemViewModelBase(IDiagramViewModel root, DesignerItemBase designer) : base(root, designer)
{
ShapeDefiner = Shapes.Rectangle;
}
public DesignerItemViewModelBase(IDiagramViewModel parent, string json) : base(parent, json)
public DesignerItemViewModelBase(IDiagramViewModel root, string json) : base(root, json)
{
ShapeDefiner = Shapes.Rectangle;
}
@@ -35,9 +35,9 @@ namespace AIStudio.Wpf.DiagramDesigner
InitConnector();
}
protected override void LoadDesignerItemViewModel(IDiagramViewModel parent, SelectableDesignerItemBase designerbase)
protected override void LoadDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designerbase)
{
base.LoadDesignerItemViewModel(parent, designerbase);
base.LoadDesignerItemViewModel(root, designerbase);
DesignerItemBase designer = designerbase as DesignerItemBase;
@@ -51,7 +51,7 @@ namespace AIStudio.Wpf.DiagramDesigner
this.Icon = designer.Icon;
}
public override SelectableDesignerItemBase ToXmlObject()
public override SelectableItemBase ToXmlObject()
{
return new DesignerItemBase(this);
}
@@ -382,41 +382,41 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (!(this is TextDesignerItemViewModel))
{
if (Parent.CellHorizontalAlignment == CellHorizontalAlignment.Center)
if (Root.CellHorizontalAlignment == CellHorizontalAlignment.Center)
{
if (Parent.GridCellSize.Width > this.ItemWidth)
if (Root.GridCellSize.Width > this.ItemWidth)
{
this.Left = (int)(this.Left / Parent.GridCellSize.Width) * Parent.GridCellSize.Width + Parent.GridMargin + (Parent.GridCellSize.Width - this.ItemWidth) / 2;
this.Left = (int)(this.Left / Root.GridCellSize.Width) * Root.GridCellSize.Width + Root.GridMargin + (Root.GridCellSize.Width - this.ItemWidth) / 2;
}
}
else if (Parent.CellHorizontalAlignment == CellHorizontalAlignment.Left)
else if (Root.CellHorizontalAlignment == CellHorizontalAlignment.Left)
{
this.Left = (int)(this.Left / Parent.GridCellSize.Width) * Parent.GridCellSize.Width + Parent.GridMargin;
this.Left = (int)(this.Left / Root.GridCellSize.Width) * Root.GridCellSize.Width + Root.GridMargin;
}
else if (Parent.CellHorizontalAlignment == CellHorizontalAlignment.Right)
else if (Root.CellHorizontalAlignment == CellHorizontalAlignment.Right)
{
if (Parent.GridCellSize.Width > this.ItemWidth)
if (Root.GridCellSize.Width > this.ItemWidth)
{
this.Left = (int)(this.Left / Parent.GridCellSize.Width) * Parent.GridCellSize.Width + Parent.GridMargin + (Parent.GridCellSize.Width - this.ItemWidth);
this.Left = (int)(this.Left / Root.GridCellSize.Width) * Root.GridCellSize.Width + Root.GridMargin + (Root.GridCellSize.Width - this.ItemWidth);
}
}
if (Parent.CellVerticalAlignment == CellVerticalAlignment.Center)
if (Root.CellVerticalAlignment == CellVerticalAlignment.Center)
{
if (Parent.GridCellSize.Height > this.ItemHeight)
if (Root.GridCellSize.Height > this.ItemHeight)
{
this.Top = (int)(this.Top / Parent.GridCellSize.Height) * Parent.GridCellSize.Height + Parent.GridMargin + (Parent.GridCellSize.Height - this.ItemHeight) / 2;
this.Top = (int)(this.Top / Root.GridCellSize.Height) * Root.GridCellSize.Height + Root.GridMargin + (Root.GridCellSize.Height - this.ItemHeight) / 2;
}
}
else if (Parent.CellVerticalAlignment == CellVerticalAlignment.Top)
else if (Root.CellVerticalAlignment == CellVerticalAlignment.Top)
{
this.Top = (int)(this.Top / Parent.GridCellSize.Height) * Parent.GridCellSize.Height + Parent.GridMargin;
this.Top = (int)(this.Top / Root.GridCellSize.Height) * Root.GridCellSize.Height + Root.GridMargin;
}
else if (Parent.CellVerticalAlignment == CellVerticalAlignment.Bottom)
else if (Root.CellVerticalAlignment == CellVerticalAlignment.Bottom)
{
if (Parent.GridCellSize.Height > this.ItemHeight)
if (Root.GridCellSize.Height > this.ItemHeight)
{
this.Top = (int)(this.Top / Parent.GridCellSize.Height) * Parent.GridCellSize.Height + Parent.GridMargin + (Parent.GridCellSize.Height - this.ItemHeight);
this.Top = (int)(this.Top / Root.GridCellSize.Height) * Root.GridCellSize.Height + Root.GridMargin + (Root.GridCellSize.Height - this.ItemHeight);
}
}
}

View File

@@ -743,7 +743,7 @@ namespace AIStudio.Wpf.DiagramDesigner
private void Add(SelectableDesignerItemViewModelBase item)
{
item.Parent = this;
item.Root = this;
item.ZIndex = Items.Count;
if (item.Id == Guid.Empty)
{

View File

@@ -28,12 +28,12 @@ namespace AIStudio.Wpf.DiagramDesigner
}
public SelectableDesignerItemViewModelBase(IDiagramViewModel parent, SelectableDesignerItemBase designer):base(parent, designer)
public SelectableDesignerItemViewModelBase(IDiagramViewModel root, SelectableItemBase designer):base(root, designer)
{
}
public SelectableDesignerItemViewModelBase(IDiagramViewModel parent, string json) : base(parent, json)
public SelectableDesignerItemViewModelBase(IDiagramViewModel root, string json) : base(root, json)
{
}
@@ -134,7 +134,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (newselect)
{
foreach (var designerItemViewModelBase in Parent.SelectedItems.ToList())
foreach (var designerItemViewModelBase in Root.SelectedItems.ToList())
{
designerItemViewModelBase._isSelected = false;
}
@@ -145,13 +145,13 @@ namespace AIStudio.Wpf.DiagramDesigner
public override void AddToSelection(bool selected)
{
foreach (SelectableDesignerItemViewModelBase item in Parent.SelectedItems.ToList())
foreach (SelectableDesignerItemViewModelBase item in Root.SelectedItems.ToList())
item.IsSelected = false;
Parent.SelectedItems.Clear();
Root.SelectedItems.Clear();
if (selected == true)
{
Parent.SelectionService.AddToSelection(this);
Root.SelectionService.AddToSelection(this);
}
}

View File

@@ -26,21 +26,21 @@ namespace AIStudio.Wpf.DiagramDesigner
(FontViewModel as FontViewModel).PropertyChanged += FontViewModel_PropertyChanged;
}
public SelectableViewModelBase(IDiagramViewModel parent, SelectableDesignerItemBase designer)
public SelectableViewModelBase(IDiagramViewModel root, SelectableItemBase designer)
{
Init();
LoadDesignerItemViewModel(parent, designer);
LoadDesignerItemViewModel(root, designer);
(FontViewModel as FontViewModel).PropertyChanged += FontViewModel_PropertyChanged;
}
public SelectableViewModelBase(IDiagramViewModel parent, string json)
public SelectableViewModelBase(IDiagramViewModel root, string json)
{
Init();
LoadDesignerItemViewModel(parent, JsonConvert.DeserializeObject(json, ToXmlType()) as SelectableDesignerItemBase);
LoadDesignerItemViewModel(root, JsonConvert.DeserializeObject(json, ToXmlType()) as SelectableItemBase);
(FontViewModel as FontViewModel).PropertyChanged += FontViewModel_PropertyChanged;
}
public virtual SelectableDesignerItemBase ToXmlObject()
public virtual SelectableItemBase ToXmlObject()
{
return null;
}
@@ -72,9 +72,9 @@ namespace AIStudio.Wpf.DiagramDesigner
LockObjectViewModel = new LockObjectViewModel();
}
protected virtual void LoadDesignerItemViewModel(IDiagramViewModel parent, SelectableDesignerItemBase designerbase)
protected virtual void LoadDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designerbase)
{
this.Parent = parent;
this.Root = root;
this.Id = designerbase.Id;
this.ParentId = designerbase.ParentId;
@@ -86,10 +86,16 @@ namespace AIStudio.Wpf.DiagramDesigner
FontViewModel = CopyHelper.Mapper<FontViewModel, FontItem>(designerbase.FontItem);
}
public IDiagramViewModel Parent
public IDiagramViewModel Root
{
get; set;
}
public SelectableViewModelBase Parent
{
get; set;
}
public Guid Id
{
get; set;
@@ -148,10 +154,16 @@ namespace AIStudio.Wpf.DiagramDesigner
{
get
{
if (Parent?.IsReadOnly == true && Parent?.IsLoading == false)
if (Root?.IsReadOnly == true && Root?.IsLoading == false)
{
return true;
}
if (Parent?.IsReadOnly == true)
{
return true;
}
if (LockObjectViewModel?.LockObject.FirstOrDefault(p => p.LockFlag == LockFlag.All)?.IsChecked == true)
{
return true;
@@ -170,10 +182,15 @@ namespace AIStudio.Wpf.DiagramDesigner
{
get
{
if (Parent?.IsHitTestVisible == false)
{
return false;
}
return _isHitTestVisible;
}
set
{
{
if (SetProperty(ref _isHitTestVisible, value))
{
RaisePropertyChanged("IsReadOnly");

View File

@@ -25,17 +25,17 @@ namespace AIStudio.Wpf.DiagramDesigner
{
}
public GifImageItemViewModel(IDiagramViewModel parent, MediaDesignerItem designer) : base(parent, designer)
public GifImageItemViewModel(IDiagramViewModel root, MediaDesignerItem designer) : base(root, designer)
{
}
public GifImageItemViewModel(IDiagramViewModel parent, string json) : base(parent, json)
public GifImageItemViewModel(IDiagramViewModel root, string json) : base(root, json)
{
}
public override SelectableDesignerItemBase ToXmlObject()
public override SelectableItemBase ToXmlObject()
{
return new MediaDesignerItem(this);
}
@@ -60,9 +60,9 @@ namespace AIStudio.Wpf.DiagramDesigner
}
protected override void LoadDesignerItemViewModel(IDiagramViewModel parent, SelectableDesignerItemBase designerbase)
protected override void LoadDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designerbase)
{
base.LoadDesignerItemViewModel(parent, designerbase);
base.LoadDesignerItemViewModel(root, designerbase);
MediaDesignerItem designer = designerbase as MediaDesignerItem;

View File

@@ -20,17 +20,17 @@ namespace AIStudio.Wpf.DiagramDesigner
{
}
public ImageItemViewModel(IDiagramViewModel parent, ImageDesignerItem designer) : base(parent, designer)
public ImageItemViewModel(IDiagramViewModel root, ImageDesignerItem designer) : base(root, designer)
{
}
public ImageItemViewModel(IDiagramViewModel parent, string json) : base(parent, json)
public ImageItemViewModel(IDiagramViewModel root, string json) : base(root, json)
{
}
public override SelectableDesignerItemBase ToXmlObject()
public override SelectableItemBase ToXmlObject()
{
return new ImageDesignerItem(this);
}
@@ -114,9 +114,9 @@ namespace AIStudio.Wpf.DiagramDesigner
}
protected override void LoadDesignerItemViewModel(IDiagramViewModel parent, SelectableDesignerItemBase designerbase)
protected override void LoadDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designerbase)
{
base.LoadDesignerItemViewModel(parent, designerbase);
base.LoadDesignerItemViewModel(root, designerbase);
ImageDesignerItem designer = designerbase as ImageDesignerItem;

View File

@@ -73,17 +73,17 @@ namespace AIStudio.Wpf.DiagramDesigner
BuildMenuOptions();
}
public LogicalGateItemViewModelBase(IDiagramViewModel parent, LogicalGateDesignerItemBase designer) : base(parent, designer)
public LogicalGateItemViewModelBase(IDiagramViewModel root, LogicalGateDesignerItemBase designer) : base(root, designer)
{
BuildMenuOptions();
}
public LogicalGateItemViewModelBase(IDiagramViewModel parent, string json) : base(parent, json)
public LogicalGateItemViewModelBase(IDiagramViewModel root, string json) : base(root, json)
{
BuildMenuOptions();
}
public override SelectableDesignerItemBase ToXmlObject()
public override SelectableItemBase ToXmlObject()
{
return new LogicalGateDesignerItemBase(this);
}
@@ -137,9 +137,9 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
protected override void LoadDesignerItemViewModel(IDiagramViewModel parent, SelectableDesignerItemBase designerbase)
protected override void LoadDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designerbase)
{
base.LoadDesignerItemViewModel(parent, designerbase);
base.LoadDesignerItemViewModel(root, designerbase);
LogicalGateDesignerItemBase designer = designerbase as LogicalGateDesignerItemBase;
this.LogicalType = designer.LogicalType;

View File

@@ -14,17 +14,17 @@ namespace AIStudio.Wpf.DiagramDesigner
}
public MediaItemViewModel(IDiagramViewModel parent, MediaDesignerItem designer) : base(parent, designer)
public MediaItemViewModel(IDiagramViewModel root, MediaDesignerItem designer) : base(root, designer)
{
}
public MediaItemViewModel(IDiagramViewModel parent, string json) : base(parent, json)
public MediaItemViewModel(IDiagramViewModel root, string json) : base(root, json)
{
}
public override SelectableDesignerItemBase ToXmlObject()
public override SelectableItemBase ToXmlObject()
{
return new MediaDesignerItem(this);
}
@@ -42,7 +42,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
protected override void LoadDesignerItemViewModel(IDiagramViewModel parent, SelectableDesignerItemBase designerbase)
protected override void LoadDesignerItemViewModel(IDiagramViewModel parent, SelectableItemBase designerbase)
{
base.LoadDesignerItemViewModel(parent, designerbase);

View File

@@ -10,18 +10,18 @@ namespace AIStudio.Wpf.DiagramDesigner
}
public TextDesignerItemViewModel(IDiagramViewModel parent, DesignerItemBase designer) : base(parent, designer)
public TextDesignerItemViewModel(IDiagramViewModel root, DesignerItemBase designer) : base(root, designer)
{
}
public TextDesignerItemViewModel(IDiagramViewModel parent, string json) : base(parent, json)
public TextDesignerItemViewModel(IDiagramViewModel root, string json) : base(root, json)
{
}
public override SelectableDesignerItemBase ToXmlObject()
public override SelectableItemBase ToXmlObject()
{
return new TextDesignerItem(this);
}

View File

@@ -13,13 +13,13 @@ namespace AIStudio.Wpf.DiagramDesigner
{
}
public VideoItemViewModel(IDiagramViewModel parent, MediaDesignerItem designer) : base(parent, designer)
public VideoItemViewModel(IDiagramViewModel root, MediaDesignerItem designer) : base(root, designer)
{
}
public VideoItemViewModel(IDiagramViewModel parent, string json) : base(parent, json)
public VideoItemViewModel(IDiagramViewModel root, string json) : base(root, json)
{
}