Files
aistudio-wpf-diagram/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs

651 lines
24 KiB
C#
Raw Normal View History

2021-07-23 09:42:22 +08:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Xml;
using System.Linq;
using System.Windows.Shapes;
using System.Windows.Resources;
using System.Runtime.InteropServices;
2023-02-03 22:25:03 +08:00
using Newtonsoft.Json;
using AIStudio.Wpf.DiagramDesigner.Models;
2023-03-18 21:44:58 +08:00
using AIStudio.Wpf.DiagramDesigner.ViewModels;
using AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel;
using System.Diagnostics;
2021-07-23 09:42:22 +08:00
2022-10-28 22:45:39 +08:00
namespace AIStudio.Wpf.DiagramDesigner
2021-07-23 09:42:22 +08:00
{
public class DesignerCanvas : Canvas
{
#region
2023-01-26 20:05:21 +08:00
private IDiagramViewModel _viewModel
{
get
{
return DataContext as IDiagramViewModel;
}
}
private IDiagramServiceProvider _service
{
get
{
return DiagramServicesProvider.Instance.Provider;
}
}
2023-05-03 09:59:46 +08:00
private ConnectionViewModel partialConnection;
2021-07-23 09:42:22 +08:00
private Point? rubberbandSelectionStartPoint = null;
2023-05-02 14:28:51 +08:00
private Connector sourceConnector;
public Connector SourceConnector
{
get
{
return sourceConnector;
}
set
{
if (sourceConnector != value)
{
sourceConnector = value;
2023-05-03 09:59:46 +08:00
ConnectorInfoBase sourceDataItem = sourceConnector.Info;
//Rect rectangleBounds = sourceConnector.TransformToVisual(this).TransformBounds(new Rect(sourceConnector.RenderSize));
//Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2),
// rectangleBounds.Bottom + (rectangleBounds.Height / 2));
Point point = sourceDataItem.MiddlePosition;
2023-05-02 14:28:51 +08:00
partialConnection = new ConnectionViewModel(_viewModel, sourceDataItem, new PartCreatedConnectorInfo(point.X, point.Y), DrawMode, RouterMode);
_viewModel.Add(partialConnection);
partialConnection.ZIndex = -1;
2023-05-02 14:28:51 +08:00
}
}
}
private Connector sinkConnector;
2023-01-12 23:02:53 +08:00
private DrawMode DrawMode
2022-12-04 23:07:20 +08:00
{
get
{
if (_viewModel.DrawModeViewModel != null)
2022-12-04 23:07:20 +08:00
{
2023-01-12 23:02:53 +08:00
return _viewModel.DrawModeViewModel.LineDrawMode;
2022-12-04 23:07:20 +08:00
}
else
{
2023-01-12 23:02:53 +08:00
return _service.DrawModeViewModel.LineDrawMode;
}
}
}
private RouterMode RouterMode
{
get
{
if (_viewModel.DrawModeViewModel != null)
2023-01-12 23:02:53 +08:00
{
return _viewModel.DrawModeViewModel.LineRouterMode;
}
else
{
return _service.DrawModeViewModel.LineRouterMode;
2022-12-04 23:07:20 +08:00
}
}
}
2023-01-26 20:05:21 +08:00
private bool EnableSnapping
{
get
{
if (_viewModel.DrawModeViewModel != null)
{
return _viewModel.DrawModeViewModel.EnableSnapping;
}
else
{
return _service.DrawModeViewModel.EnableSnapping;
}
2023-01-26 20:05:21 +08:00
}
}
private double SnappingRadius
{
get
{
if (_viewModel.DrawModeViewModel != null)
{
return _viewModel.DrawModeViewModel.SnappingRadius;
}
else
{
return _service.DrawModeViewModel.SnappingRadius;
}
2023-01-26 20:05:21 +08:00
}
}
2023-05-03 09:59:46 +08:00
2021-07-23 09:42:22 +08:00
#region GridCellSize
public static readonly DependencyProperty GridCellSizeProperty =
2023-01-24 09:02:40 +08:00
DependencyProperty.Register(nameof(GridCellSize),
2021-07-23 09:42:22 +08:00
typeof(Size),
typeof(DesignerCanvas),
new FrameworkPropertyMetadata(new Size(50, 50), FrameworkPropertyMetadataOptions.AffectsRender));
public Size GridCellSize
{
2023-01-26 20:05:21 +08:00
get
{
return (Size)GetValue(GridCellSizeProperty);
}
set
{
SetValue(GridCellSizeProperty, value);
}
2021-07-23 09:42:22 +08:00
}
#endregion
#region ShowGrid
public static readonly DependencyProperty ShowGridProperty =
2023-01-24 09:02:40 +08:00
DependencyProperty.Register(nameof(ShowGrid),
2021-07-23 09:42:22 +08:00
typeof(bool),
typeof(DesignerCanvas),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public bool ShowGrid
{
2023-01-26 20:05:21 +08:00
get
{
return (bool)GetValue(ShowGridProperty);
}
set
{
SetValue(ShowGridProperty, value);
}
2021-07-23 09:42:22 +08:00
}
#endregion
#region GridColor
public static readonly DependencyProperty GridColorProperty =
2023-01-24 09:02:40 +08:00
DependencyProperty.Register(nameof(GridColor),
2021-07-23 09:42:22 +08:00
typeof(Color),
typeof(DesignerCanvas),
new FrameworkPropertyMetadata(Colors.LightGray, FrameworkPropertyMetadataOptions.AffectsRender));
public Color GridColor
{
2023-01-26 20:05:21 +08:00
get
{
return (Color)GetValue(GridColorProperty);
}
set
{
SetValue(GridColorProperty, value);
}
2021-07-23 09:42:22 +08:00
}
#endregion
2023-01-24 20:51:39 +08:00
#region GridMarginSize mm
2021-07-23 09:42:22 +08:00
2023-01-24 20:51:39 +08:00
public static readonly DependencyProperty GridMarginSizeProperty =
DependencyProperty.Register(nameof(GridMarginSize),
typeof(Size),
2021-07-23 09:42:22 +08:00
typeof(DesignerCanvas),
2023-01-24 20:51:39 +08:00
new FrameworkPropertyMetadata(new Size(28, 28), FrameworkPropertyMetadataOptions.AffectsRender));
2021-07-23 09:42:22 +08:00
2023-01-24 20:51:39 +08:00
public Size GridMarginSize
2021-07-23 09:42:22 +08:00
{
2023-01-26 20:05:21 +08:00
get
{
return (Size)GetValue(GridMarginSizeProperty);
}
set
{
SetValue(GridMarginSizeProperty, value);
}
2021-07-23 09:42:22 +08:00
}
#endregion
#endregion
#region
2021-07-23 09:42:22 +08:00
public DesignerCanvas()
{
2023-03-12 15:26:58 +08:00
this.Focusable = true;
2021-07-23 09:42:22 +08:00
Mediator.Instance.Register(this);
_service.PropertyChanged += _service_PropertyChanged;
2023-03-12 15:26:58 +08:00
this.Loaded += DesignerCanvas_Loaded;
2023-04-15 21:55:27 +08:00
this.IsVisibleChanged += DesignerCanvas_IsVisibleChanged;
}
private void DesignerCanvas_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (IsVisible)
{
this.Focus();
}
2023-03-12 15:26:58 +08:00
}
private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e)
{
this.Focus();
2021-07-23 09:42:22 +08:00
}
protected override void OnRender(DrawingContext dc)
{
var rect = new Rect(0, 0, RenderSize.Width, RenderSize.Height);
dc.DrawRectangle(Background, null, rect);
if (ShowGrid && GridCellSize.Width > 0 && GridCellSize.Height > 0)
DrawGrid(dc, rect);
}
protected virtual void DrawGrid(DrawingContext dc, Rect rect)
{
//using .5 forces wpf to draw a single pixel line
2023-01-24 20:51:39 +08:00
for (var i = GridMarginSize.Height + 0.5; i < rect.Height - GridMarginSize.Height; i += GridCellSize.Height)
dc.DrawLine(new Pen(new SolidColorBrush(GridColor), 1), new Point(GridMarginSize.Width, i), new Point(rect.Width - GridMarginSize.Width, i));
dc.DrawLine(new Pen(new SolidColorBrush(GridColor), 1), new Point(GridMarginSize.Width, rect.Height - GridMarginSize.Height), new Point(rect.Width - GridMarginSize.Width, rect.Height - GridMarginSize.Height));
2021-07-23 09:42:22 +08:00
2023-01-24 20:51:39 +08:00
for (var i = GridMarginSize.Width + 0.5; i < rect.Width - GridMarginSize.Width; i += GridCellSize.Width)
dc.DrawLine(new Pen(new SolidColorBrush(GridColor), 1), new Point(i, GridMarginSize.Height), new Point(i, rect.Height - GridMarginSize.Height));
dc.DrawLine(new Pen(new SolidColorBrush(GridColor), 1), new Point(rect.Width - GridMarginSize.Width, GridMarginSize.Height), new Point(rect.Width - GridMarginSize.Width, rect.Height - GridMarginSize.Height));
2021-07-23 09:42:22 +08:00
}
#endregion
2021-07-23 09:42:22 +08:00
#region Format/Move
2021-07-23 09:42:22 +08:00
private void _service_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (sender is IDrawModeViewModel)
{
if (e.PropertyName == nameof(CursorMode))
{
if (_service.DrawModeViewModel.CursorMode == CursorMode.Format)
{
EnterFormat();
}
else if (_service.DrawModeViewModel.CursorMode == CursorMode.Move)
{
EnterMove();
}
}
}
}
private void EnterFormat()
{
2022-10-28 22:45:39 +08:00
StreamResourceInfo sri = Application.GetResourceStream(new Uri("pack://application:,,,/AIStudio.Wpf.DiagramDesigner;component/Images/FormatPainter.cur", UriKind.RelativeOrAbsolute));
2021-07-23 09:42:22 +08:00
this.Cursor = new Cursor(sri.Stream);
2023-01-24 09:02:40 +08:00
foreach (SelectableDesignerItemViewModelBase item in _viewModel.Items)
2021-07-23 09:42:22 +08:00
{
item.IsHitTestVisible = false;
}
}
private void EnterMove()
{
this.Cursor = Cursors.SizeAll;
2023-01-24 09:02:40 +08:00
foreach (SelectableDesignerItemViewModelBase item in _viewModel.Items)
2021-07-23 09:42:22 +08:00
{
item.IsHitTestVisible = false;
}
}
private void ExitCursor()
{
this.Cursor = Cursors.Arrow;
2023-01-24 09:02:40 +08:00
foreach (SelectableDesignerItemViewModelBase item in _viewModel.Items)
2021-07-23 09:42:22 +08:00
{
item.IsHitTestVisible = true;
}
_service.DrawModeViewModel.CursorMode = CursorMode.Normal;
}
2023-01-24 09:02:40 +08:00
private void Format(SelectableDesignerItemViewModelBase source, SelectableDesignerItemViewModelBase target)
2021-07-23 09:42:22 +08:00
{
CopyHelper.CopyPropertyValue(source.ColorViewModel, target.ColorViewModel);
CopyHelper.CopyPropertyValue(source.FontViewModel, target.FontViewModel);
CopyHelper.CopyPropertyValue(source.ShapeViewModel, target.ShapeViewModel);
2023-04-29 15:29:22 +08:00
CopyHelper.CopyPropertyValue(source.AnimationViewModel, target.AnimationViewModel);
2021-07-23 09:42:22 +08:00
}
#endregion
2021-07-23 09:42:22 +08:00
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
2023-03-12 15:26:58 +08:00
2022-12-04 23:07:20 +08:00
if (_viewModel.IsReadOnly) return;
2021-07-23 09:42:22 +08:00
if (_service.DrawModeViewModel.CursorMode == CursorMode.Format)
{
var element = (e.OriginalSource as FrameworkElement);
2023-01-24 09:02:40 +08:00
if (element.DataContext is SelectableDesignerItemViewModelBase target)
2021-07-23 09:42:22 +08:00
{
Format(_viewModel.SelectedItems.FirstOrDefault(), target);
return;
}
ExitCursor();
}
else if (_service.DrawModeViewModel.CursorMode == CursorMode.Move)
{
ExitCursor();
return;
}
if (e.LeftButton == MouseButtonState.Pressed)
{
//if we are source of event, we are rubberband selecting
if (e.Source == this)
{
// in case that this click is the start for a
// drag operation we cache the start point
2023-05-03 09:59:46 +08:00
Point currentPoint = e.GetPosition(this);
rubberbandSelectionStartPoint = currentPoint;
2021-07-23 09:42:22 +08:00
if (!(Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)))
{
_viewModel.ClearSelectedItems();
2021-07-23 09:42:22 +08:00
}
2023-05-03 09:59:46 +08:00
if (_service.DrawModeViewModel.LineDrawModeSelected)//画线模式,可以不命中实体
{
if (SourceConnector == null)
{
//新建一个Part连接点
SourceConnector = new Connector() { Content = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y) };
}
}
e.Handled = true;
2021-07-23 09:42:22 +08:00
}
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
2023-05-03 09:59:46 +08:00
//var focusedElement = Keyboard.FocusedElement;
//Debug.WriteLine("focusedElement" + focusedElement?.ToString());
2021-07-23 09:42:22 +08:00
base.OnMouseMove(e);
2022-12-04 23:07:20 +08:00
if (_viewModel.IsReadOnly) return;
2021-07-23 09:42:22 +08:00
Point currentPoint = e.GetPosition(this);
2023-02-11 23:51:48 +08:00
_viewModel.CurrentPoint = new Point(ScreenHelper.WidthToMm(currentPoint.X), ScreenHelper.WidthToMm(currentPoint.Y));
2021-07-23 09:42:22 +08:00
var point = CursorPointManager.GetCursorPosition();
_viewModel.CurrentColor = ColorPickerManager.GetColor(point.X, point.Y);
2023-05-02 14:28:51 +08:00
//移动
2021-07-23 09:42:22 +08:00
if (_service.DrawModeViewModel.CursorMode == CursorMode.Move)
{
2023-01-26 20:05:21 +08:00
_viewModel.SelectedItems.OfType<DesignerItemViewModelBase>().ToList().ForEach(p => {
2021-07-23 09:42:22 +08:00
p.Left = currentPoint.X;
p.Top = currentPoint.Y;
});
return;
}
if (SourceConnector != null)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
2023-01-24 17:53:04 +08:00
partialConnection.SinkConnectorInfo = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y);
2023-05-02 14:28:51 +08:00
sinkConnector = HitTesting(currentPoint);
2023-01-26 20:05:21 +08:00
if (EnableSnapping)
{
var nearPort = FindNearPortToAttachTo();
if (nearPort != null || partialConnection.SinkConnectorInfoFully != null)
{
partialConnection.SinkConnectorInfo = nearPort;
}
}
2021-07-23 09:42:22 +08:00
}
}
else
{
// if mouse button is not pressed we have no drag operation, ...
2023-05-02 14:28:51 +08:00
if (e.LeftButton != MouseButtonState.Pressed)
2021-07-23 09:42:22 +08:00
rubberbandSelectionStartPoint = null;
// ... but if mouse button is pressed and start
// point value is set we do have one
if (this.rubberbandSelectionStartPoint.HasValue)
{
// create rubberband adorner
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this);
if (adornerLayer != null)
{
RubberbandAdorner adorner = new RubberbandAdorner(this, rubberbandSelectionStartPoint);
if (adorner != null)
{
adornerLayer.Add(adorner);
}
}
}
2021-07-23 09:42:22 +08:00
}
e.Handled = true;
2021-07-23 09:42:22 +08:00
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
2022-12-04 23:07:20 +08:00
if (_viewModel.IsReadOnly) return;
2021-07-23 09:42:22 +08:00
Mediator.Instance.NotifyColleagues<bool>("DoneDrawingMessage", true);
if (sourceConnector != null)
{
2023-05-03 09:59:46 +08:00
ConnectorInfoBase sourceDataItem = sourceConnector.Info;
2023-05-02 14:28:51 +08:00
if (sinkConnector != null)
2021-07-23 09:42:22 +08:00
{
2023-05-03 09:59:46 +08:00
ConnectorInfoBase sinkDataItem = sinkConnector.Info;
2023-05-02 14:28:51 +08:00
2023-05-03 09:59:46 +08:00
_viewModel.Remove(partialConnection);
_viewModel.AddItemCommand.Execute(new ConnectionViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode));
2023-01-26 20:05:21 +08:00
}
else if (partialConnection.IsFullConnection)//自动连接模式
2023-01-26 20:05:21 +08:00
{
2023-01-27 14:54:03 +08:00
partialConnection.RaiseFullConnection();
2021-07-23 09:42:22 +08:00
}
2023-05-03 09:59:46 +08:00
else if (_service.DrawModeViewModel.LineDrawModeSelected)
{
Point currentPoint = e.GetPosition(this);
ConnectorInfoBase sinkDataItem = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y);
_viewModel.Remove(partialConnection);
_viewModel.AddItemCommand.Execute(new ConnectionViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode));
}
2021-07-23 09:42:22 +08:00
else
{
//Need to remove last item as we did not finish drawing the path
2023-05-03 09:59:46 +08:00
_viewModel.Remove(partialConnection);
2021-07-23 09:42:22 +08:00
}
}
2023-01-26 20:05:21 +08:00
2021-07-23 09:42:22 +08:00
sourceConnector = null;
2023-05-02 14:28:51 +08:00
sinkConnector = null;
2023-05-03 09:59:46 +08:00
partialConnection = null;
2021-07-23 09:42:22 +08:00
if (_service.DrawModeViewModel.GetDrawMode() != DrawMode.DirectLine)
{
_service.DrawModeViewModel.ResetDrawMode();
}
2023-03-12 15:26:58 +08:00
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (_viewModel.IsReadOnly) return;
e.Handled = _viewModel.ExecuteShortcut(e);
}
protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
{
base.OnPreviewMouseWheel(e);
if (Keyboard.IsKeyDown(Key.LeftCtrl) == false
&& Keyboard.IsKeyDown(Key.RightCtrl) == false)
{
return;
}
var newZoomValue = _viewModel.ZoomValue + (e.Delta > 0 ? 0.1 : -0.1);
_viewModel.ZoomValue = Math.Max(Math.Min(newZoomValue, _viewModel.MaximumZoomValue), _viewModel.MinimumZoomValue);
e.Handled = true;
}
2021-07-23 09:42:22 +08:00
protected override Size MeasureOverride(Size constraint)
{
Size size = new Size();
foreach (UIElement element in this.InternalChildren)
{
double left = Canvas.GetLeft(element);
double top = Canvas.GetTop(element);
left = double.IsNaN(left) ? 0 : left;
top = double.IsNaN(top) ? 0 : top;
//measure desired size for each child
element.Measure(constraint);
Size desiredSize = element.DesiredSize;
if (!double.IsNaN(desiredSize.Width) && !double.IsNaN(desiredSize.Height))
{
size.Width = Math.Max(size.Width, left + desiredSize.Width);
size.Height = Math.Max(size.Height, top + desiredSize.Height);
}
}
// add margin
size.Width += 10;
size.Height += 10;
return size;
}
2023-05-02 14:28:51 +08:00
private Connector HitTesting(Point hitPoint)
2021-07-23 09:42:22 +08:00
{
DependencyObject hitObject = this.InputHitTest(hitPoint) as DependencyObject;
while (hitObject != null &&
hitObject.GetType() != typeof(DesignerCanvas))
{
if (hitObject is Connector connector)
2021-07-23 09:42:22 +08:00
{
2023-05-03 09:59:46 +08:00
return connector;
2021-07-23 09:42:22 +08:00
}
hitObject = VisualTreeHelper.GetParent(hitObject);
}
2023-05-02 14:28:51 +08:00
return null;
2021-07-23 09:42:22 +08:00
}
protected override void OnDrop(DragEventArgs e)
{
base.OnDrop(e);
2022-12-04 23:07:20 +08:00
if (_viewModel.IsReadOnly) return;
2022-12-04 23:07:20 +08:00
2021-07-23 09:42:22 +08:00
DragObject dragObject = e.Data.GetData(typeof(DragObject)) as DragObject;
if (dragObject != null)
{
2023-04-08 21:48:43 +08:00
_viewModel.ClearSelectedItems();
Point position = e.GetPosition(this);
2023-02-03 22:25:03 +08:00
if (dragObject.DesignerItem is SerializableObject serializableObject)
2021-07-23 09:42:22 +08:00
{
2023-02-03 22:25:03 +08:00
var designerItems = serializableObject.ToObject();
2023-02-03 22:36:08 +08:00
var minleft = designerItems.OfType<DesignerItemViewModelBase>().Min(p => p.Left);
var mintop = designerItems.OfType<DesignerItemViewModelBase>().Min(p => p.Top);
var maxright = designerItems.OfType<DesignerItemViewModelBase>().Max(p => p.Left + p.ItemWidth);
var maxbottom = designerItems.OfType<DesignerItemViewModelBase>().Max(p => p.Top + p.ItemHeight);
var itemswidth = maxright - minleft;
var itemsheight = maxbottom - mintop;
foreach (var item in designerItems.OfType<DesignerItemViewModelBase>())
{
2023-02-03 22:36:08 +08:00
item.Left += position.X - itemswidth / 2;
item.Top += position.Y - itemsheight / 2;
}
_viewModel.AddItemCommand.Execute(designerItems);
2021-07-23 09:42:22 +08:00
}
else
{
DesignerItemViewModelBase itemBase = null;
if (dragObject.DesignerItem is DesignerItemBase)
{
itemBase = Activator.CreateInstance(dragObject.ContentType, _viewModel, dragObject.DesignerItem) as DesignerItemViewModelBase;
}
else
2022-12-04 23:07:20 +08:00
{
itemBase = Activator.CreateInstance(dragObject.ContentType) as DesignerItemViewModelBase;
itemBase.Icon = dragObject.Icon;
itemBase.ColorViewModel = CopyHelper.Mapper(dragObject.ColorViewModel);
if (dragObject.DesiredSize != null)
{
itemBase.ItemWidth = dragObject.DesiredSize.Value.Width;
itemBase.ItemHeight = dragObject.DesiredSize.Value.Height;
}
2022-12-04 23:07:20 +08:00
}
itemBase.Left = Math.Max(0, position.X - itemBase.ItemWidth / 2);
itemBase.Top = Math.Max(0, position.Y - itemBase.ItemHeight / 2);
_viewModel.AddItemCommand.Execute(itemBase);
2021-07-23 09:42:22 +08:00
}
}
var dragFile = e.Data.GetData(DataFormats.FileDrop);
if (dragFile != null && dragFile is string[] files)
{
foreach (var file in files)
{
2023-04-08 21:48:43 +08:00
_viewModel.ClearSelectedItems();
2021-07-23 09:42:22 +08:00
Point position = e.GetPosition(this);
ImageItemViewModel itemBase = new ImageItemViewModel();
itemBase.Icon = file;
itemBase.Suffix = System.IO.Path.GetExtension(itemBase.Icon).ToLower();
itemBase.InitWidthAndHeight();
itemBase.AutoSize();
2023-01-26 20:05:21 +08:00
2021-07-23 09:42:22 +08:00
itemBase.Left = Math.Max(0, position.X - itemBase.ItemWidth / 2);
itemBase.Top = Math.Max(0, position.Y - itemBase.ItemHeight / 2);
2023-01-29 22:54:06 +08:00
_viewModel.AddItemCommand.Execute(itemBase);
2021-07-23 09:42:22 +08:00
}
}
2023-04-05 08:57:31 +08:00
e.Handled = true;
this.Focus();
2021-07-23 09:42:22 +08:00
}
2023-01-26 20:05:21 +08:00
#region
private FullyCreatedConnectorInfo FindNearPortToAttachTo()
2023-01-26 20:05:21 +08:00
{
foreach (var port in _viewModel.Items.OfType<DesignerItemViewModelBase>().ToList().SelectMany(n => n.Connectors))
{
if (partialConnection.OnGoingPosition.DistanceTo(port.Position) < SnappingRadius &&
2023-05-03 09:59:46 +08:00
partialConnection.SourceConnectorInfoFully?.CanAttachTo(port) == true)
2023-01-26 20:05:21 +08:00
return port;
}
return null;
}
#endregion
2021-07-23 09:42:22 +08:00
}
2023-01-26 20:05:21 +08:00
}