protected void HandlePointerExitAndEnter(PointerEventData currentPointerData, GameObject newEnterTarget)
{ /* called in
* StandaloneInputModule
* ProcessTouchPress
* ProcessMousePress
* PointerInputModule
* ProcessMove
* ClearSelection
* sets PointerEventData.pointerEnter
* call OnPointerEnter and/or OnPointerExit depending on what is under the pointer
* OnPointerEnter is called on only the first one that catches raycast
* OnPointerExit is called either on the fist or all of in the stack
* update hovered stack
*/
if (newEnterTarget == null || currentPointerData.pointerEnter == null)
{
for (int i = 0; i < currentPointerData.hovered.Count; i++)
{
ExecuteEvents.Execute <IPointerExitHandler>(currentPointerData.hovered[i], currentPointerData, ExecuteEvents.pointerExitHandler);
}
currentPointerData.hovered.Clear();
if (newEnterTarget == null)
{
currentPointerData.pointerEnter = newEnterTarget;
return;
}
}
/*newEnterTarget != null*/
if (!(currentPointerData.pointerEnter == newEnterTarget) || !newEnterTarget)
/*pointerEnter is something other than newEnter target, or null*/
{
GameObject gameObject = BaseInputModule.FindCommonRoot(currentPointerData.pointerEnter, newEnterTarget);
if (currentPointerData.pointerEnter != null)
{
Transform transform = currentPointerData.pointerEnter.transform;
while (transform != null)
{
if (gameObject != null && gameObject.transform == transform)
{
break;
}
ExecuteEvents.Execute <IPointerExitHandler>(transform.gameObject, currentPointerData, ExecuteEvents.pointerExitHandler);
currentPointerData.hovered.Remove(transform.gameObject);
transform = transform.parent;
}
}
currentPointerData.pointerEnter = newEnterTarget;
if (newEnterTarget != null)
{
Transform transform2 = newEnterTarget.transform;
while (transform2 != null && transform2.gameObject != gameObject)
{
ExecuteEvents.Execute <IPointerEnterHandler>(transform2.gameObject, currentPointerData, ExecuteEvents.pointerEnterHandler);
currentPointerData.hovered.Add(transform2.gameObject);
transform2 = transform2.parent;
}
}
}
}