void ProcessOthers(PointerInput input) { // Process scrolling if (input.isScrolling && !input.isScrollInertiaInEffect) { if (input.scrollObject == null) { input.scrollObject = ExecuteEvents.ExecuteHierarchy(input.hitObject, input.eventData, ExecuteEvents.scrollHandler); if (input.scrollObject != null) { input.scrollRect = input.scrollObject.GetComponent <UnityEngine.UI.ScrollRect>(); } } else { ExecuteEvents.Execute(input.scrollObject, input.eventData, ExecuteEvents.scrollHandler); } } else if (input.isScrollInertiaInEffect && input.scrollObject != null) { if (input.scrollRect != null) { var vPos = input.scrollRect.verticalNormalizedPosition; if (vPos < 0 || vPos > 1 || Mathf.Approximately(vPos, 0) || Mathf.Approximately(vPos, 1)) { input.isScrollInertiaInEffect = false; input.scrollObject = null; return; } } ExecuteEvents.Execute(input.scrollObject, input.eventData, ExecuteEvents.scrollHandler); } else { input.scrollObject = null; } }
void ProcessDrag(PointerInput input) { var eventData = input.eventData; // Begin dragging if pointer down on an object that has drag handler if (input.buttonDown && input.hitObject != null && eventData.pointerDrag == null) { // Obtain the drag handler if available eventData.pointerDrag = ExecuteEvents.GetEventHandler <IDragHandler>(input.hitObject); } // Begin drag? if (eventData.pointerDrag != null && !eventData.dragging && ShouldBeginDrag(input)) { eventData.dragging = true; ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.beginDragHandler); } // End drag on pointer up if (input.buttonUp && eventData.pointerDrag != null) { if (eventData.dragging) { ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.endDragHandler); eventData.dragging = false; } eventData.pointerDrag = null; } // Send drag event if (eventData.dragging) { ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.dragHandler); } }
void InvokePointerUp(PointerInput input) { ExecuteEvents.Execute(input.eventData.pointerPress, input.eventData, ExecuteEvents.pointerUpHandler); input.eventData.pointerPress = null; }
void ProcessEnterExit(PointerInput input) { var eventData = input.eventData; var pointerHit = input.eventData.pointerCurrentRaycast.gameObject; //we are pointing at a new object (or nothing), so clear the current highlight list ClearHighlights(); //if we are pointing at an object, try adding an object highlight if (pointerHit) { HighlightObject(pointerHit); } // Handle hover enter / exit when the pointerHit differs from previously hovered object if (input.hitObject != pointerHit) { var oldHovered = eventData.hovered; var newHovered = new List <GameObject>(); // Handle pointer enter if (pointerHit != null) { // Get the first event handler and set it as pointerEnter var pointerEnterHandler = ExecuteEvents.GetEventHandler <IPointerEnterHandler>(pointerHit); eventData.pointerEnter = pointerEnterHandler; // Loop through object hierarchy to find all hovered objects with a pointer enter handler while (pointerEnterHandler != null) { // Add handler to the new hovered list newHovered.Add(pointerEnterHandler); // Remove the item from the old list so the pointerExit is not called on it // Invoke pointer enter if haven't done so before if (oldHovered.Exists(x => x.Equals(pointerEnterHandler))) { oldHovered.Remove(pointerEnterHandler); } else { ExecuteEvents.Execute(pointerEnterHandler, eventData, ExecuteEvents.pointerEnterHandler); } // Break if this is the root object var parent = pointerEnterHandler.transform.parent; if (parent == null) { break; } pointerEnterHandler = ExecuteEvents.GetEventHandler <IPointerEnterHandler>(parent.gameObject); } } // Update the hover stack eventData.hovered = newHovered; // Invoke pointer exit on all old objects foreach (var hovered in oldHovered) { ExecuteEvents.Execute(hovered, eventData, ExecuteEvents.pointerExitHandler); } // In the future, selecting object will require passing an availability test // to make sure no other pointer is interacting with the object input.hitObject = pointerHit; } }