static bool WasSelectableDescendantHitByMouse(GraphElement currentTarget, MouseDownEvent evt) { VisualElement targetElement = evt.target as VisualElement; if (targetElement == null || currentTarget == targetElement) { return(false); } VisualElement descendant = targetElement; while (descendant != null && currentTarget != descendant) { GraphElement selectableDescendant = descendant as GraphElement; if (selectableDescendant != null && selectableDescendant.enabledInHierarchy && selectableDescendant.pickingMode != PickingMode.Ignore && selectableDescendant.IsSelectable()) { Vector2 localMousePosition = currentTarget.ChangeCoordinatesTo(descendant, evt.localMousePosition); if (selectableDescendant.HitTest(localMousePosition)) { return(true); } } descendant = descendant.parent; } return(false); }
Rect CalculateElementRect(GraphElement elem) { Rect rect = elem.ChangeCoordinatesTo(graphView.contentViewContainer, elem.GetRect()); rect.x = m_ContentRect.x + ((rect.x - m_ContentRectLocal.x) * m_ContentRect.width / m_ContentRectLocal.width); rect.y = m_ContentRect.y + ((rect.y - m_ContentRectLocal.y) * m_ContentRect.height / m_ContentRectLocal.height); rect.width *= m_ContentRect.width / m_ContentRectLocal.width; rect.height *= m_ContentRect.height / m_ContentRectLocal.height; // Clip using a minimal 2 pixel wide frame around edges // (except yMin since we already have the titleBar offset which is enough for clipping) var xMin = 2; var yMin = windowed ? 2 : 0; var xMax = layout.width - 2; var yMax = layout.height - 2; if (rect.x < xMin) { if (rect.x < xMin - rect.width) { return(new Rect(0, 0, 0, 0)); } rect.width -= xMin - rect.x; rect.x = xMin; } if (rect.x + rect.width >= xMax) { if (rect.x >= xMax) { return(new Rect(0, 0, 0, 0)); } rect.width -= rect.x + rect.width - xMax; } if (rect.y < yMin + titleBarOffset) { if (rect.y < yMin + titleBarOffset - rect.height) { return(new Rect(0, 0, 0, 0)); } rect.height -= yMin + titleBarOffset - rect.y; rect.y = yMin + titleBarOffset; } if (rect.y + rect.height >= yMax) { if (rect.y >= yMax) { return(new Rect(0, 0, 0, 0)); } rect.height -= rect.y + rect.height - yMax; } return(rect); }