public void OnConnectionDragging(Point currentDragPoint, ConnectionViewModel connection)
        {
            // If current drag point is close to an input connector, show its snapped position.
            ConnectorViewModel nearbyConnector = null;

            if (connectingTo)
            {
                nearbyConnector = FindNearbyInputConnector(connection, currentDragPoint);
            }
            else
            {
                nearbyConnector = FindNearbyOutputConnector(connection, currentDragPoint);
            }

            Point pnt = (nearbyConnector != null)
                    ? nearbyConnector.Position
                    : currentDragPoint;

            if (connectingTo)
            {
                connection.ToPosition = pnt;
            }
            else
            {
                connection.FromPosition = pnt;
            }
        }
        public ConnectionViewModel OnConnectionDragStarted(ConnectorViewModel sourceConnector, Point currentDragPoint)
        {
            if (sourceConnector is OutputConnectorViewModel)
            {
                connectingTo = true;
                var connection = new ConnectionViewModel((OutputConnectorViewModel)sourceConnector)
                {
                    ToPosition = currentDragPoint
                };

                Connections.Add(connection);

                return(connection);
            }

            else if (sourceConnector is InputConnectorViewModel)
            {
                connectingTo = false;
                var connection = new ConnectionViewModel((InputConnectorViewModel)sourceConnector)
                {
                    FromPosition = currentDragPoint
                };

                Connections.Add(connection);

                return(connection);
            }
            return(null);
        }
 private OutputConnectorViewModel FindNearbyOutputConnector(ConnectionViewModel connection, Point mousePosition)
 {
     return(Elements.SelectMany(x => x.OutputConnectors)
            .FirstOrDefault(x => AreClose(x.Position, mousePosition, 10)));
 }
        public void OnConnectionDragCompleted(Point currentDragPoint, ConnectionViewModel newConnection, ConnectorViewModel sourceConnector)
        {
            var fromNewConnection = (QuestViewModel)(newConnection.From?.Element);
            var toNewConnection   = (QuestViewModel)(newConnection.To?.Element);

            newConnection.Detach();
            Connections.Remove(newConnection);

            CurrentDragPoint = currentDragPoint;
            if (connectingTo)
            {
                var nearbyConnector = FindNearbyInputConnector(newConnection, currentDragPoint);

                if (nearbyConnector == null)
                {
                    var quest = picker.ChooseQuest();
                    if (quest == null)
                    {
                        return;
                    }
                    var q = new Quest(quest.Id, quest.Title);
                    UseCurrentDragPoint = true;
                    bool added = quests.AddQuest(q);
                    UseCurrentDragPoint = false;
                    if (added)
                    {
                        q.RequiredQuests.Add(fromNewConnection.quest);
                    }
                    return;
                }

                if (nearbyConnector == null || sourceConnector.Element == nearbyConnector.Element)
                {
                    return;
                }

                var to   = ((QuestViewModel)nearbyConnector.Element).quest;
                var from = fromNewConnection.quest;
                to.RequiredQuests.Add(from);
            }
            else
            {
                var nearbyConnector = FindNearbyOutputConnector(newConnection, currentDragPoint);

                if (nearbyConnector == null)
                {
                    var quest = picker.ChooseQuest();
                    if (quest == null)
                    {
                        return;
                    }
                    var q = new Quest(quest.Id, quest.Title);
                    UseCurrentDragPoint = true;
                    bool added = quests.AddQuest(q);
                    UseCurrentDragPoint = false;
                    if (added)
                    {
                        toNewConnection.quest.RequiredQuests.Add(q);
                    }
                    return;
                }

                if (nearbyConnector == null || sourceConnector.Element == nearbyConnector.Element)
                {
                    return;
                }

                var to   = toNewConnection.quest;
                var from = ((QuestViewModel)nearbyConnector.Element).quest;
                to.RequiredQuests.Add(from);
            }
        }