private void DrawHeldConnection()
        {
            if (!IsDraggingPort)
            {
                return;
            }

            Color   color = NodePreferences.CONNECTION_PORT_COLOR;
            Vector2 start, end;

            color.a *= 0.6f;

            Vector2 portPosition  = NodeEditor.FindPortRect(DraggedPort).center;// + node.Position;
            Vector2 mousePosition = _mousePosition;

            //mousePosition = WindowToGridPosition(mousePosition);
            //portPosition = GridToWindowPosition(portPosition);
            mousePosition = WindowToWindowPositionNotClipped(mousePosition);
            portPosition  = GridToWindowPositionNotClipped(portPosition);

            if (DraggedPort is InputPort)
            {
                start = mousePosition;
                end   = portPosition;
            }
            else
            {
                start = portPosition;
                end   = mousePosition;
            }

            NodeRendering.DrawConnection(start, end, color, NodePreferences.CONNECTION_WIDTH / Zoom);
        }
        private void DrawConnections()
        {
            //return;
            for (int i = 0; i < Graph.ConnectionCount; i++)
            {
                Connection connection = Graph.GetConnection(i);

                if (connection == null || connection.End == null || connection.Start == null ||
                    connection.End.Node == null || connection.Start.Node == null)
                {
                    Debug.LogWarning("F****d up connection. Removing.");
                    Graph.RemoveConnection(connection);
                    continue;
                }

                Vector2 end         = NodeEditor.FindPortRect(connection.End).center;   // + node.Position;
                Vector2 windowEnd   = GridToWindowPositionNotClipped(end);
                Vector2 start       = NodeEditor.FindPortRect(connection.Start).center; // + output.Node.Position;
                Vector2 windowStart = GridToWindowPositionNotClipped(start);

                if (Selection.Contains(connection))
                {
                    NodeRendering.DrawConnection(windowStart, windowEnd, Color.green,
                                                 NodePreferences.CONNECTION_WIDTH / Zoom * 2, false);
                }

                NodeRendering.DrawConnection(windowStart, windowEnd,
                                             NodePreferences.CONNECTION_PORT_COLOR, NodePreferences.CONNECTION_WIDTH / Zoom);
                DrawConnectionModifiers((start + end) / 2, connection);
            }

            //for (int i = 0; i < _graph.NodeCount; i++)
            //{
            //    Node node = _graph.GetNode(i);
            //    IInput inputNode = node as IInput;
            //    InputPort input = inputNode != null ? inputNode.InputPort : null;
            //    if (input == null) continue;

            //    Vector2 end = NodeEditor.FindPortRect(input).center;// + node.Position;
            //    Vector2 windowEnd = GridToWindowPositionNotClipped(end);
            //    for (int j = 0; j < input.ConnectionsCount; j++)
            //    {
            //        Connection connection = input.GetConnection(j);
            //        if (connection == null)
            //        {
            //            OnNull(input);
            //            continue;
            //        }

            //        Vector2 start = NodeEditor.FindPortRect(connection.Start).center;// + output.Node.Position;
            //        Vector2 windowStart = GridToWindowPositionNotClipped(start);

            //        NodeRendering.DrawConnection(windowStart, windowEnd,
            //            NodePreferences.CONNECTION_PORT_COLOR, NodePreferences.CONNECTION_WIDTH / Zoom);
            //        DrawConnectionModifiers((start + end) / 2, connection);
            //    }
            //}
        }
        private void CheckHoveringAndSelection()
        {
            if (_isLayoutEvent)
            {
                return;
            }

            ResetHover();

            bool isDraggingGrid = _currentActivity == Activity.DraggingGrid;

            Rect          selectionRect = _selectionRect;
            Vector2       mousePosition = _mousePosition;
            List <Object> boxSelected   = new List <Object>();

            //TODO Investigate reverse recognition not working!?
            //Never mind it works, it's just my architecture works bottom-top,
            //instead of top-bottom-or-stop
            //Why? Cause hovering
            //TODO Investigate alternatives for conversion
            for (int i = 0; i < Graph.NodeCount; i++)
            {
                Node       node       = Graph.GetNode(i);
                NodeEditor nodeEditor = NodeEditor.GetEditor(node);

                Vector2 size;
                if (_nodeSizes.TryGetValue(node, out size))
                {
                    Rect nodeRect = new Rect(node.Position, size);
                    nodeRect = GridToWindowRect(nodeRect);
                    if (nodeRect.Contains(mousePosition))
                    {
                        _hoveredNode = node;
                    }
                    if (isDraggingGrid && nodeRect.Overlaps(selectionRect))
                    {
                        boxSelected.Add(node);
                    }
                }

                //Check hovering over ports
                var inputNode = node as IInput;
                if (inputNode != null)
                {
                    InputPort input     = inputNode.InputPort;
                    Rect      inputRect = nodeEditor.GetPortRect(input);
                    //inputRect.position += node.Position;
                    inputRect = GridToWindowRect(inputRect);
                    if (inputRect.Contains(mousePosition))
                    {
                        HoveredPort = input;
                    }
                }

                IOutput sOutputNode = node as IOutput;
                if (sOutputNode != null)
                {
                    OutputPort output     = sOutputNode.OutputPort;
                    Rect       outputRect = nodeEditor.GetPortRect(output);
                    //outputRect.position += node.Position;
                    outputRect = GridToWindowRect(outputRect);
                    if (outputRect.Contains(mousePosition))
                    {
                        HoveredPort = output;
                    }
                }

                IMultipleOutput mOutputNode = node as IMultipleOutput;
                if (mOutputNode != null)
                {
                    var outputs = mOutputNode.GetOutputs();
                    foreach (OutputPort output in outputs)
                    {
                        Rect outputRect = nodeEditor.GetPortRect(output);
                        //outputRect.position += node.Position;
                        outputRect = GridToWindowRect(outputRect);
                        if (outputRect.Contains(mousePosition))
                        {
                            HoveredPort = output;
                        }
                    }
                }
            }

            for (int i = 0; i < Graph.ConnectionCount; i++)
            {
                Connection connection = Graph.GetConnection(i);
                if (connection == null)
                {
                    Debug.Log("Null connection at index " + i);
                    OnNull(Graph);
                    continue;
                }

                Vector2 start = NodeEditor.FindPortRect(connection.Start).center;
                Vector2 end   = NodeEditor.FindPortRect(connection.End).center;
                start = GridToWindowPosition(start);
                end   = GridToWindowPosition(end);

                //if (OtherUtilities.PointOverlapBezier(mousePosition, start, end, NodePreferences.CONNECTION_WIDTH))
                if (LineSegment.WideLineSegmentPointCheck(mousePosition, start, end, NodePreferences.CONNECTION_WIDTH * 2 / Zoom))
                {
                    _hoveredConnection = connection;
                }

                //DONE: Add range percentage overlap check, as just overlapping might be too annoying.
                if (isDraggingGrid && LineSegment.LineRectOverlapPercentageCheck(selectionRect, start, end) > 0.3f)
                {
                    boxSelected.Add(connection);
                }


                Rect[] modifierRects;
                if (!_connectionModifierRects.TryGetValue(connection, out modifierRects))
                {
                    continue;
                }

                for (int j = 0; j < connection.InstructionCount; j++)
                {
                    Instruction mod  = connection.GetInstruction(j);
                    Rect        rect = GridToWindowRect(modifierRects[j]);
                    if (rect.Contains(mousePosition))
                    {
                        _hoveredInstruction = mod;
                    }
                    if (isDraggingGrid && rect.Overlaps(selectionRect))
                    {
                        boxSelected.Add(mod);
                    }
                }
            }

            //return;
            if (isDraggingGrid)
            {
                if (_cachedEvent.control || _cachedEvent.shift)
                {
                    boxSelected.AddRange(_cachedSelectedObjects);
                }
                Selection.objects = boxSelected.ToArray();
            }
            else
            {
                _selectionRect = Rect.zero;
            }
        }