/// <inheritdoc/> public override void ProcessInteraction(DiagramInteractionEventArguments interaction) { var selectedNodes = interaction.Diagram.Nodes.Where(n => n.IsSelected).ToList(); selectedNodes.ForEach(n => n.IsSelected = false); if (interaction.Key == Key.C) { _copiedNodes = selectedNodes.Select(s => s.Model.Copy()).OfType <NodeModel>().ToList(); } else { if (_copiedNodes == null) { return; } var firstCopiedNodeX = _copiedNodes.FirstOrDefault()?.X ?? 0; var firstCopiedNodeY = _copiedNodes.FirstOrDefault()?.Y ?? 0; var nodesToInsertToDiagram = new List <Node>(); foreach (var copiedNode in _copiedNodes) { var node = _nodeProvider.CreateNodeFromModel((NodeModel)copiedNode.Copy()); node.IsSelected = true; var diagramMousePoint = interaction.Diagram.GetDiagramPointFromViewPoint(interaction.MousePosition); node.X -= firstCopiedNodeX - diagramMousePoint.X; node.Y -= firstCopiedNodeY - diagramMousePoint.Y; node.IsSelected = true; nodesToInsertToDiagram.Add(node); interaction.Diagram.AddNode(node); } _transactor.Transact(new UndoCommand(new MapCommand(new UnwireAndDeleteNodeCommand(interaction.Diagram))), nodesToInsertToDiagram); } }
/// <summary> /// Creates a new instance of <see cref="Diagram"/>. /// </summary> /// <param name="diagram">The model.</param> /// <param name="nodeProvider">A node provider to create nodes.</param> /// <param name="diagramInteractors">A list of interactors to enable on this diagram.</param> public Diagram( DiagramModel diagram, INodeProvider nodeProvider, IEnumerable <DiagramInteractor> diagramInteractors) { DiagramInteractionManager = new DiagramInteractionManager(() => diagramInteractors); ExecuteWhenViewLoaded(() => Keyboard.Focus(View)); DiagramModel = diagram; DiagramModel.PropertyChanged += DiagramOnPropertyChanged; if (diagram.Nodes != null) { foreach (var nodeModel in diagram.Nodes) { var viewModel = nodeProvider.CreateNodeFromModel(nodeModel); AddNodeViewModel(viewModel); } } }