protected static void HandlePressExitAndEnter(NRPointerEventData eventData, GameObject newEnterTarget) { if (eventData.pressEnter == newEnterTarget) { return; } var oldTarget = eventData.pressEnter == null ? null : eventData.pressEnter.transform; var newTarget = newEnterTarget == null ? null : newEnterTarget.transform; var commonRoot = default(Transform); for (var t = oldTarget; t != null; t = t.parent) { if (newTarget != null && newTarget.IsChildOf(t)) { commonRoot = t; break; } else { ExecuteEvents.Execute(t.gameObject, eventData, NRExecutePointerEvents.PressExitHandler); } } eventData.pressEnter = newEnterTarget; for (var t = newTarget; t != commonRoot; t = t.parent) { ExecuteEvents.Execute(t.gameObject, eventData, NRExecutePointerEvents.PressEnterHandler); } }
protected void ProcessPressDown(NRPointerEventData eventData) { var currentOverGo = eventData.pointerCurrentRaycast.gameObject; eventData.pressPrecessed = true; eventData.eligibleForClick = true; eventData.delta = Vector2.zero; eventData.dragging = false; eventData.useDragThreshold = true; eventData.pressPosition = eventData.position; eventData.pressPosition3D = eventData.position3D; eventData.pressRotation = eventData.rotation; eventData.pressDistance = eventData.pointerCurrentRaycast.distance; eventData.pointerPressRaycast = eventData.pointerCurrentRaycast; DeselectIfSelectionChanged(currentOverGo, eventData); var newPressed = ExecuteEvents.ExecuteHierarchy(currentOverGo, eventData, ExecuteEvents.pointerDownHandler); if (newPressed == null) { newPressed = ExecuteEvents.GetEventHandler <IPointerClickHandler>(currentOverGo); } var time = Time.unscaledTime; if (newPressed == eventData.lastPress) { if (eventData.raycaster != null && time < (eventData.clickTime + NRInput.ClickInterval)) { ++eventData.clickCount; } else { eventData.clickCount = 1; } eventData.clickTime = time; } else { eventData.clickCount = 1; } eventData.pointerPress = newPressed; eventData.rawPointerPress = currentOverGo; eventData.clickTime = time; eventData.pointerDrag = ExecuteEvents.GetEventHandler <IDragHandler>(currentOverGo); if (eventData.pointerDrag != null) { ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.initializePotentialDrag); } }
protected bool ShouldStartDrag(NRPointerEventData eventData) { if (!eventData.useDragThreshold || eventData.raycaster == null) { return(true); } var currentPos = eventData.position3D + (eventData.rotation * Vector3.forward) * eventData.pressDistance; var pressPos = eventData.pressPosition3D + (eventData.pressRotation * Vector3.forward) * eventData.pressDistance; var threshold = NRInput.DragThreshold; return((currentPos - pressPos).sqrMagnitude >= threshold * threshold); }
protected virtual void ProcessPress(NRPointerEventData eventData) { if (eventData.GetPress()) { if (!eventData.pressPrecessed) { ProcessPressDown(eventData); } HandlePressExitAndEnter(eventData, eventData.pointerCurrentRaycast.gameObject); } else if (eventData.pressPrecessed) { ProcessPressUp(eventData); HandlePressExitAndEnter(eventData, null); } }
protected void ProcessDrag(NRPointerEventData eventData) { var moving = !Mathf.Approximately(eventData.position3DDelta.sqrMagnitude, 0f) || !Mathf.Approximately(Quaternion.Angle(Quaternion.identity, eventData.rotationDelta), 0f); if (moving && eventData.pointerDrag != null && !eventData.dragging && ShouldStartDrag(eventData)) { ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.beginDragHandler); eventData.dragging = true; } if (eventData.dragging && moving && eventData.pointerDrag != null) { if (eventData.pointerPress != eventData.pointerDrag) { ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerUpHandler); eventData.eligibleForClick = false; eventData.pointerPress = null; eventData.rawPointerPress = null; } ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.dragHandler); } }
protected void ProcessPressUp(NRPointerEventData eventData) { var currentOverGo = eventData.pointerCurrentRaycast.gameObject; ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerUpHandler); var pointerUpHandler = ExecuteEvents.GetEventHandler <IPointerClickHandler>(currentOverGo); if (eventData.pointerPress == pointerUpHandler && eventData.eligibleForClick) { ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerClickHandler); } else if (eventData.pointerDrag != null && eventData.dragging) { ExecuteEvents.ExecuteHierarchy(currentOverGo, eventData, ExecuteEvents.dropHandler); } eventData.pressPrecessed = false; eventData.eligibleForClick = false; eventData.pointerPress = null; eventData.rawPointerPress = null; if (eventData.pointerDrag != null && eventData.dragging) { ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.endDragHandler); } eventData.dragging = false; eventData.pointerDrag = null; if (currentOverGo != eventData.pointerEnter) { HandlePointerExitAndEnter(eventData, null); HandlePointerExitAndEnter(eventData, currentOverGo); } }