Skip to content

Commit

Permalink
Invoke PointerDown for a touch press and release with different finge…
Browse files Browse the repository at this point in the history
…rs in the same frame

Detection of release and press was not being made in the same frame so we only tracked a release.

Also, we need to handle PointerUp events for the right object we actually released.
  • Loading branch information
jfreire-unity committed Oct 18, 2024
1 parent db7b26f commit 3cdee46
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,8 @@ private void ProcessPointerButton(ref PointerModel.ButtonState button, PointerEv
if (currentOverGo != null && PointerShouldIgnoreTransform(currentOverGo.transform))
return;

var pressedAndReleasedInSameFrame = button.wasPressedThisFrame && button.wasReleasedThisFrame;
var cachedPointerPress = eventData.pointerPress;
// Button press.
if (button.wasPressedThisFrame)
{
Expand Down Expand Up @@ -608,7 +610,19 @@ private void ProcessPointerButton(ref PointerModel.ButtonState button, PointerEv
}

// Invoke OnPointerUp.
ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerUpHandler);
// Invoke event only if the cached pointer press is a different object than the one entered.
var invokePointerUpForCachedObject = pressedAndReleasedInSameFrame &&
cachedPointerPress != eventData.pointerEnter &&
cachedPointerPress != null;

if (invokePointerUpForCachedObject)
{
ExecuteEvents.Execute(cachedPointerPress, eventData, ExecuteEvents.pointerUpHandler);
}
else
{
ExecuteEvents.Execute(eventData.pointerPress, eventData, ExecuteEvents.pointerUpHandler);
}

// Invoke OnPointerClick or OnDrop.
if (isClick)
Expand All @@ -623,8 +637,12 @@ private void ProcessPointerButton(ref PointerModel.ButtonState button, PointerEv
ExecuteEvents.ExecuteHierarchy(currentOverGo, eventData, ExecuteEvents.dropHandler);

eventData.eligibleForClick = false;
eventData.pointerPress = null;
eventData.rawPointerPress = null;

if (!invokePointerUpForCachedObject)
{
eventData.pointerPress = null;
eventData.rawPointerPress = null;
}

if (eventData.dragging && eventData.pointerDrag != null)
ExecuteEvents.Execute(eventData.pointerDrag, eventData, ExecuteEvents.endDragHandler);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,12 +208,11 @@ public bool isPressed
if (m_IsPressed != value)
{
m_IsPressed = value;

if (m_FramePressState == PointerEventData.FramePressState.NotChanged && value)
m_FramePressState = PointerEventData.FramePressState.Pressed;
else if (m_FramePressState == PointerEventData.FramePressState.NotChanged && !value)
m_FramePressState = PointerEventData.FramePressState.Released;
else if (m_FramePressState == PointerEventData.FramePressState.Pressed && !value)
else if (m_FramePressState == PointerEventData.FramePressState.Pressed && !value || m_FramePressState == PointerEventData.FramePressState.Released && value)
m_FramePressState = PointerEventData.FramePressState.PressedAndReleased;
}
}
Expand Down

0 comments on commit 3cdee46

Please sign in to comment.