public void Activate(VisualElement hierarchyParentElement, int hierarchyIndex)
        {
            Reset();

            if (hierarchyParentElement.childCount == 0 || hierarchyParentElement == documentRootElement)
            {
                return;
            }

            var mouseOverElement = hierarchyIndex > -1 && hierarchyIndex < hierarchyParentElement.childCount - 1
                ? hierarchyParentElement.ElementAt(hierarchyIndex)
                : hierarchyParentElement.ElementAt(hierarchyParentElement.childCount - 1);

            var mouseOverElementCanvasRect = BuilderTracker.GetRelativeRectFromTargetElement(mouseOverElement, this.hierarchy.parent);

            var shouldGoLast = hierarchyIndex >= hierarchyParentElement.childCount;
            var isRow        =
                hierarchyParentElement.resolvedStyle.flexDirection == FlexDirection.Row ||
                hierarchyParentElement.resolvedStyle.flexDirection == FlexDirection.RowReverse;
            var reverseOrder =
                hierarchyParentElement.resolvedStyle.flexDirection == FlexDirection.ColumnReverse ||
                hierarchyParentElement.resolvedStyle.flexDirection == FlexDirection.RowReverse;

            if (isRow)
            {
                if (!reverseOrder && !shouldGoLast)
                {
                    style.top    = mouseOverElementCanvasRect.y;
                    style.left   = mouseOverElementCanvasRect.x - k_IndicatorHalfSize;
                    style.width  = k_IndicatorSize;
                    style.height = mouseOverElementCanvasRect.height;
                }
                else if (reverseOrder || shouldGoLast)
                {
                    style.top    = mouseOverElementCanvasRect.y;
                    style.left   = mouseOverElementCanvasRect.xMax - k_IndicatorHalfSize;
                    style.width  = k_IndicatorSize;
                    style.height = mouseOverElementCanvasRect.height;
                }
            }
            else if (!isRow)
            {
                if (!reverseOrder && !shouldGoLast)
                {
                    style.top    = mouseOverElementCanvasRect.y - k_IndicatorHalfSize;
                    style.left   = mouseOverElementCanvasRect.x;
                    style.width  = mouseOverElementCanvasRect.width;
                    style.height = k_IndicatorSize;
                }
                else if (reverseOrder || shouldGoLast)
                {
                    style.top    = mouseOverElementCanvasRect.yMax - k_IndicatorHalfSize;
                    style.left   = mouseOverElementCanvasRect.x;
                    style.width  = mouseOverElementCanvasRect.width;
                    style.height = k_IndicatorSize;
                }
            }
            else
            {
                return;
            }

            style.display = DisplayStyle.Flex;
        }
        public void Activate(VisualElement mouseOverElement, Vector2 mousePosition)
        {
            Reset();

            parentElement = mouseOverElement;

            if (mouseOverElement == documentRootElement)
            {
                return;
            }

            var mouseOverElementMouse      = mouseOverElement.WorldToLocal(mousePosition);
            var mouseOverElementRect       = mouseOverElement.rect;
            var mouseOverElementCanvasRect = BuilderTracker.GetRelativeRectFromTargetElement(mouseOverElement, this.hierarchy.parent);

            var isCloseToLeftEdge   = mouseOverElementMouse.x < k_DistanceFromElementEdge;
            var isCloseToRightEdge  = mouseOverElementMouse.x > mouseOverElementRect.xMax - k_DistanceFromElementEdge;
            var isCloseToTopEdge    = mouseOverElementMouse.y < k_DistanceFromElementEdge;
            var isCloseToBottomEdge = mouseOverElementMouse.y > mouseOverElementRect.yMax - k_DistanceFromElementEdge;

            var reverseOrder =
                mouseOverElement.parent.resolvedStyle.flexDirection == FlexDirection.ColumnReverse ||
                mouseOverElement.parent.resolvedStyle.flexDirection == FlexDirection.RowReverse;

            int indexOffset;

            if (isCloseToLeftEdge)
            {
                style.top    = mouseOverElementCanvasRect.y;
                style.left   = mouseOverElementCanvasRect.x - k_IndicatorHalfSize;
                style.width  = k_IndicatorSize;
                style.height = mouseOverElementCanvasRect.height;
                indexOffset  = reverseOrder ? 1 : 0;
            }
            else if (isCloseToRightEdge)
            {
                style.top    = mouseOverElementCanvasRect.y;
                style.left   = mouseOverElementCanvasRect.xMax - k_IndicatorHalfSize;
                style.width  = k_IndicatorSize;
                style.height = mouseOverElementCanvasRect.height;
                indexOffset  = reverseOrder ? 0 : 1;
            }
            else if (isCloseToTopEdge)
            {
                style.top    = mouseOverElementCanvasRect.y - k_IndicatorHalfSize;
                style.left   = mouseOverElementCanvasRect.x;
                style.width  = mouseOverElementCanvasRect.width;
                style.height = k_IndicatorSize;
                indexOffset  = reverseOrder ? 1 : 0;
            }
            else if (isCloseToBottomEdge)
            {
                style.top    = mouseOverElementCanvasRect.yMax - k_IndicatorHalfSize;
                style.left   = mouseOverElementCanvasRect.x;
                style.width  = mouseOverElementCanvasRect.width;
                style.height = k_IndicatorSize;
                indexOffset  = reverseOrder ? 0 : 1;
            }
            else
            {
                return;
            }

            style.display     = DisplayStyle.Flex;
            parentElement     = mouseOverElement.parent;
            indexWithinParent = parentElement.IndexOf(mouseOverElement) + indexOffset;
        }