连接点可以添加文字

This commit is contained in:
艾竹
2023-01-22 21:46:59 +08:00
parent ad227aee0c
commit 4c37fb9772
16 changed files with 371 additions and 122 deletions

View File

@@ -5,10 +5,10 @@ using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
//using System.Windows;
using System.Windows.Media;
using AIStudio.Wpf.DiagramDesigner.Geometrys;
using AIStudio.Wpf.DiagramDesigner.Helpers;
using SvgPathProperties;
namespace AIStudio.Wpf.DiagramDesigner
{
@@ -39,7 +39,7 @@ namespace AIStudio.Wpf.DiagramDesigner
protected virtual void Init(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo)
{
this.Parent = sourceConnectorInfo.DataItem.Parent;
if (Parent != null && Parent.ColorViewModel != null)
{
this.ColorViewModel = CopyHelper.Mapper(Parent.ColorViewModel);
@@ -60,7 +60,7 @@ namespace AIStudio.Wpf.DiagramDesigner
this.SourceConnectorInfo = sourceConnectorInfo;
this.SinkConnectorInfo = sinkConnectorInfo;
DeleteConnectionCommand = new SimpleCommand(DeleteConnection);
AddVertexCommand = new SimpleCommand(AddVertex);
AddVertexCommand = new SimpleCommand(AddVertex);
}
protected void LoadDesignerItemViewModel(SelectableDesignerItemBase designerbase)
@@ -112,7 +112,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
set
{
SetProperty(ref _sourceB, value);
SetProperty(ref _sourceB, value);
}
}
@@ -177,7 +177,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
private set
{
SetProperty(ref _area, value);
SetProperty(ref _area, value);
}
}
@@ -241,7 +241,18 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
public List<LinkLabelModel> Labels { get; set; } = new List<LinkLabelModel>();
private ObservableCollection<LinkLabelModel> _labels = new ObservableCollection<LinkLabelModel>();
public ObservableCollection<LinkLabelModel> Labels
{
get
{
return _labels;
}
private set
{
SetProperty(ref _labels, value);
}
}
public virtual Dictionary<string, string> PropertiesSetting
{
@@ -277,7 +288,7 @@ namespace AIStudio.Wpf.DiagramDesigner
set
{
SetProperty(ref _sinkConnectorInfo, value);
}
}
@@ -351,6 +362,12 @@ namespace AIStudio.Wpf.DiagramDesigner
vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
}
break;
case nameof(Labels):
foreach (var label in Labels)
{
label.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
}
break;
case nameof(SourceConnectorInfo):
SourceA = PointHelper.GetPointForConnector(SourceConnectorInfo);
(SourceConnectorInfo.DataItem as INotifyPropertyChanged).PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
@@ -362,6 +379,12 @@ namespace AIStudio.Wpf.DiagramDesigner
(((FullyCreatedConnectorInfo)SinkConnectorInfo).DataItem as INotifyPropertyChanged).PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
}
break;
case nameof(IsSelected):
if (IsSelected == false)
{
Labels.FirstOrDefault()?.AddToSelection(false);
}
break;
}
}
@@ -395,13 +418,35 @@ namespace AIStudio.Wpf.DiagramDesigner
{
switch (e.PropertyName)
{
case nameof(ConnectorPoint.Left):
case nameof(ConnectorPoint.Top):
case nameof(ConnectorPoint.X):
case nameof(ConnectorPoint.Y):
UpdatePathGeneratorResult();
break;
}
}
else if (sender is LinkLabelModel linkLabelModel)
{
switch (e.PropertyName)
{
case nameof(ConnectorPoint.X):
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
linkLabelModel.UpdateOffsetX((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
}
break;
}
case nameof(ConnectorPoint.Y):
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
linkLabelModel.UpdateOffsetY((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
}
break;
}
}
}
}
private void UpdateArea()
@@ -485,6 +530,12 @@ namespace AIStudio.Wpf.DiagramDesigner
StartAngle = PathGeneratorResult.SourceMarkerAngle;
EndAngle = PathGeneratorResult.TargetMarkerAngle;
var paths = Labels.Count > 0 ? PathGeneratorResult.Paths.Select(p => new SvgPath(p)).ToArray() : Array.Empty<SvgPath>();
foreach (var label in Labels)
{
label.UpdatePosition(paths);
}
}
private void DeleteConnection(object args)
@@ -496,22 +547,6 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
private void AddVertex(object parameter)
{
MouseButtonEventArgs mosueArg = ((EventToCommandArgs)parameter).EventArgs as MouseButtonEventArgs;
var position = mosueArg.GetPosition(((EventToCommandArgs)parameter).Sender as IInputElement);
var vertice = new LinkVertexModel(this, new PointBase(position.X, position.Y));
vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
Vertices.Add(vertice);
UpdatePathGeneratorResult();
if (!((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control))
{
ShouldInsertAnchor = false;
}
}
private (PointBase? source, PointBase? target) FindConnectionPoints(PointBase[] route)
{
if (IsPortless) // Portless
@@ -544,7 +579,7 @@ namespace AIStudio.Wpf.DiagramDesigner
if (port == null)
return null;
if (marker == null)
if (marker == 0)
return port.MiddlePosition;
var pt = port.Position;
@@ -588,6 +623,22 @@ namespace AIStudio.Wpf.DiagramDesigner
}
#region
private void AddVertex(object parameter)
{
MouseButtonEventArgs mosueArg = ((EventToCommandArgs)parameter).EventArgs as MouseButtonEventArgs;
var position = mosueArg.GetPosition(((EventToCommandArgs)parameter).Sender as IInputElement);
var vertice = new LinkVertexModel(this, new PointBase(position.X, position.Y));
vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
Vertices.Add(vertice);
UpdatePathGeneratorResult();
if (!((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control))
{
ShouldInsertAnchor = false;
}
}
protected override void ExecuteEditCommand(object param)
{
if (this.OutTextItem != null) return;
@@ -596,48 +647,25 @@ namespace AIStudio.Wpf.DiagramDesigner
public void AddText(string text)
{
if (this.Parent is IDiagramViewModel)
{
var diagramVM = this.Parent as IDiagramViewModel;
var label = new LinkLabelModel(this, "");
label.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
label.IsSelected = true;
Labels.Add(label);
TextDesignerItemViewModel textitem = new TextDesignerItemViewModel();
textitem.ItemWidth = Double.NaN;
textitem.ItemHeight = double.NaN;
//if (this.PathMode == DrawMode.ConnectingLineBoundary.ToString())
//{
// var mid = (int)(ConnectionPoints.Count / 2);
// var p = PathGenerators.SegmentMiddlePoint(ConnectionPoints[mid - 1], ConnectionPoints[mid]);
// textitem.Left = this.Area.Left + p.X + 2;
// textitem.Top = this.Area.Top + p.Y - 15;
//}
//else
{
textitem.Left = this.Area.Left + this.Area.Width / 2 - 16;
textitem.Top = this.Area.Top + this.Area.Height / 2 - 5;
}
textitem.Watermark = null;
textitem.ZIndex = diagramVM.Items.Count;
textitem.ParentId = this.Id;
textitem.ParentItem = this;
textitem.ColorViewModel.FillColor = new ColorObject() { Color = Colors.White };
textitem.Text = text;
diagramVM.DirectAddItemCommand.Execute(textitem);
this.OutTextItem = textitem;
}
var paths = Labels.Count > 0 ? PathGeneratorResult.Paths.Select(p => new SvgPath(p)).ToArray() : Array.Empty<SvgPath>();
label.UpdatePosition(paths);
}
public void OutTextItemLocation(RectangleBase oldArea, RectangleBase newArea)
{
if (this.OutTextItem is TextDesignerItemViewModel text)
{
var oldpoint = new PointBase(oldArea.Left + oldArea.Width / 2, oldArea.Top + oldArea.Height / 2);
var newpoint = new PointBase(newArea.Left + newArea.Width / 2, newArea.Top + newArea.Height / 2);
//if (this.OutTextItem is TextDesignerItemViewModel text)
//{
// var oldpoint = new PointBase(oldArea.Left + oldArea.Width / 2, oldArea.Top + oldArea.Height / 2);
// var newpoint = new PointBase(newArea.Left + newArea.Width / 2, newArea.Top + newArea.Height / 2);
text.Left = text.Left + newpoint.X - oldpoint.X;
text.Top = text.Top + newpoint.Y - oldpoint.Y;
}
// text.Left = text.Left + newpoint.X - oldpoint.X;
// text.Top = text.Top + newpoint.Y - oldpoint.Y;
//}
}
#endregion
}